added "hide files" option.
[kai/samba.git] / source3 / param / loadparm.c
index c61ab26781f2a483da9aa42c0dfe821f1d8e2864..9947aca5eaf02ac3f73cc50120c7dc2e8fd7f8f5 100644 (file)
@@ -2,7 +2,7 @@
    Unix SMB/Netbios implementation.
    Version 1.9.
    Parameter loading functions
-   Copyright (C) Karl Auer 1993,1994
+   Copyright (C) Karl Auer 1993,1997
 
    Largely re-written by Andrew Tridgell, September 1994
    
 
 #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,76 @@ 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 *szLogonPath;
+  char *szVetoFiles;
+  char *szHideFiles;
+  char *szSmbrun;
+  char *szWINSserver;
+  char *szInterfaces;
+  char *szRemoteAnnounce;
+  char *szSocketAddress;
+  char *szNISHomeMapName;
+  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;
+  int shmem_size;
+  int shmem_hash_size;
+  int client_code_page;
+  BOOL bWINSsupport;
+  BOOL bWINSproxy;
+  BOOL bLocalMaster;
+  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;
+  BOOL bUnixRealname;
+  BOOL bNISHomeMap;
+  BOOL bTimeServer;
 } global;
 
 static global Globals;
@@ -192,6 +207,7 @@ typedef struct
   char *szLppausecommand;
   char *szLpresumecommand;
   char *szPrintername;
+  char *szPrinterDriver;
   char *szDontdescend;
   char *szHostsallow;
   char *szHostsdeny;
@@ -206,6 +222,9 @@ typedef struct
   char *volume;
   int  iMinPrintSpace;
   int  iCreate_mode;
+  int  iCreate_force_mode;
+  int  iDir_mode;
+  int  iDir_force_mode;
   int  iMaxConnections;
   int  iDefaultCase;
   BOOL bAlternatePerm;
@@ -236,6 +255,8 @@ typedef struct
   BOOL bSyncAlways;
   char magic_char;
   BOOL *copymap;
+  BOOL bDeleteReadonly;
+  BOOL bFakeOplocks;
   char dummy[3]; /* for alignment */
 } service;
 
@@ -263,6 +284,7 @@ static service sDefault =
   NULL,    /* szLppausecommand */
   NULL,    /* szLpresumecommand */
   NULL,    /* szPrintername */
+  NULL,    /* szPrinterDriver */
   NULL,    /* szDontdescend */
   NULL,    /* szHostsallow */
   NULL,    /* szHostsdeny */
@@ -276,7 +298,10 @@ static service sDefault =
   NULL,    /* writelist */
   NULL,    /* volume */
   0,       /* iMinPrintSpace */
-  0755,    /* iCreate_mode */
+  0644,    /* iCreate_mode */
+  0000,    /* iCreate_force_mode */
+  0755,    /* iDir_mode */
+  0000,    /* iDir_force_mode */
   0,       /* iMaxConnections */
   CASE_LOWER, /* iDefaultCase */
   False,   /* bAlternatePerm */
@@ -307,6 +332,8 @@ static service sDefault =
   False, /* bSyncAlways */
   '~',   /* magic char */
   NULL,  /* copymap */
+  False, /* bDeleteReadonly */
+  False, /* bFakeOplocks */
   ""     /* dummy */
 };
 
@@ -363,9 +390,13 @@ 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},
+  {"veto files",       P_STRING,  P_GLOBAL, &Globals.szVetoFiles,       NULL},
+  {"hide files",       P_STRING,  P_GLOBAL, &Globals.szHideFiles,       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 +418,15 @@ 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},
+  {"logon path",       P_STRING,  P_GLOBAL, &Globals.szLogonPath,       NULL},
+  {"remote announce",  P_STRING,  P_GLOBAL, &Globals.szRemoteAnnounce,  NULL},
+  {"socket address",   P_STRING,  P_GLOBAL, &Globals.szSocketAddress,   NULL},
+  {"homedir map",      P_STRING,  P_GLOBAL, &Globals.szNISHomeMapName,  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,18 +437,27 @@ 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},
+  {"shared mem size",  P_INTEGER, P_GLOBAL, &Globals.shmem_size,        NULL},
+  {"shared file entries",  P_INTEGER, P_GLOBAL, &Globals.shmem_hash_size, NULL},
 #ifdef KANJI
   {"coding system",    P_INTEGER, P_GLOBAL, &coding_system, handle_coding_system},
 #endif /* KANJI */
+  {"client code page", P_INTEGER, P_GLOBAL, &Globals.client_code_page, NULL},
   {"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},
+  {"local master",     P_BOOL,    P_GLOBAL, &Globals.bLocalMaster,      NULL},
   {"domain master",    P_BOOL,    P_GLOBAL, &Globals.bDomainMaster,     NULL},
   {"domain logons",    P_BOOL,    P_GLOBAL, &Globals.bDomainLogons,     NULL},
   {"browse list",      P_BOOL,    P_GLOBAL, &Globals.bBrowseList,       NULL},
-
+  {"unix realname",    P_BOOL,    P_GLOBAL, &Globals.bUnixRealname,     NULL},
+  {"NIS homedir",      P_BOOL,    P_GLOBAL, &Globals.bNISHomeMap,       NULL},
+  {"time server",      P_BOOL,    P_GLOBAL, &Globals.bTimeServer,      NULL},
   {"-valid",           P_BOOL,    P_LOCAL,  &sDefault.valid,            NULL},
   {"comment",          P_STRING,  P_LOCAL,  &sDefault.comment,          NULL},
   {"copy",             P_STRING,  P_LOCAL,  &sDefault.szCopy,    handle_copy},
@@ -458,6 +502,10 @@ struct parm_struct
   {"min print space",  P_INTEGER, P_LOCAL,  &sDefault.iMinPrintSpace,   NULL},
   {"create mask",      P_OCTAL,   P_LOCAL,  &sDefault.iCreate_mode,     NULL},
   {"create mode",      P_OCTAL,   P_LOCAL,  &sDefault.iCreate_mode,     NULL},
+  {"force create mode",P_OCTAL,   P_LOCAL,  &sDefault.iCreate_force_mode,     NULL},
+  {"directory mask",   P_OCTAL,   P_LOCAL,  &sDefault.iDir_mode,        NULL},
+  {"directory mode",   P_OCTAL,   P_LOCAL,  &sDefault.iDir_mode,        NULL},
+  {"force directory mode",   P_OCTAL,   P_LOCAL,  &sDefault.iDir_force_mode,        NULL},
   {"set directory",    P_BOOLREV, P_LOCAL,  &sDefault.bNo_set_dir,      NULL},
   {"status",           P_BOOL,    P_LOCAL,  &sDefault.status,           NULL},
   {"hide dot files",   P_BOOL,    P_LOCAL,  &sDefault.bHideDotFiles,    NULL},
@@ -478,6 +526,7 @@ struct parm_struct
   {"wide links",       P_BOOL,    P_LOCAL,  &sDefault.bWidelinks,       NULL},
   {"sync always",      P_BOOL,    P_LOCAL,  &sDefault.bSyncAlways,      NULL},
   {"mangled names",    P_BOOL,    P_LOCAL,  &sDefault.bMangledNames,    NULL},
+  {"fake oplocks",     P_BOOL,    P_LOCAL,  &sDefault.bFakeOplocks,     NULL},
   {"print command",    P_STRING,  P_LOCAL,  &sDefault.szPrintcommand,   NULL},
   {"lpq command",      P_STRING,  P_LOCAL,  &sDefault.szLpqcommand,     NULL},
   {"lprm command",     P_STRING,  P_LOCAL,  &sDefault.szLprmcommand,    NULL},
@@ -485,6 +534,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 +543,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,11 +564,13 @@ 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,"");
 
       string_set(&sDefault.szGuestaccount, GUEST_ACCOUNT);
+      string_set(&sDefault.szPrinterDriver, "NULL");
 
       done_init = True;
     }
@@ -538,14 +591,16 @@ 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;
   Globals.bUseRhosts = False;
   Globals.max_packet = 65535;
   Globals.mangled_stack = 50;
-  Globals.max_xmit = Globals.max_packet;
-  Globals.max_mux = 2;
+  Globals.max_xmit = 65535;
+  Globals.max_mux = 50; /* This is *needed* for profile support. */
   Globals.lpqcachetime = 10;
   Globals.pwordlevel = 0;
   Globals.deadtime = 0;
@@ -564,15 +619,40 @@ static void init_globals(void)
   Globals.bSyslogOnly = False;
   Globals.os_level = 0;
   Globals.max_ttl = 60*60*4; /* 2 hours default */
-  Globals.bPreferredMaster = True;
-  Globals.bDomainMaster = False;
-  Globals.bDomainLogons = False;
-  Globals.bBrowseList = True;
-
+  Globals.ReadSize = 16*1024;
+  Globals.shmem_size = SHMEM_SIZE;
+  Globals.shmem_hash_size = SHMEM_HASH_SIZE;
+  Globals.bUnixRealname = False;
+  Globals.szHideFiles = DEFAULT_FILES_TO_HIDE;
+#if (defined(NETGROUP) && defined(AUTOMOUNT))
+  Globals.bNISHomeMap = False;
+  string_set(&Globals.szNISHomeMapName, "auto.home");
+#endif
 #ifdef KANJI
   coding_system = interpret_coding_system (KANJI, SJIS_CODE);
 #endif /* KANJI */
+  Globals.client_code_page = DEFAULT_CLIENT_CODE_PAGE;
+  Globals.bTimeServer = False;
+
+/* these parameters are set to defaults that are more appropriate
+   for the increasing samba install base:
+
+   as a member of the workgroup, that will possibly become a
+   _local_ master browser (lm = True).  this is opposed to a forced
+   local master browser startup (pm = True).
+
+   doesn't provide WINS server service by default (wsupp = False),
+   and doesn't provide domain master browser services by default, either.
+
+*/
 
+  Globals.bPreferredMaster = False;
+  Globals.bLocalMaster = True;
+  Globals.bDomainMaster = False;
+  Globals.bDomainLogons = False;
+  Globals.bBrowseList = True;
+  Globals.bWINSsupport = False;
+  Globals.bWINSproxy = False;
 }
 
 /***************************************************************************
@@ -595,6 +675,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 +704,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 +777,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 +797,18 @@ 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_logon_path,&Globals.szLogonPath) 
+FN_GLOBAL_STRING(lp_veto_files,&Globals.szVetoFiles)
+FN_GLOBAL_STRING(lp_hide_files,&Globals.szHideFiles)
+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_STRING(lp_nis_home_map_name,&Globals.szNISHomeMapName)
+
+FN_GLOBAL_BOOL(lp_wins_support,&Globals.bWINSsupport)
+FN_GLOBAL_BOOL(lp_wins_proxy,&Globals.bWINSproxy)
+FN_GLOBAL_BOOL(lp_local_master,&Globals.bLocalMaster)
 FN_GLOBAL_BOOL(lp_domain_master,&Globals.bDomainMaster)
 FN_GLOBAL_BOOL(lp_domain_logons,&Globals.bDomainLogons)
 FN_GLOBAL_BOOL(lp_preferred_master,&Globals.bPreferredMaster)
@@ -705,6 +824,9 @@ FN_GLOBAL_BOOL(lp_strip_dot,&Globals.bStripDot)
 FN_GLOBAL_BOOL(lp_encrypted_passwords,&Globals.bEncryptPasswords)
 FN_GLOBAL_BOOL(lp_syslog_only,&Globals.bSyslogOnly)
 FN_GLOBAL_BOOL(lp_browse_list,&Globals.bBrowseList)
+FN_GLOBAL_BOOL(lp_unix_realname,&Globals.bUnixRealname)
+FN_GLOBAL_BOOL(lp_nis_home_map,&Globals.bNISHomeMap)
+FN_GLOBAL_BOOL(lp_time_server,&Globals.bTimeServer)
 
 FN_GLOBAL_INTEGER(lp_os_level,&Globals.os_level)
 FN_GLOBAL_INTEGER(lp_max_ttl,&Globals.max_ttl)
@@ -715,6 +837,9 @@ 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_shmem_size,&Globals.shmem_size)
+FN_GLOBAL_INTEGER(lp_shmem_hash_size,&Globals.shmem_hash_size)
 FN_GLOBAL_INTEGER(lp_deadtime,&Globals.deadtime)
 FN_GLOBAL_INTEGER(lp_maxprotocol,&Globals.maxprotocol)
 FN_GLOBAL_INTEGER(lp_security,&Globals.security)
@@ -722,6 +847,7 @@ FN_GLOBAL_INTEGER(lp_printing,&Globals.printing)
 FN_GLOBAL_INTEGER(lp_maxdisksize,&Globals.maxdisksize)
 FN_GLOBAL_INTEGER(lp_lpqcachetime,&Globals.lpqcachetime)
 FN_GLOBAL_INTEGER(lp_syslog,&Globals.syslog)
+FN_GLOBAL_INTEGER(lp_client_code_page,&Globals.client_code_page)
 
 FN_LOCAL_STRING(lp_preexec,szPreExec)
 FN_LOCAL_STRING(lp_postexec,szPostExec)
@@ -741,6 +867,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,8 +905,13 @@ 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_BOOL(lp_fake_oplocks,bFakeOplocks)
 
 FN_LOCAL_INTEGER(lp_create_mode,iCreate_mode)
+FN_LOCAL_INTEGER(lp_force_create_mode,iCreate_force_mode)
+FN_LOCAL_INTEGER(lp_dir_mode,iDir_mode)
+FN_LOCAL_INTEGER(lp_force_dir_mode,iDir_force_mode)
 FN_LOCAL_INTEGER(lp_max_connections,iMaxConnections)
 FN_LOCAL_INTEGER(lp_defaultcase,iDefaultCase)
 FN_LOCAL_INTEGER(lp_minprintspace,iMinPrintSpace)
@@ -824,7 +956,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)));
 }
 
@@ -927,7 +1061,7 @@ static BOOL lp_add_ipc(void)
 
   sprintf(comment,"IPC Service (%s)",lp_serverstring());
 
-  string_set(&iSERVICE(i).szPath,"/tmp");
+  string_set(&iSERVICE(i).szPath,tmpdir());
   string_set(&iSERVICE(i).szUsername,"");
   string_set(&iSERVICE(i).comment,comment);
   iSERVICE(i).status = False;
@@ -965,6 +1099,10 @@ BOOL lp_add_printer(char *pszPrintername, int iDefaultService)
   string_set(&iSERVICE(i).szPrintername,pszPrintername);
   string_set(&iSERVICE(i).comment,comment);
   iSERVICE(i).bBrowseable = sDefault.bBrowseable;
+  /* Printers cannot be read_only. */
+  iSERVICE(i).bRead_only = False;
+  /* No share modes on printer services. */
+  iSERVICE(i).bShareModes = False;
   
   DEBUG(3,("adding printer service %s\n",pszPrintername));
   
@@ -1113,6 +1251,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;
          }
@@ -1156,8 +1299,8 @@ static BOOL service_ok(int iService)
    if (iSERVICE(iService).szPath[0] == '\0' &&
        strwicmp(iSERVICE(iService).szService,HOMES_NAME) != 0)
    {
-      DEBUG(0,("No path in service %s - using /tmp\n",iSERVICE(iService).szService));
-      string_set(&iSERVICE(iService).szPath,"/tmp");      
+      DEBUG(0,("No path in service %s - using %s\n",iSERVICE(iService).szService,tmpdir()));
+      string_set(&iSERVICE(iService).szPath,tmpdir());      
    }
 
    /* If a service is flagged unavailable, log the fact at level 0. */
@@ -1291,6 +1434,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 +1620,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 +1666,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 +1699,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 +1707,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 +2028,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
   ******************************************************************/