2002-07-19 03:00:24 +04:00
/*
* 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 0213 9 , 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 "
} ;
2002-07-20 17:23:57 +04:00
2002-07-19 03:00:24 +04:00
/**********************************************************************
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 ;
2002-07-19 22:49:44 +04:00
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 ;
}
2002-07-19 03:00:24 +04:00
2002-07-20 08:27:30 +04:00
p = path + strlen ( KEY_PRINTING ) ;
2002-07-19 03:00:24 +04:00
2002-07-19 22:49:44 +04:00
if ( * p = = ' \\ ' )
p + + ;
2002-07-19 03:00:24 +04:00
if ( * p )
return strdup ( p ) ;
else
return NULL ;
}
/**********************************************************************
2002-07-19 22:49:44 +04:00
handle enumeration of subkeys below KEY_PRINTING \ Environments
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-07-20 08:27:30 +04:00
static int print_subpath_environments ( char * key , REGSUBKEY_CTR * subkeys )
2002-07-19 22:49:44 +04:00
{
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
2002-07-20 17:23:57 +04:00
Really just a stub function , but left here in case it needs to
be expanded later on
2002-07-19 03:00:24 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-07-20 08:27:30 +04:00
static int print_subpath_forms ( char * key , REGSUBKEY_CTR * subkeys )
2002-07-19 22:49:44 +04:00
{
DEBUG ( 10 , ( " print_subpath_forms: key=>[%s] \n " , key ? key : " NULL " ) ) ;
2002-07-20 17:23:57 +04:00
/* there are no subkeys */
if ( key )
return - 1 ;
2002-07-19 22:49:44 +04:00
return 0 ;
}
/**********************************************************************
handle enumeration of values below KEY_PRINTING \ Forms
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-07-20 17:23:57 +04:00
static int print_subpath_values_forms ( char * key , REGVAL_CTR * val )
2002-07-19 22:49:44 +04:00
{
2002-07-20 17:23:57 +04:00
int num_values = 0 ;
2002-07-23 09:07:40 +04:00
uint32 data [ 8 ] ;
int form_index = 1 ;
2002-07-19 22:49:44 +04:00
DEBUG ( 10 , ( " print_values_forms: key=>[%s] \n " , key ? key : " NULL " ) ) ;
/* handle ..\Forms\ */
if ( ! key )
{
2002-07-20 17:23:57 +04:00
nt_forms_struct * forms_list = NULL ;
nt_forms_struct * form = NULL ;
2002-07-19 22:49:44 +04:00
int i ;
2002-07-20 17:23:57 +04:00
if ( ( num_values = get_ntforms ( & forms_list ) ) = = 0 )
2002-07-19 22:49:44 +04:00
return 0 ;
2002-07-20 17:23:57 +04:00
DEBUG ( 10 , ( " print_subpath_values_forms: [%d] user defined forms returned \n " ,
num_values ) ) ;
/* handle user defined forms */
for ( i = 0 ; i < num_values ; i + + )
{
form = & forms_list [ i ] ;
2002-07-23 09:07:40 +04:00
data [ 0 ] = form - > width ;
data [ 1 ] = form - > length ;
data [ 2 ] = form - > left ;
data [ 3 ] = form - > top ;
data [ 4 ] = form - > right ;
data [ 5 ] = form - > bottom ;
data [ 6 ] = form_index + + ;
data [ 7 ] = form - > flag ;
2002-07-20 17:23:57 +04:00
regval_ctr_addvalue ( val , form - > name , REG_BINARY , ( char * ) data , sizeof ( data ) ) ;
2002-07-19 22:49:44 +04:00
}
2002-07-20 17:23:57 +04:00
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 ) ) ;
2002-07-19 22:49:44 +04:00
for ( i = 0 ; i < num_values ; i + + )
{
2002-07-20 17:23:57 +04:00
form = & forms_list [ i ] ;
2002-07-19 22:49:44 +04:00
2002-07-23 09:07:40 +04:00
data [ 0 ] = form - > width ;
data [ 1 ] = form - > length ;
data [ 2 ] = form - > left ;
data [ 3 ] = form - > top ;
data [ 4 ] = form - > right ;
data [ 5 ] = form - > bottom ;
data [ 6 ] = form_index + + ;
data [ 7 ] = form - > flag ;
2002-07-20 17:23:57 +04:00
regval_ctr_addvalue ( val , form - > name , REG_BINARY , ( char * ) data , sizeof ( data ) ) ;
2002-07-19 22:49:44 +04:00
}
2002-07-20 17:23:57 +04:00
SAFE_FREE ( forms_list ) ;
2002-07-19 22:49:44 +04:00
}
return num_values ;
}
/**********************************************************************
handle enumeration of subkeys below KEY_PRINTING \ Printers
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-07-20 08:27:30 +04:00
static int print_subpath_printers ( char * key , REGSUBKEY_CTR * subkeys )
2002-07-19 22:49:44 +04:00
{
2002-07-20 17:23:57 +04:00
int n_services = lp_numservices ( ) ;
2002-07-20 08:27:30 +04:00
int snum ;
fstring sname ;
2002-07-19 22:49:44 +04:00
DEBUG ( 10 , ( " print_subpath_printers: key=>[%s] \n " , key ? key : " NULL " ) ) ;
2002-07-20 08:27:30 +04:00
if ( ! key )
{
/* enumerate all printers */
for ( snum = 0 ; snum < n_services ; snum + + ) {
if ( ! ( lp_snum_ok ( snum ) & & lp_print_ok ( snum ) ) )
continue ;
fstrcpy ( sname , lp_servicename ( snum ) ) ;
regsubkey_ctr_addkey ( subkeys , sname ) ;
}
}
else
{
/* get information for a specific printer */
}
return regsubkey_ctr_numkeys ( subkeys ) ;
2002-07-19 22:49:44 +04:00
}
/**********************************************************************
Routine to handle enumeration of subkeys and values
below KEY_PRINTING ( depending on whether or not subkeys / val are
valid pointers .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-07-20 08:27:30 +04:00
static int handle_printing_subpath ( char * key , REGSUBKEY_CTR * subkeys , REGVAL_CTR * val )
2002-07-19 03:00:24 +04:00
{
int result = 0 ;
char * p , * base ;
int i ;
2002-07-19 22:49:44 +04:00
2002-07-20 08:27:30 +04:00
DEBUG ( 10 , ( " handle_printing_subpath: key=>[%s] \n " , key ) ) ;
2002-07-19 03:00:24 +04:00
/*
* break off the first part of the path
* topmost base * * must * * be one of the strings
* in top_level_keys [ ]
*/
2002-07-19 22:49:44 +04:00
reg_split_path ( key , & base , & p ) ;
2002-07-19 03:00:24 +04:00
for ( i = 0 ; i < MAX_TOP_LEVEL_KEYS ; i + + ) {
if ( StrCaseCmp ( top_level_keys [ i ] , base ) = = 0 )
break ;
}
2002-07-19 22:49:44 +04:00
DEBUG ( 10 , ( " handle_printing_subpath: base=>[%s], i==[%d] \n " , base , i ) ) ;
2002-07-20 08:27:30 +04:00
if ( ! ( i < MAX_TOP_LEVEL_KEYS ) )
2002-07-19 03:00:24 +04:00
return - 1 ;
2002-07-20 17:23:57 +04:00
2002-07-19 03:00:24 +04:00
/* Call routine to handle each top level key */
switch ( i )
{
case KEY_INDEX_ENVIR :
2002-07-19 22:49:44 +04:00
if ( subkeys )
2002-07-20 08:27:30 +04:00
print_subpath_environments ( p , subkeys ) ;
2002-07-19 03:00:24 +04:00
break ;
case KEY_INDEX_FORMS :
2002-07-20 17:23:57 +04:00
if ( subkeys )
print_subpath_forms ( p , subkeys ) ;
if ( val )
print_subpath_values_forms ( p , val ) ;
2002-07-19 03:00:24 +04:00
break ;
case KEY_INDEX_PRINTER :
2002-07-20 17:23:57 +04:00
if ( subkeys )
print_subpath_printers ( p , subkeys ) ;
2002-07-19 03:00:24 +04:00
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
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-07-19 22:49:44 +04:00
int printing_subkey_info ( char * key , REGSUBKEY_CTR * subkey_ctr )
2002-07-19 03:00:24 +04:00
{
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 ) {
2002-07-19 22:49:44 +04:00
for ( num_subkeys = 0 ; num_subkeys < MAX_TOP_LEVEL_KEYS ; num_subkeys + + )
regsubkey_ctr_addkey ( subkey_ctr , top_level_keys [ num_subkeys ] ) ;
2002-07-19 03:00:24 +04:00
}
else
2002-07-20 08:27:30 +04:00
num_subkeys = handle_printing_subpath ( path , subkey_ctr , NULL ) ;
2002-07-19 03:00:24 +04:00
SAFE_FREE ( path ) ;
2002-07-19 22:49:44 +04:00
2002-07-19 03:00:24 +04:00
return num_subkeys ;
}
/**********************************************************************
2002-07-19 22:49:44 +04:00
Enumerate registry values given a registry path .
Caller is responsible for freeing memory
2002-07-19 03:00:24 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-07-19 22:49:44 +04:00
int printing_value_info ( char * key , REGVAL_CTR * val )
2002-07-19 03:00:24 +04:00
{
char * path ;
BOOL top_level = False ;
2002-07-19 22:49:44 +04:00
int num_values = 0 ;
2002-07-19 03:00:24 +04:00
2002-07-19 22:49:44 +04:00
DEBUG ( 10 , ( " printing_value_info: key=>[%s] \n " , key ) ) ;
2002-07-19 03:00:24 +04:00
path = trim_reg_path ( key ) ;
/* check to see if we are dealing with the top level key */
if ( ! path )
top_level = True ;
2002-07-19 22:49:44 +04:00
/* fill in values from the getprinterdata_printer_server() */
if ( top_level )
num_values = 0 ;
else
2002-07-20 08:27:30 +04:00
num_values = handle_printing_subpath ( path , NULL , val ) ;
2002-07-19 22:49:44 +04:00
2002-07-19 03:00:24 +04:00
2002-07-19 22:49:44 +04:00
return num_values ;
2002-07-19 03:00:24 +04:00
}
/**********************************************************************
Stub function which always returns failure since we don ' t want
people storing printing information directly via regostry calls
( for now at least )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-07-19 22:49:44 +04:00
BOOL printing_store_subkey ( char * key , REGSUBKEY_CTR * subkeys )
2002-07-19 03:00:24 +04:00
{
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 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-07-19 22:49:44 +04:00
BOOL printing_store_value ( char * key , REGVAL_CTR * val )
2002-07-19 03:00:24 +04:00
{
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
} ;
2002-07-19 22:49:44 +04:00