diff options
Diffstat (limited to 'source/param/loadparm.c')
-rw-r--r-- | source/param/loadparm.c | 240 |
1 files changed, 156 insertions, 84 deletions
diff --git a/source/param/loadparm.c b/source/param/loadparm.c index c61ab26781f..87209d1bb7c 100644 --- a/source/param/loadparm.c +++ b/source/param/loadparm.c @@ -49,16 +49,11 @@ #include "includes.h" -#include "params.h" -#include "loadparm.h" -#include "pcap.h" - BOOL bLoaded = False; extern int DEBUGLEVEL; -extern int ReadSize; extern pstring user_socket_options; -extern pstring smbrun_path; +extern pstring myname; #ifndef GLOBAL_NAME #define GLOBAL_NAME "global" @@ -89,7 +84,8 @@ extern pstring smbrun_path; /* these are the types of parameter we have */ typedef enum { - P_BOOL,P_BOOLREV,P_CHAR,P_INTEGER,P_OCTAL,P_STRING,P_GSTRING + P_BOOL,P_BOOLREV,P_CHAR,P_INTEGER,P_OCTAL, + P_STRING,P_USTRING,P_GSTRING,P_UGSTRING } parm_type; typedef enum @@ -110,57 +106,65 @@ extern int coding_system; */ typedef struct { - char *szPrintcapname; - char *szLockDir; - char *szRootdir; - char *szDefaultService; - char *szDfree; - char *szMsgCommand; - char *szHostsEquiv; - char *szServerString; - char *szAutoServices; - char *szPasswdProgram; - char *szPasswdChat; - char *szLogFile; - char *szConfigFile; - char *szSMBPasswdFile; - char *szPasswordServer; - char *szSocketOptions; - char *szValidChars; - char *szWorkGroup; - char *szDomainController; - char *szUsernameMap; - char *szCharacterSet; - char *szLogonScript; - int max_log_size; - int mangled_stack; - int max_xmit; - int max_mux; - int max_packet; - int pwordlevel; - int deadtime; - int maxprotocol; - int security; - int printing; - int maxdisksize; - int lpqcachetime; - int syslog; - int os_level; - int max_ttl; - BOOL bPreferredMaster; - BOOL bDomainMaster; - BOOL bDomainLogons; - BOOL bEncryptPasswords; - BOOL bStripDot; - BOOL bNullPasswords; - BOOL bLoadPrinters; - BOOL bUseRhosts; - BOOL bReadRaw; - BOOL bWriteRaw; - BOOL bReadPrediction; - BOOL bReadbmpx; - BOOL bSyslogOnly; - BOOL bBrowseList; + char *szPrintcapname; + char *szLockDir; + char *szRootdir; + char *szDefaultService; + char *szDfree; + char *szMsgCommand; + char *szHostsEquiv; + char *szServerString; + char *szAutoServices; + char *szPasswdProgram; + char *szPasswdChat; + char *szLogFile; + char *szConfigFile; + char *szSMBPasswdFile; + char *szPasswordServer; + char *szSocketOptions; + char *szValidChars; + char *szWorkGroup; + char *szDomainController; + char *szUsernameMap; + char *szCharacterSet; + char *szLogonScript; + char *szSmbrun; + char *szWINSserver; + char *szInterfaces; + char *szRemoteAnnounce; + char *szSocketAddress; + int max_log_size; + int mangled_stack; + int max_xmit; + int max_mux; + int max_packet; + int pwordlevel; + int deadtime; + int maxprotocol; + int security; + int printing; + int maxdisksize; + int lpqcachetime; + int syslog; + int os_level; + int max_ttl; + int ReadSize; + BOOL bWINSsupport; + BOOL bWINSproxy; + BOOL bPreferredMaster; + BOOL bDomainMaster; + BOOL bDomainLogons; + BOOL bEncryptPasswords; + BOOL bStripDot; + BOOL bNullPasswords; + BOOL bLoadPrinters; + BOOL bUseRhosts; + BOOL bReadRaw; + BOOL bWriteRaw; + BOOL bReadPrediction; + BOOL bReadbmpx; + BOOL bSyslogOnly; + BOOL bBrowseList; } global; static global Globals; @@ -192,6 +196,7 @@ typedef struct char *szLppausecommand; char *szLpresumecommand; char *szPrintername; + char *szPrinterDriver; char *szDontdescend; char *szHostsallow; char *szHostsdeny; @@ -236,6 +241,7 @@ typedef struct BOOL bSyncAlways; char magic_char; BOOL *copymap; + BOOL bDeleteReadonly; char dummy[3]; /* for alignment */ } service; @@ -263,6 +269,7 @@ static service sDefault = NULL, /* szLppausecommand */ NULL, /* szLpresumecommand */ NULL, /* szPrintername */ + NULL, /* szPrinterDriver */ NULL, /* szDontdescend */ NULL, /* szHostsallow */ NULL, /* szHostsdeny */ @@ -307,6 +314,7 @@ static service sDefault = False, /* bSyncAlways */ '~', /* magic char */ NULL, /* copymap */ + False, /* bDeleteReadonly */ "" /* dummy */ }; @@ -363,9 +371,11 @@ struct parm_struct {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL}, {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL}, {"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL}, + {"interfaces", P_STRING, P_GLOBAL, &Globals.szInterfaces, NULL}, {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL}, {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL}, - {"smbrun", P_GSTRING, P_GLOBAL, smbrun_path, NULL}, + {"netbios name", P_UGSTRING,P_GLOBAL, myname, NULL}, + {"smbrun", P_STRING, P_GLOBAL, &Globals.szSmbrun, NULL}, {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL}, {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL}, {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL}, @@ -387,11 +397,13 @@ struct parm_struct {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL}, {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL}, {"valid chars", P_STRING, P_GLOBAL, &Globals.szValidChars, handle_valid_chars}, - {"workgroup", P_STRING, P_GLOBAL, &Globals.szWorkGroup, NULL}, + {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL}, {"domain controller",P_STRING, P_GLOBAL, &Globals.szDomainController,NULL}, {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL}, {"character set", P_STRING, P_GLOBAL, &Globals.szCharacterSet, handle_character_set}, {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL}, + {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL}, + {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL}, {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL}, {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL}, {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL}, @@ -402,12 +414,15 @@ struct parm_struct {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL}, {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL}, {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL}, - {"read size", P_INTEGER, P_GLOBAL, &ReadSize, NULL}, + {"read size", P_INTEGER, P_GLOBAL, &Globals.ReadSize, NULL}, #ifdef KANJI {"coding system", P_INTEGER, P_GLOBAL, &coding_system, handle_coding_system}, #endif /* KANJI */ {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL}, {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL}, + {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL}, + {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL}, + {"wins server", P_STRING, P_GLOBAL, &Globals.szWINSserver, NULL}, {"preferred master", P_BOOL, P_GLOBAL, &Globals.bPreferredMaster, NULL}, {"prefered master", P_BOOL, P_GLOBAL, &Globals.bPreferredMaster, NULL}, {"domain master", P_BOOL, P_GLOBAL, &Globals.bDomainMaster, NULL}, @@ -485,6 +500,7 @@ struct parm_struct {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand,NULL}, {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL}, {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL}, + {"printer driver", P_STRING, P_LOCAL, &sDefault.szPrinterDriver, NULL}, {"hosts allow", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL}, {"allow hosts", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL}, {"hosts deny", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL}, @@ -493,6 +509,7 @@ struct parm_struct {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL}, {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL}, {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL}, + {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL}, {NULL, P_BOOL, P_NONE, NULL, NULL} }; @@ -513,7 +530,8 @@ static void init_globals(void) bzero((void *)&Globals,sizeof(Globals)); for (i = 0; parm_table[i].label; i++) - if (parm_table[i].type == P_STRING && + if ((parm_table[i].type == P_STRING || + parm_table[i].type == P_USTRING) && parm_table[i].ptr) string_init(parm_table[i].ptr,""); @@ -538,6 +556,8 @@ static void init_globals(void) string_set(&Globals.szPrintcapname, PRINTCAP_NAME); string_set(&Globals.szLockDir, LOCKDIR); string_set(&Globals.szRootdir, "/"); + string_set(&Globals.szSmbrun, SMBRUN); + string_set(&Globals.szSocketAddress, "0.0.0.0"); sprintf(s,"Samba %s",VERSION); string_set(&Globals.szServerString,s); Globals.bLoadPrinters = True; @@ -568,6 +588,9 @@ static void init_globals(void) Globals.bDomainMaster = False; Globals.bDomainLogons = False; Globals.bBrowseList = True; + Globals.bWINSsupport = True; + Globals.bWINSproxy = False; + Globals.ReadSize = 16*1024; #ifdef KANJI coding_system = interpret_coding_system (KANJI, SJIS_CODE); @@ -595,6 +618,8 @@ static void init_locals(void) { case PRINT_BSD: case PRINT_AIX: + case PRINT_LPRNG: + case PRINT_PLP: string_initial(&sDefault.szLpqcommand,"lpq -P%p"); string_initial(&sDefault.szLprmcommand,"lprm -P%p %j"); string_initial(&sDefault.szPrintcommand,"lpr -r -P%p %s"); @@ -622,24 +647,49 @@ static void init_locals(void) } -/******************************************************************* -a convenience rooutine to grab string parameters into a rotating -static buffer, and run standard_sub_basic on them. The buffers -can be written to by callers +/******************************************************************* a +convenience routine to grab string parameters into a rotating buffer, +and run standard_sub_basic on them. The buffers can be written to by +callers without affecting the source string. ********************************************************************/ char *lp_string(char *s) { - static pstring bufs[10]; - static int next=0; + static char *bufs[10]; + static int buflen[10]; + static int next = -1; char *ret; - + int i; + int len = s?strlen(s):0; + + if (next == -1) { + /* initialisation */ + for (i=0;i<10;i++) { + bufs[i] = NULL; + buflen[i] = 0; + } + next = 0; + } + + len = MAX(len+100,sizeof(pstring)); /* the +100 is for some + substitution room */ + + if (buflen[next] != len) { + buflen[next] = len; + if (bufs[next]) free(bufs[next]); + bufs[next] = (char *)malloc(len); + if (!bufs[next]) { + DEBUG(0,("out of memory in lp_string()")); + exit(1); + } + } + ret = &bufs[next][0]; next = (next+1)%10; if (!s) *ret = 0; else - StrnCpy(ret,s,sizeof(pstring)-1); + StrCpy(ret,s); standard_sub_basic(ret); return(ret); @@ -670,6 +720,7 @@ char *lp_string(char *s) int fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);} FN_GLOBAL_STRING(lp_logfile,&Globals.szLogFile) +FN_GLOBAL_STRING(lp_smbrun,&Globals.szSmbrun) FN_GLOBAL_STRING(lp_configfile,&Globals.szConfigFile) FN_GLOBAL_STRING(lp_smb_passwd_file,&Globals.szSMBPasswdFile) FN_GLOBAL_STRING(lp_serverstring,&Globals.szServerString) @@ -689,7 +740,13 @@ FN_GLOBAL_STRING(lp_domain_controller,&Globals.szDomainController) FN_GLOBAL_STRING(lp_username_map,&Globals.szUsernameMap) FN_GLOBAL_STRING(lp_character_set,&Globals.szCharacterSet) FN_GLOBAL_STRING(lp_logon_script,&Globals.szLogonScript) +FN_GLOBAL_STRING(lp_remote_announce,&Globals.szRemoteAnnounce) +FN_GLOBAL_STRING(lp_wins_server,&Globals.szWINSserver) +FN_GLOBAL_STRING(lp_interfaces,&Globals.szInterfaces) +FN_GLOBAL_STRING(lp_socket_address,&Globals.szSocketAddress) +FN_GLOBAL_BOOL(lp_wins_support,&Globals.bWINSsupport) +FN_GLOBAL_BOOL(lp_wins_proxy,&Globals.bWINSproxy) FN_GLOBAL_BOOL(lp_domain_master,&Globals.bDomainMaster) FN_GLOBAL_BOOL(lp_domain_logons,&Globals.bDomainLogons) FN_GLOBAL_BOOL(lp_preferred_master,&Globals.bPreferredMaster) @@ -715,6 +772,7 @@ FN_GLOBAL_INTEGER(lp_maxmux,&Globals.max_mux) FN_GLOBAL_INTEGER(lp_maxpacket,&Globals.max_packet) FN_GLOBAL_INTEGER(lp_keepalive,&keepalive) FN_GLOBAL_INTEGER(lp_passwordlevel,&Globals.pwordlevel) +FN_GLOBAL_INTEGER(lp_readsize,&Globals.ReadSize) FN_GLOBAL_INTEGER(lp_deadtime,&Globals.deadtime) FN_GLOBAL_INTEGER(lp_maxprotocol,&Globals.maxprotocol) FN_GLOBAL_INTEGER(lp_security,&Globals.security) @@ -741,6 +799,7 @@ FN_LOCAL_STRING(lp_lprmcommand,szLprmcommand) FN_LOCAL_STRING(lp_lppausecommand,szLppausecommand) FN_LOCAL_STRING(lp_lpresumecommand,szLpresumecommand) FN_LOCAL_STRING(lp_printername,szPrintername) +FN_LOCAL_STRING(lp_printerdriver,szPrinterDriver) FN_LOCAL_STRING(lp_hostsallow,szHostsallow) FN_LOCAL_STRING(lp_hostsdeny,szHostsdeny) FN_LOCAL_STRING(lp_magicscript,szMagicScript) @@ -778,6 +837,7 @@ FN_LOCAL_BOOL(lp_manglednames,bMangledNames) FN_LOCAL_BOOL(lp_widelinks,bWidelinks) FN_LOCAL_BOOL(lp_syncalways,bSyncAlways) FN_LOCAL_BOOL(lp_map_system,bMap_system) +FN_LOCAL_BOOL(lp_delete_readonly,bDeleteReadonly) FN_LOCAL_INTEGER(lp_create_mode,iCreate_mode) FN_LOCAL_INTEGER(lp_max_connections,iMaxConnections) @@ -824,7 +884,9 @@ static void free_service(service *pservice) return; for (i=0;parm_table[i].label;i++) - if (parm_table[i].type == P_STRING && parm_table[i].class == P_LOCAL) + if ((parm_table[i].type == P_STRING || + parm_table[i].type == P_STRING) && + parm_table[i].class == P_LOCAL) string_free((char **)(((char *)pservice) + PTR_DIFF(parm_table[i].ptr,&sDefault))); } @@ -1113,6 +1175,11 @@ static void copy_service(service *pserviceDest, case P_STRING: string_set(dest_ptr,*(char **)src_ptr); break; + + case P_USTRING: + string_set(dest_ptr,*(char **)src_ptr); + strupper(*(char **)dest_ptr); + break; default: break; } @@ -1291,6 +1358,10 @@ static BOOL handle_printing(char *pszParmValue,int *val) *val = PRINT_BSD; else if (strequal(pszParmValue,"qnx")) *val = PRINT_QNX; + else if (strequal(pszParmValue,"plp")) + *val = PRINT_PLP; + else if (strequal(pszParmValue,"lprng")) + *val = PRINT_LPRNG; return(True); } @@ -1473,9 +1544,19 @@ static BOOL do_parameter(char *pszParmName, char *pszParmValue) string_set(parm_ptr,pszParmValue); break; + case P_USTRING: + string_set(parm_ptr,pszParmValue); + strupper(*(char **)parm_ptr); + break; + case P_GSTRING: strcpy((char *)parm_ptr,pszParmValue); break; + + case P_UGSTRING: + strcpy((char *)parm_ptr,pszParmValue); + strupper((char *)parm_ptr); + break; } return(True); @@ -1509,11 +1590,13 @@ static void print_parameter(parm_type type,void *ptr) break; case P_GSTRING: + case P_UGSTRING: if ((char *)ptr) printf("%s",(char *)ptr); break; case P_STRING: + case P_USTRING: if (*(char **)ptr) printf("%s",*(char **)ptr); break; @@ -1540,6 +1623,7 @@ static BOOL equal_parameter(parm_type type,void *ptr1,void *ptr2) return(*((char *)ptr1) == *((char *)ptr2)); case P_GSTRING: + case P_UGSTRING: { char *p1 = (char *)ptr1, *p2 = (char *)ptr2; if (p1 && !*p1) p1 = NULL; @@ -1547,6 +1631,7 @@ static BOOL equal_parameter(parm_type type,void *ptr1,void *ptr2) return(p1==p2 || strequal(p1,p2)); } case P_STRING: + case P_USTRING: { char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2; if (p1 && !*p1) p1 = NULL; @@ -1867,19 +1952,6 @@ int lp_servicenumber(char *pszServiceName) return (iService); } - - - -/******************************************************************* - get a workgroup - but map to standalone if '*' - ******************************************************************/ -char *my_workgroup(void) -{ - char *res = lp_workgroup(); - if (*res == '*') return("STANDALONE"); - return(res); -} - /******************************************************************* a useful volume label function ******************************************************************/ |