summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2004-04-10 22:37:47 +0000
committerGerald Carter <jerry@samba.org>2004-04-10 22:37:47 +0000
commitc9b186f40d41bfe757e96049d9227260995507ed (patch)
tree42ef1cf2cc81de0705e089ad5b5469fd60f7cdec
parent9c845f07e1161aba74ec4a80b18d865b31fa7df4 (diff)
downloadsamba-c9b186f40d41bfe757e96049d9227260995507ed.tar.gz
r155: real for for BUG 761 -- allow printing parameter to set defaults on a per share basis
-rw-r--r--source/include/smb.h2
-rw-r--r--source/param/loadparm.c134
2 files changed, 86 insertions, 50 deletions
diff --git a/source/include/smb.h b/source/include/smb.h
index 5d306be0624..7ed284896df 100644
--- a/source/include/smb.h
+++ b/source/include/smb.h
@@ -704,7 +704,7 @@ struct parm_struct
parm_type type;
parm_class class;
void *ptr;
- BOOL (*special)(const char *, char **);
+ BOOL (*special)(int snum, const char *, char **);
const struct enum_list *enum_list;
unsigned flags;
union {
diff --git a/source/param/loadparm.c b/source/param/loadparm.c
index 894e7ecc9c1..061af12494a 100644
--- a/source/param/loadparm.c
+++ b/source/param/loadparm.c
@@ -556,18 +556,18 @@ static int default_server_announce;
#define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
/* prototypes for the special type handlers */
-static BOOL handle_include(const char *pszParmValue, char **ptr);
-static BOOL handle_copy(const char *pszParmValue, char **ptr);
-static BOOL handle_netbios_name(const char *pszParmValue, char **ptr);
-static BOOL handle_idmap_uid(const char *pszParmValue, char **ptr);
-static BOOL handle_idmap_gid(const char *pszParmValue, char **ptr);
-static BOOL handle_debug_list( const char *pszParmValue, char **ptr );
-static BOOL handle_workgroup( const char *pszParmValue, char **ptr );
-static BOOL handle_netbios_aliases( const char *pszParmValue, char **ptr );
-static BOOL handle_netbios_scope( const char *pszParmValue, char **ptr );
-static BOOL handle_charset( const char *pszParmValue, char **ptr );
-
-static BOOL handle_acl_compatibility(const char *pszParmValue, char **ptr);
+static BOOL handle_include( int snum, const char *pszParmValue, char **ptr);
+static BOOL handle_copy( int snum, const char *pszParmValue, char **ptr);
+static BOOL handle_netbios_name( int snum, const char *pszParmValue, char **ptr);
+static BOOL handle_idmap_uid( int snum, const char *pszParmValue, char **ptr);
+static BOOL handle_idmap_gid( int snum, const char *pszParmValue, char **ptr);
+static BOOL handle_debug_list( int snum, const char *pszParmValue, char **ptr );
+static BOOL handle_workgroup( int snum, const char *pszParmValue, char **ptr );
+static BOOL handle_netbios_aliases( int snum, const char *pszParmValue, char **ptr );
+static BOOL handle_netbios_scope( int snum, const char *pszParmValue, char **ptr );
+static BOOL handle_charset( int snum, const char *pszParmValue, char **ptr );
+static BOOL handle_acl_compatibility( int snum, const char *pszParmValue, char **ptr);
+static BOOL handle_printing( int snum, const char *pszParmValue, char **ptr);
static void set_server_role(void);
static void set_default_server_announce_type(void);
@@ -951,7 +951,7 @@ static struct parm_struct parm_table[] = {
{"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_HIDE},
{"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT},
{"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_HIDE},
- {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
+ {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, handle_printing, enum_printing, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
{"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
{"disable spoolss", P_BOOL, P_GLOBAL, &Globals.bDisableSpoolss, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
{"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
@@ -1180,11 +1180,6 @@ static struct parm_struct parm_table[] = {
static void init_printer_values(service *pService)
{
- if ( pService == NULL ) {
- DEBUG(0,("init_printer_values: NULL pointer\n"));
- return;
- }
-
/* choose defaults depending on the type of printing */
switch (pService->iPrinting) {
case PRINT_BSD:
@@ -2708,7 +2703,7 @@ BOOL lp_file_list_changed(void)
Note: We must *NOT* use string_set() here as ptr points to global_myname.
***************************************************************************/
-static BOOL handle_netbios_name(const char *pszParmValue, char **ptr)
+static BOOL handle_netbios_name(int snum, const char *pszParmValue, char **ptr)
{
BOOL ret;
pstring netbios_name;
@@ -2726,7 +2721,7 @@ static BOOL handle_netbios_name(const char *pszParmValue, char **ptr)
return ret;
}
-static BOOL handle_charset(const char *pszParmValue, char **ptr)
+static BOOL handle_charset(int snum, const char *pszParmValue, char **ptr)
{
if (strcmp(*ptr, pszParmValue) != 0) {
string_set(ptr, pszParmValue);
@@ -2735,7 +2730,7 @@ static BOOL handle_charset(const char *pszParmValue, char **ptr)
return True;
}
-static BOOL handle_workgroup(const char *pszParmValue, char **ptr)
+static BOOL handle_workgroup(int snum, const char *pszParmValue, char **ptr)
{
BOOL ret;
@@ -2745,7 +2740,7 @@ static BOOL handle_workgroup(const char *pszParmValue, char **ptr)
return ret;
}
-static BOOL handle_netbios_scope(const char *pszParmValue, char **ptr)
+static BOOL handle_netbios_scope(int snum, const char *pszParmValue, char **ptr)
{
BOOL ret;
@@ -2755,7 +2750,7 @@ static BOOL handle_netbios_scope(const char *pszParmValue, char **ptr)
return ret;
}
-static BOOL handle_netbios_aliases(const char *pszParmValue, char **ptr)
+static BOOL handle_netbios_aliases(int snum, const char *pszParmValue, char **ptr)
{
Globals.szNetbiosAliases = str_list_make(pszParmValue, NULL);
return set_netbios_aliases((const char **)Globals.szNetbiosAliases);
@@ -2765,7 +2760,7 @@ static BOOL handle_netbios_aliases(const char *pszParmValue, char **ptr)
Handle the include operation.
***************************************************************************/
-static BOOL handle_include(const char *pszParmValue, char **ptr)
+static BOOL handle_include(int snum, const char *pszParmValue, char **ptr)
{
pstring fname;
pstrcpy(fname, pszParmValue);
@@ -2788,7 +2783,7 @@ static BOOL handle_include(const char *pszParmValue, char **ptr)
Handle the interpretation of the copy parameter.
***************************************************************************/
-static BOOL handle_copy(const char *pszParmValue, char **ptr)
+static BOOL handle_copy(int snum, const char *pszParmValue, char **ptr)
{
BOOL bRetval;
int iTemp;
@@ -2869,7 +2864,7 @@ BOOL lp_idmap_gid(gid_t *low, gid_t *high)
/* Do some simple checks on "idmap [ug]id" parameter values */
-static BOOL handle_idmap_uid(const char *pszParmValue, char **ptr)
+static BOOL handle_idmap_uid(int snum, const char *pszParmValue, char **ptr)
{
uint32 low, high;
@@ -2886,7 +2881,7 @@ static BOOL handle_idmap_uid(const char *pszParmValue, char **ptr)
return True;
}
-static BOOL handle_idmap_gid(const char *pszParmValue, char **ptr)
+static BOOL handle_idmap_gid(int snum, const char *pszParmValue, char **ptr)
{
uint32 low, high;
@@ -2907,7 +2902,7 @@ static BOOL handle_idmap_gid(const char *pszParmValue, char **ptr)
Handle the DEBUG level list.
***************************************************************************/
-static BOOL handle_debug_list( const char *pszParmValueIn, char **ptr )
+static BOOL handle_debug_list( int snum, const char *pszParmValueIn, char **ptr )
{
pstring pszParmValue;
@@ -2972,7 +2967,7 @@ char *lp_ldap_idmap_suffix(void)
/***************************************************************************
***************************************************************************/
-static BOOL handle_acl_compatibility(const char *pszParmValue, char **ptr)
+static BOOL handle_acl_compatibility(int snum, const char *pszParmValue, char **ptr)
{
if (strequal(pszParmValue, "auto"))
string_set(ptr, "");
@@ -2986,6 +2981,49 @@ static BOOL handle_acl_compatibility(const char *pszParmValue, char **ptr)
return True;
}
+/****************************************************************************
+ set the value for a P_ENUM
+ ***************************************************************************/
+
+static void lp_set_enum_parm( struct parm_struct *parm, const char *pszParmValue,
+ int *ptr )
+{
+ int i;
+
+ for (i = 0; parm->enum_list[i].name; i++)
+ {
+ if ( strequal(pszParmValue, parm->enum_list[i].name))
+ {
+ *ptr = parm->enum_list[i].value;
+ break;
+ }
+ }
+}
+
+/***************************************************************************
+***************************************************************************/
+
+static BOOL handle_printing(int snum, const char *pszParmValue, char **ptr)
+{
+ static int parm_num = -1;
+ service *s;
+
+ if ( parm_num == -1 )
+ parm_num = map_parameter( "printing" );
+
+ lp_set_enum_parm( &parm_table[parm_num], pszParmValue, (int*)ptr );
+
+ if ( snum < 0 )
+ s = &sDefault;
+ else
+ s = ServicePtrs[snum];
+
+ init_printer_values( s );
+
+ return True;
+}
+
+
/***************************************************************************
Initialise a copymap.
***************************************************************************/
@@ -3108,7 +3146,7 @@ BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
/* if it is a special case then go ahead */
if (parm_table[parmnum].special) {
- parm_table[parmnum].special(pszParmValue, (char **)parm_ptr);
+ parm_table[parmnum].special(snum, pszParmValue, (char **)parm_ptr);
return (True);
}
@@ -3160,16 +3198,7 @@ BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
break;
case P_ENUM:
- for (i = 0; parm_table[parmnum].enum_list[i].name; i++) {
- if (strequal
- (pszParmValue,
- parm_table[parmnum].enum_list[i].name)) {
- *(int *)parm_ptr =
- parm_table[parmnum].
- enum_list[i].value;
- break;
- }
- }
+ lp_set_enum_parm( &parm_table[parmnum], pszParmValue, (int*)parm_ptr );
break;
case P_SEP:
break;
@@ -3467,11 +3496,14 @@ static void dump_a_service(service * pService, FILE * f)
if (pService != &sDefault)
fprintf(f, "\n[%s]\n", pService->szService);
- for (i = 0; parm_table[i].label; i++)
+ for (i = 0; parm_table[i].label; i++) {
+
if (parm_table[i].class == P_LOCAL &&
parm_table[i].ptr &&
(*parm_table[i].label != '-') &&
- (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr))) {
+ (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
+ {
+
int pdiff = PTR_DIFF(parm_table[i].ptr, &sDefault);
if (pService == &sDefault) {
@@ -3490,14 +3522,16 @@ static void dump_a_service(service * pService, FILE * f)
print_parameter(&parm_table[i],
((char *)pService) + pdiff, f);
fprintf(f, "\n");
- }
- if (pService->param_opt != NULL) {
- data = pService->param_opt;
- while(data) {
- fprintf(f, "\t%s = %s\n", data->key, data->value);
- data = data->next;
}
- }
+
+ if (pService->param_opt != NULL) {
+ data = pService->param_opt;
+ while(data) {
+ fprintf(f, "\t%s = %s\n", data->key, data->value);
+ data = data->next;
+ }
+ }
+ }
}
@@ -3899,7 +3933,9 @@ BOOL lp_load(const char *pszFname, BOOL global_only, BOOL save_defaults,
}
init_iconv();
+#if 0 /* JERRY */
init_printer_values(&sDefault);
+#endif
return (bRetval);
}