/* * Unix SMB/CIFS implementation. * RPC Pipe client / server routines * Copyright (C) Gerald Carter 2002. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Implementation of registry virtual views for printing information */ #include "includes.h" #undef DBGC_CLASS #define DBGC_CLASS DBGC_RPC_SRV #define MAX_TOP_LEVEL_KEYS 3 /* some symbolic indexes into the top_level_keys */ #define KEY_INDEX_ENVIR 0 #define KEY_INDEX_FORMS 1 #define KEY_INDEX_PRINTER 2 static char *top_level_keys[MAX_TOP_LEVEL_KEYS] = { "Environments", "Forms", "Printers" }; /********************************************************************** It is safe to assume that every registry path passed into on of the exported functions here begins with KEY_PRINTING else these functions would have never been called. This is a small utility function to strip the beginning of the path and make a copy that the caller can modify. Note that the caller is responsible for releasing the memory allocated here. **********************************************************************/ static char* trim_reg_path( char *path ) { char *p; uint16 key_len = strlen(KEY_PRINTING); /* * sanity check...this really should never be True. * It is only here to prevent us from accessing outside * the path buffer in the extreme case. */ if ( strlen(path) < key_len ) { DEBUG(0,("trim_reg_path: Registry path too short! [%s]\n", path)); DEBUG(0,("trim_reg_path: KEY_PRINTING => [%s]!\n", KEY_PRINTING)); return NULL; } p = path + strlen( KEY_PRINTING ); if ( *p == '\\' ) p++; if ( *p ) return strdup(p); else return NULL; } /********************************************************************** handle enumeration of subkeys below KEY_PRINTING\Environments *********************************************************************/ static int print_subpath_environments( char *key, REGSUBKEY_CTR *subkeys ) { DEBUG(10,("print_subpath_environments: key=>[%s]\n", key ? key : "NULL" )); if ( !key ) { /* listed architectures of installed drivers */ } return 0; } /********************************************************************** handle enumeration of subkeys below KEY_PRINTING\Forms Really just a stub function, but left here in case it needs to be expanded later on *********************************************************************/ static int print_subpath_forms( char *key, REGSUBKEY_CTR *subkeys ) { DEBUG(10,("print_subpath_forms: key=>[%s]\n", key ? key : "NULL" )); /* there are no subkeys */ if ( key ) return -1; return 0; } /********************************************************************** handle enumeration of values below KEY_PRINTING\Forms *********************************************************************/ static int print_subpath_values_forms( char *key, REGVAL_CTR *val ) { int num_values = 0; uint32 data[7]; DEBUG(10,("print_values_forms: key=>[%s]\n", key ? key : "NULL" )); /* handle ..\Forms\ */ if ( !key ) { nt_forms_struct *forms_list = NULL; nt_forms_struct *form = NULL; int i; if ( (num_values = get_ntforms( &forms_list )) == 0 ) return 0; DEBUG(10,("print_subpath_values_forms: [%d] user defined forms returned\n", num_values)); /* handle user defined forms */ for ( i=0; iflag; data[1] = form->width; data[2] = form->length; data[3] = form->left; data[4] = form->top; data[5] = form->right; data[6] = form->bottom; regval_ctr_addvalue( val, form->name, REG_BINARY, (char*)data, sizeof(data) ); } SAFE_FREE( forms_list ); forms_list = NULL; /* handle built-on forms */ if ( (num_values = get_builtin_ntforms( &forms_list )) == 0 ) return 0; DEBUG(10,("print_subpath_values_forms: [%d] built-in forms returned\n", num_values)); for ( i=0; iflag; data[1] = form->width; data[2] = form->length; data[3] = form->left; data[4] = form->top; data[5] = form->right; data[6] = form->bottom; regval_ctr_addvalue( val, form->name, REG_BINARY, (char*)data, sizeof(data) ); } SAFE_FREE( forms_list ); } return num_values; } /********************************************************************** handle enumeration of subkeys below KEY_PRINTING\Printers *********************************************************************/ static int print_subpath_printers( char *key, REGSUBKEY_CTR *subkeys ) { int n_services = lp_numservices(); int snum; fstring sname; DEBUG(10,("print_subpath_printers: key=>[%s]\n", key ? key : "NULL" )); if ( !key ) { /* enumerate all printers */ for (snum=0; snum[%s]\n", key )); /* * break off the first part of the path * topmost base **must** be one of the strings * in top_level_keys[] */ reg_split_path( key, &base, &p); for ( i=0; i[%s], i==[%d]\n", base, i)); if ( !(i < MAX_TOP_LEVEL_KEYS) ) return -1; /* Call routine to handle each top level key */ switch ( i ) { case KEY_INDEX_ENVIR: if ( subkeys ) print_subpath_environments( p, subkeys ); break; case KEY_INDEX_FORMS: if ( subkeys ) print_subpath_forms( p, subkeys ); if ( val ) print_subpath_values_forms( p, val ); break; case KEY_INDEX_PRINTER: if ( subkeys ) print_subpath_printers( p, subkeys ); break; /* default case for top level key that has no handler */ default: break; } return result; } /********************************************************************** Enumerate registry subkey names given a registry path. Caller is responsible for freeing memory to **subkeys *********************************************************************/ int printing_subkey_info( char *key, REGSUBKEY_CTR *subkey_ctr ) { char *path; BOOL top_level = False; int num_subkeys = 0; DEBUG(10,("printing_subkey_info: key=>[%s]\n", key)); path = trim_reg_path( key ); /* check to see if we are dealing with the top level key */ if ( !path ) top_level = True; if ( top_level ) { for ( num_subkeys=0; num_subkeys[%s]\n", key)); path = trim_reg_path( key ); /* check to see if we are dealing with the top level key */ if ( !path ) top_level = True; /* fill in values from the getprinterdata_printer_server() */ if ( top_level ) num_values = 0; else num_values = handle_printing_subpath( path, NULL, val ); return num_values; } /********************************************************************** Stub function which always returns failure since we don't want people storing printing information directly via regostry calls (for now at least) *********************************************************************/ BOOL printing_store_subkey( char *key, REGSUBKEY_CTR *subkeys ) { return False; } /********************************************************************** Stub function which always returns failure since we don't want people storing printing information directly via regostry calls (for now at least) *********************************************************************/ BOOL printing_store_value( char *key, REGVAL_CTR *val ) { return False; } /* * Table of function pointers for accessing printing data */ REGISTRY_OPS printing_ops = { printing_subkey_info, printing_value_info, printing_store_subkey, printing_store_value };