summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/cgi.c13
-rw-r--r--source3/include/proto.h5
-rw-r--r--source3/include/smb.h33
-rw-r--r--source3/param/loadparm.c512
-rw-r--r--source3/swat.c483
-rw-r--r--source3/web/cgi.c13
-rw-r--r--source3/web/swat.c483
7 files changed, 1240 insertions, 302 deletions
diff --git a/source3/cgi.c b/source3/cgi.c
index ae60d72b7b..7c84f47ada 100644
--- a/source3/cgi.c
+++ b/source3/cgi.c
@@ -43,6 +43,7 @@ static int content_length;
static int request_post;
static int request_get;
static char *query_string;
+static char *baseurl;
static void unescape(char *buf)
{
@@ -610,12 +611,20 @@ void cgi_setup(char *rootdir)
*p = 0;
}
- if (strcmp(url,"/")) {
+ if (strstr(url+1,"..")==0 && file_exist(url+1)) {
cgi_download(url+1);
}
printf("HTTP/1.1 200 OK\r\nConnection: close\r\n");
-
+
+ baseurl = url+1;
}
+/***************************************************************************
+return the current pages URL
+ ***************************************************************************/
+char *cgi_baseurl(void)
+{
+ return baseurl;
+}
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 47ef5812ca..06b2d4ec78 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -29,6 +29,7 @@ char *urlquote(char *s);
char *quotequotes(char *s);
void quote_spaces(char *buf);
void cgi_setup(char *rootdir);
+char *cgi_baseurl(void);
/*The following definitions come from charcnv.c */
@@ -382,9 +383,9 @@ BOOL lp_add_home(char *pszHomename, int iDefaultService, char *pszHomedir);
int lp_add_service(char *pszService, int iDefaultService);
BOOL lp_add_printer(char *pszPrintername, int iDefaultService);
BOOL lp_file_list_changed(void);
+void *lp_local_ptr(int snum, void *ptr);
BOOL lp_do_parameter(int snum, char *pszParmName, char *pszParmValue);
-int lp_next_parameter(int snum, int *i, char *label,
- char *value, int allparameters);
+struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters);
BOOL lp_snum_ok(int iService);
BOOL lp_loaded(void);
void lp_killunused(BOOL (*snumused)(int ));
diff --git a/source3/include/smb.h b/source3/include/smb.h
index f7a134d797..ccb3b0424a 100644
--- a/source3/include/smb.h
+++ b/source3/include/smb.h
@@ -1643,6 +1643,39 @@ struct connection_options {
uint16 serverzone;
};
+/* the following are used by loadparm for option lists */
+typedef enum
+{
+ P_BOOL,P_BOOLREV,P_CHAR,P_INTEGER,P_OCTAL,
+ P_STRING,P_USTRING,P_GSTRING,P_UGSTRING,P_ENUM
+} parm_type;
+
+typedef enum
+{
+ P_LOCAL,P_GLOBAL,P_NONE
+} parm_class;
+
+struct enum_list {
+ int value;
+ char *name;
+};
+
+struct parm_struct
+{
+ char *label;
+ parm_type type;
+ parm_class class;
+ void *ptr;
+ BOOL (*special)();
+ struct enum_list *enum_list;
+ unsigned flags;
+};
+
+
+#define FLAG_BASIC 1
+#define FLAG_HIDE 2
+#define FLAG_PRINT 4
+
#ifndef LOCKING_VERSION
#define LOCKING_VERSION 4
#endif /* LOCKING_VERSION */
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
index c0f54860c1..39f6de0e1e 100644
--- a/source3/param/loadparm.c
+++ b/source3/param/loadparm.c
@@ -89,18 +89,6 @@ extern pstring myname;
#define LP_SNUM_OK(iService) (((iService) >= 0) && ((iService) < iNumServices) && iSERVICE(iService).valid)
#define VALID(i) iSERVICE(i).valid
-/* these are the types of parameter we have */
-typedef enum
-{
- P_BOOL,P_BOOLREV,P_CHAR,P_INTEGER,P_OCTAL,
- P_STRING,P_USTRING,P_GSTRING,P_UGSTRING,P_ENUM
-} parm_type;
-
-typedef enum
-{
- P_LOCAL,P_GLOBAL,P_NONE
-} parm_class;
-
int keepalive=0;
extern BOOL use_getwd_cache;
@@ -402,11 +390,6 @@ static BOOL handle_coding_system(char *pszParmValue,char **ptr);
static void set_default_server_announce_type(void);
-struct enum_list {
- int value;
- char *name;
-};
-
static struct enum_list enum_protocol[] = {{PROTOCOL_NT1, "NT1"}, {PROTOCOL_LANMAN2, "LANMAN2"},
{PROTOCOL_LANMAN1, "LANMAN1"}, {PROTOCOL_CORE,"CORE"},
{PROTOCOL_COREPLUS, "COREPLUS"},
@@ -427,221 +410,213 @@ static struct enum_list enum_case[] = {{CASE_LOWER, "lower"}, {CASE_UPPER, "uppe
static struct enum_list enum_lm_announce[] = {{0, "False"}, {1, "True"}, {2, "Auto"}, {-1, NULL}};
-static struct parm_struct
-{
- char *label;
- parm_type type;
- parm_class class;
- void *ptr;
- BOOL (*special)();
- struct enum_list *enum_list;
-} parm_table[] =
+static struct parm_struct parm_table[] =
{
- {"debuglevel", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL},
- {"log level", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL},
- {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL},
- {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL},
- {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol},
- {"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security},
- {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL},
- {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL},
- {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as},
- {"encrypt passwords",P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL},
- {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL},
- {"read prediction", P_BOOL, P_GLOBAL, &Globals.bReadPrediction, NULL, NULL},
- {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL},
- {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL},
- {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL},
- {"use rhosts", P_BOOL, P_GLOBAL, &Globals.bUseRhosts, NULL, NULL},
- {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL},
- {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL},
- {"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL, NULL},
- {"interfaces", P_STRING, P_GLOBAL, &Globals.szInterfaces, NULL, NULL},
- {"bind interfaces only", P_BOOL,P_GLOBAL, &Globals.bBindInterfacesOnly,NULL, NULL},
- {"networkstation user login", P_BOOL,P_GLOBAL, &Globals.bNetWkstaUserLogon,NULL, NULL},
- {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL},
- {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL},
- {"netbios name", P_UGSTRING,P_GLOBAL, myname, NULL, NULL},
- {"netbios aliases", P_STRING, P_GLOBAL, &Globals.szNetbiosAliases, NULL, NULL},
- {"smbrun", P_STRING, P_GLOBAL, &Globals.szSmbrun, NULL, NULL},
- {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL},
- {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL},
- {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL},
- {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL, NULL},
- {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL},
- {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL},
- {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL},
- {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL},
- {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL},
- {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL},
- {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL},
- {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL},
- {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL},
- {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL},
- {"default service", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL},
- {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL},
- {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL},
- {"dfree command", P_STRING, P_GLOBAL, &Globals.szDfree, NULL, NULL},
- {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL},
- {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL},
- {"valid chars", P_STRING, P_GLOBAL, &Globals.szValidChars, handle_valid_chars, NULL},
- {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL, NULL},
+ {"log level", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, FLAG_BASIC},
+ {"debuglevel", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, 0},
+ {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL, 0},
+ {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL, 0},
+ {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0},
+ {"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC},
+ {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, 0},
+ {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, 0},
+ {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as, 0},
+ {"encrypt passwords",P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC},
+ {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, 0},
+ {"read prediction", P_BOOL, P_GLOBAL, &Globals.bReadPrediction, NULL, NULL, 0},
+ {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL, 0},
+ {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, 0},
+ {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, 0},
+ {"use rhosts", P_BOOL, P_GLOBAL, &Globals.bUseRhosts, NULL, NULL, 0},
+ {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, 0},
+ {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, 0},
+ {"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL, NULL, 0},
+ {"interfaces", P_STRING, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC},
+ {"bind interfaces only", P_BOOL,P_GLOBAL, &Globals.bBindInterfacesOnly,NULL, NULL, 0},
+ {"networkstation user login", P_BOOL,P_GLOBAL, &Globals.bNetWkstaUserLogon,NULL, NULL, 0},
+ {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, 0},
+ {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL, 0},
+ {"netbios name", P_UGSTRING,P_GLOBAL, myname, NULL, NULL, FLAG_BASIC},
+ {"netbios aliases", P_STRING, P_GLOBAL, &Globals.szNetbiosAliases, NULL, NULL, 0},
+ {"smbrun", P_STRING, P_GLOBAL, &Globals.szSmbrun, NULL, NULL, 0},
+ {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, 0},
+ {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, 0},
+ {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, 0},
+ {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL, NULL, 0},
+ {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, 0},
+ {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, 0},
+ {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC},
+ {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, 0},
+ {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, 0},
+ {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
+ {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
+ {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
+ {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
+ {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
+ {"default service", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, 0},
+ {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, 0},
+ {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, 0},
+ {"dfree command", P_STRING, P_GLOBAL, &Globals.szDfree, NULL, NULL, 0},
+ {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, 0},
+ {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, 0},
+ {"valid chars", P_STRING, P_GLOBAL, &Globals.szValidChars, handle_valid_chars, NULL, 0},
+ {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL, NULL, FLAG_BASIC},
#ifdef NTDOMAIN
- {"domain sid", P_USTRING, P_GLOBAL, &Globals.szDomainSID, NULL, NULL},
- {"domain other sids",P_STRING, P_GLOBAL, &Globals.szDomainOtherSIDs, NULL, NULL},
- {"domain groups", P_STRING, P_GLOBAL, &Globals.szDomainGroups, NULL, NULL},
- {"domain controller",P_BOOL , P_GLOBAL, &Globals.bDomainController,NULL, NULL},
- {"domain admin users",P_STRING, P_GLOBAL, &Globals.szDomainAdminUsers, NULL, NULL},
- {"domain guest users",P_STRING, P_GLOBAL, &Globals.szDomainGuestUsers, NULL, NULL},
- {"domain hosts allow",P_STRING, P_GLOBAL, &Globals.szDomainHostsallow, NULL, NULL},
- {"domain allow hosts",P_STRING, P_GLOBAL, &Globals.szDomainHostsallow, NULL, NULL},
- {"domain hosts deny", P_STRING, P_GLOBAL, &Globals.szDomainHostsdeny, NULL, NULL},
- {"domain deny hosts", P_STRING, P_GLOBAL, &Globals.szDomainHostsdeny, NULL, NULL},
+ {"domain sid", P_USTRING, P_GLOBAL, &Globals.szDomainSID, NULL, NULL, 0},
+ {"domain other sids",P_STRING, P_GLOBAL, &Globals.szDomainOtherSIDs, NULL, NULL, 0},
+ {"domain groups", P_STRING, P_GLOBAL, &Globals.szDomainGroups, NULL, NULL, 0},
+ {"domain controller",P_BOOL , P_GLOBAL, &Globals.bDomainController,NULL, NULL, 0},
+ {"domain admin users",P_STRING, P_GLOBAL, &Globals.szDomainAdminUsers, NULL, NULL, 0},
+ {"domain guest users",P_STRING, P_GLOBAL, &Globals.szDomainGuestUsers, NULL, NULL, 0},
+ {"domain hosts allow",P_STRING, P_GLOBAL, &Globals.szDomainHostsallow, NULL, NULL, 0},
+ {"domain allow hosts",P_STRING, P_GLOBAL, &Globals.szDomainHostsallow, NULL, NULL, 0},
+ {"domain hosts deny", P_STRING, P_GLOBAL, &Globals.szDomainHostsdeny, NULL, NULL, 0},
+ {"domain deny hosts", P_STRING, P_GLOBAL, &Globals.szDomainHostsdeny, NULL, NULL, 0},
#endif /* NTDOMAIN */
- {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL},
- {"character set", P_STRING, P_GLOBAL, &Globals.szCharacterSet, handle_character_set, NULL},
- {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL},
- {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL},
- {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL},
- {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL},
- {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL},
- {"remote browse sync",P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync,NULL, NULL},
- {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL},
- {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL},
- {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL},
- {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL},
- {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL, NULL},
- {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL},
- {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL},
- {"max packet", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL},
- {"packet size", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL},
- {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL},
- {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL},
- {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL},
- {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL},
- {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL},
- {"read size", P_INTEGER, P_GLOBAL, &Globals.ReadSize, NULL, NULL},
- {"shared mem size", P_INTEGER, P_GLOBAL, &Globals.shmem_size, NULL, NULL},
- {"coding system", P_STRING, P_GLOBAL, &Globals.szCodingSystem, handle_coding_system, NULL},
- {"client code page", P_INTEGER, P_GLOBAL, &Globals.client_code_page, NULL, NULL},
- {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL},
- {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL},
- {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL},
- {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL},
- {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_lm_announce},
- {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL},
- {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL},
- {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL},
- {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL},
- {"wins server", P_STRING, P_GLOBAL, &Globals.szWINSserver, NULL, NULL},
- {"preferred master", P_BOOL, P_GLOBAL, &Globals.bPreferredMaster, NULL, NULL},
- {"prefered master", P_BOOL, P_GLOBAL, &Globals.bPreferredMaster, NULL, NULL},
- {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL},
- {"domain master", P_BOOL, P_GLOBAL, &Globals.bDomainMaster, NULL, NULL},
- {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL},
- {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL},
- {"unix realname", P_BOOL, P_GLOBAL, &Globals.bUnixRealname, NULL, NULL},
- {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL},
- {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL},
- {"printer driver file", P_STRING, P_GLOBAL, &Globals.szDriverFile, NULL, NULL},
- {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL},
- {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL},
- {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL},
- {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL},
- {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL},
- {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL},
- {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL},
- {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL},
- {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL},
- {"alternate permissions",P_BOOL,P_LOCAL, &sDefault.bAlternatePerm, NULL, NULL},
- {"revalidate", P_BOOL, P_LOCAL, &sDefault.bRevalidate, NULL, NULL},
- {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case},
- {"case sensitive", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL},
- {"casesignames", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL},
- {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL},
- {"short preserve case",P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve,NULL, NULL},
- {"mangle case", P_BOOL, P_LOCAL, &sDefault.bCaseMangle, NULL, NULL},
- {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL},
- {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL},
- {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL},
- {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL},
- {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL},
- {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL},
- {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL},
- {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL},
- {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL},
- {"guest account", P_STRING, P_LOCAL, &sDefault.szGuestaccount, NULL, NULL},
- {"invalid users", P_STRING, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL},
- {"valid users", P_STRING, P_LOCAL, &sDefault.szValidUsers, NULL, NULL},
- {"admin users", P_STRING, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL},
- {"read list", P_STRING, P_LOCAL, &sDefault.readlist, NULL, NULL},
- {"write list", P_STRING, P_LOCAL, &sDefault.writelist, NULL, NULL},
- {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL},
- {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL},
- {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL},
- {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL},
- {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL},
- {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL},
- {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL},
- {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL},
- {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL},
- {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL},
- {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL},
- {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL},
- {"force create mode",P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL},
- {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL},
- {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL},
- {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL},
- {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL},
- {"status", P_BOOL, P_LOCAL, &sDefault.status, NULL, NULL},
- {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL},
- {"delete veto files",P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL},
- {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL},
- {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL},
- {"veto oplock files",P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles,NULL, NULL},
- {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL},
- {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL},
- {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL},
- {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL},
- {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL},
- {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL},
- {"postscript", P_BOOL, P_LOCAL, &sDefault.bPostscript, NULL, NULL},
- {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL},
- {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL},
- {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL},
- {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL},
- {"strict locking", P_BOOL, P_LOCAL, &sDefault.bStrictLocking, NULL, NULL},
- {"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL, NULL},
- {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL},
- {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL},
- {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL},
- {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL},
- {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL},
- {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL},
- {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL},
- {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing},
- {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL},
- {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL},
- {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL},
- {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL},
- {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand,NULL, NULL},
- {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL},
- {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL},
- {"printer driver", P_STRING, P_LOCAL, &sDefault.szPrinterDriver, NULL, NULL},
- {"printer driver location", P_STRING, P_LOCAL, &sDefault.szPrinterDriverLocation, NULL, NULL},
- {"hosts allow", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL},
- {"allow hosts", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL},
- {"hosts deny", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL},
- {"deny hosts", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL},
- {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL},
- {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL},
- {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL},
- {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL},
- {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL},
- {"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL},
- {"dos filetime resolution", P_BOOL, P_LOCAL, &sDefault.bDosFiletimeResolution, NULL, NULL},
-
- {NULL, P_BOOL, P_NONE, NULL, NULL, NULL}
+ {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, 0},
+ {"character set", P_STRING, P_GLOBAL, &Globals.szCharacterSet, handle_character_set, NULL, 0},
+ {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, 0},
+ {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, 0},
+ {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, 0},
+ {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, 0},
+ {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, 0},
+ {"remote browse sync",P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync,NULL, NULL, 0},
+ {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, 0},
+ {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, 0},
+ {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, 0},
+ {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL, 0},
+ {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL, NULL, 0},
+ {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, 0},
+ {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, 0},
+ {"max packet", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
+ {"packet size", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
+ {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, 0},
+ {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, 0},
+ {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, 0},
+ {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, 0},
+ {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, 0},
+ {"read size", P_INTEGER, P_GLOBAL, &Globals.ReadSize, NULL, NULL, 0},
+ {"shared mem size", P_INTEGER, P_GLOBAL, &Globals.shmem_size, NULL, NULL, 0},
+ {"coding system", P_STRING, P_GLOBAL, &Globals.szCodingSystem, handle_coding_system, NULL, 0},
+ {"client code page", P_INTEGER, P_GLOBAL, &Globals.client_code_page, NULL, NULL, 0},
+ {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, 0},
+ {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, 0},
+ {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, 0},
+ {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, 0},
+ {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_lm_announce, 0},
+ {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, 0},
+ {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, 0},
+ {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC},
+ {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, 0},
+ {"wins server", P_STRING, P_GLOBAL, &Globals.szWINSserver, NULL, NULL, FLAG_BASIC},
+ {"preferred master", P_BOOL, P_GLOBAL, &Globals.bPreferredMaster, NULL, NULL, 0},
+ {"prefered master", P_BOOL, P_GLOBAL, &Globals.bPreferredMaster, NULL, NULL, 0},
+ {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, 0},
+ {"domain master", P_BOOL, P_GLOBAL, &Globals.bDomainMaster, NULL, NULL, 0},
+ {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, 0},
+ {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, 0},
+ {"unix realname", P_BOOL, P_GLOBAL, &Globals.bUnixRealname, NULL, NULL, 0},
+ {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, 0},
+ {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, 0},
+ {"printer driver file", P_STRING, P_GLOBAL, &Globals.szDriverFile, NULL, NULL, 0},
+ {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE},
+ {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL, FLAG_BASIC|FLAG_PRINT},
+ {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE},
+ {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE},
+ {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, 0},
+ {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, 0},
+ {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL, 0},
+ {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL, 0},
+ {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL, 0},
+ {"alternate permissions",P_BOOL,P_LOCAL, &sDefault.bAlternatePerm, NULL, NULL, 0},
+ {"revalidate", P_BOOL, P_LOCAL, &sDefault.bRevalidate, NULL, NULL, 0},
+ {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, 0},
+ {"case sensitive", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, 0},
+ {"casesignames", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, 0},
+ {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL, 0},
+ {"short preserve case",P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve,NULL, NULL, 0},
+ {"mangle case", P_BOOL, P_LOCAL, &sDefault.bCaseMangle, NULL, NULL, 0},
+ {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, 0},
+ {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, 0},
+ {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, 0},
+ {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, 0},
+ {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC|FLAG_PRINT},
+ {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, 0},
+ {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
+ {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
+ {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
+ {"guest account", P_STRING, P_LOCAL, &sDefault.szGuestaccount, NULL, NULL, FLAG_BASIC|FLAG_PRINT},
+ {"invalid users", P_STRING, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, 0},
+ {"valid users", P_STRING, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, 0},
+ {"admin users", P_STRING, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, 0},
+ {"read list", P_STRING, P_LOCAL, &sDefault.readlist, NULL, NULL, 0},
+ {"write list", P_STRING, P_LOCAL, &sDefault.writelist, NULL, NULL, 0},
+ {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, 0},
+ {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, 0},
+ {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, 0},
+ {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, 0},
+ {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC},
+ {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
+ {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
+ {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
+ {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, 0},
+ {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, 0},
+ {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, 0},
+ {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, 0},
+ {"force create mode",P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, 0},
+ {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, 0},
+ {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, 0},
+ {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, 0},
+ {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, 0},
+ {"status", P_BOOL, P_LOCAL, &sDefault.status, NULL, NULL, 0},
+ {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL, 0},
+ {"delete veto files",P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL, 0},
+ {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL, 0},
+ {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL, 0},
+ {"veto oplock files",P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles,NULL, NULL, 0},
+ {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, 0},
+ {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, 0},
+ {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC|FLAG_PRINT},
+ {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, 0},
+ {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, 0},
+ {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, 0},
+ {"postscript", P_BOOL, P_LOCAL, &sDefault.bPostscript, NULL, NULL, FLAG_PRINT},
+ {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, 0},
+ {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, 0},
+ {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, 0},
+ {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, 0},
+ {"strict locking", P_BOOL, P_LOCAL, &sDefault.bStrictLocking, NULL, NULL, 0},
+ {"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL, NULL, 0},
+ {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, 0},
+ {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, 0},
+ {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, 0},
+ {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, 0},
+ {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL, 0},
+ {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL, 0},
+ {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, 0},
+ {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing, FLAG_PRINT},
+ {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_PRINT},
+ {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_PRINT},
+ {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL, FLAG_PRINT},
+ {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL, 0},
+ {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand,NULL, NULL, 0},
+ {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_PRINT},
+ {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, 0},
+ {"printer driver", P_STRING, P_LOCAL, &sDefault.szPrinterDriver, NULL, NULL, 0},
+ {"printer driver location", P_STRING, P_LOCAL, &sDefault.szPrinterDriverLocation, NULL, NULL, 0},
+ {"hosts allow", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_BASIC|FLAG_PRINT},
+ {"allow hosts", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, 0},
+ {"hosts deny", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_BASIC|FLAG_PRINT},
+ {"deny hosts", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, 0},
+ {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, 0},
+ {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL, 0},
+ {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL, 0},
+ {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL, 0},
+ {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL, 0},
+ {"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL, 0},
+ {"dos filetime resolution", P_BOOL, P_LOCAL, &sDefault.bDosFiletimeResolution, NULL, NULL, 0},
+
+ {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
};
@@ -1664,6 +1639,15 @@ static void init_copymap(service *pservice)
/***************************************************************************
+ return the local pointer to a parameter given the service number and the
+ pointer into the default structure
+***************************************************************************/
+void *lp_local_ptr(int snum, void *ptr)
+{
+ return (void *)(((char *)pSERVICE(snum)) + PTR_DIFF(ptr,&sDefault));
+}
+
+/***************************************************************************
Process a parameter for a particular service number. If snum < 0
then assume we are in the globals
***************************************************************************/
@@ -1831,59 +1815,6 @@ static void print_parameter(struct parm_struct *p,void *ptr, FILE *f)
/***************************************************************************
-print a parameter of the specified type
-***************************************************************************/
-static void parameter_string(struct parm_struct *p,void *ptr,char *s)
-{
- int i;
- s[0] = 0;
-
- switch (p->type) {
- case P_ENUM:
- for (i=0;p->enum_list[i].name;i++) {
- if (*(int *)ptr == p->enum_list[i].value) {
- sprintf(s,"%s",p->enum_list[i].name);
- break;
- }
- }
- break;
-
- case P_BOOL:
- sprintf(s, "%s",BOOLSTR(*(BOOL *)ptr));
- break;
-
- case P_BOOLREV:
- sprintf(s, "%s",BOOLSTR(! *(BOOL *)ptr));
- break;
-
- case P_INTEGER:
- sprintf(s, "%d",*(int *)ptr);
- break;
-
- case P_CHAR:
- sprintf(s, "%c",*(char *)ptr);
- break;
-
- case P_OCTAL:
- sprintf(s, "0%o",*(int *)ptr);
- break;
-
- case P_GSTRING:
- case P_UGSTRING:
- if ((char *)ptr)
- sprintf(s, "%s",(char *)ptr);
- break;
-
- case P_STRING:
- case P_USTRING:
- if (*(char **)ptr)
- sprintf(s, "%s",*(char **)ptr);
- break;
- }
-}
-
-
-/***************************************************************************
check if two parameters are equal
***************************************************************************/
static BOOL equal_parameter(parm_type type,void *ptr1,void *ptr2)
@@ -2030,8 +1961,7 @@ serice and snum==-2 gives the globals
return 0 when out of parameters
***************************************************************************/
-int lp_next_parameter(int snum, int *i, char *label,
- char *value, int allparameters)
+struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
{
if (snum == -2) {
/* do the globals */
@@ -2041,12 +1971,7 @@ int lp_next_parameter(int snum, int *i, char *label,
(*parm_table[*i].label != '-') &&
((*i) == 0 ||
(parm_table[*i].ptr != parm_table[(*i)-1].ptr))) {
- strcpy(label, parm_table[*i].label);
- parameter_string(&parm_table[*i],
- parm_table[*i].ptr,
- value);
- (*i)++;
- return 1;
+ return &parm_table[(*i)++];
}
return 0;
} else {
@@ -2064,12 +1989,7 @@ int lp_next_parameter(int snum, int *i, char *label,
!equal_parameter(parm_table[*i].type,
((char *)pService) + pdiff,
((char *)&sDefault) + pdiff)) {
- strcpy(label, parm_table[*i].label);
- parameter_string(&parm_table[*i],
- ((char *)pService) + pdiff,
- value);
- (*i)++;
- return 1;
+ return &parm_table[(*i)++];
}
}
}
diff --git a/source3/swat.c b/source3/swat.c
new file mode 100644
index 0000000000..4810d87af3
--- /dev/null
+++ b/source3/swat.c
@@ -0,0 +1,483 @@
+/*
+ Unix SMB/Netbios implementation.
+ Version 1.9.
+ html smb.conf editing - prototype only
+ Copyright (C) Andrew Tridgell 1997-1998
+
+ 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.
+*/
+
+#ifdef SYSLOG
+#undef SYSLOG
+#endif
+
+#include "includes.h"
+#include "smb.h"
+
+#define GLOBALS_SNUM -2
+#define DEFAULTS_SNUM -1
+
+static pstring servicesf = CONFIGFILE;
+
+
+/* start the page with standard stuff */
+static void print_header(void)
+{
+ printf("Content-type: text/html\r\n\r\n");
+ printf("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n");
+ printf("<HTML>\n<HEAD>\n<TITLE>Samba Web Administration Tool</TITLE>\n</HEAD>\n<BODY>\n\n");
+}
+
+
+/* finish off the page */
+static void print_footer(void)
+{
+ printf("\n</BODY>\n</HTML>\n");
+}
+
+/* include a lump of html in a page */
+static void include_html(char *fname)
+{
+ FILE *f = fopen(fname,"r");
+ char buf[1024];
+ int ret;
+
+ if (!f) {
+ printf("ERROR: Can't open %s\n", fname);
+ return;
+ }
+
+ while (!feof(f)) {
+ ret = fread(buf, 1, sizeof(buf), f);
+ if (ret <= 0) break;
+ fwrite(buf, 1, ret, stdout);
+ }
+
+ fclose(f);
+}
+
+
+/* display one editable parameter */
+static void show_parameter(int snum, struct parm_struct *parm)
+{
+ int i;
+ void *ptr = parm->ptr;
+
+ if (parm->class == P_LOCAL) {
+ ptr = lp_local_ptr(snum, ptr);
+ }
+
+ printf("<tr><td><A HREF=\"help/parameters.html#%s\">?</A> %s</td><td>",
+ parm->label, parm->label);
+
+ switch (parm->type) {
+ case P_CHAR:
+ printf("<input type=text size=2 name=\"parm_%s\" value=\"%c\">",
+ parm->label, *(char *)ptr);
+ break;
+
+ case P_STRING:
+ case P_USTRING:
+ printf("<input type=text size=40 name=\"parm_%s\" value=\"%s\">",
+ parm->label, *(char **)ptr);
+ break;
+
+ case P_GSTRING:
+ case P_UGSTRING:
+ printf("<input type=text size=40 name=\"parm_%s\" value=\"%s\">",
+ parm->label, (char *)ptr);
+ break;
+
+ case P_BOOL:
+ printf("<input type=radio name=\"parm_%s\" value=Yes %s>yes&nbsp;&nbsp;", parm->label, (*(BOOL *)ptr)?"CHECKED":"");
+ printf("<input type=radio name=\"parm_%s\" value=No %s>no", parm->label, (*(BOOL *)ptr)?"":"CHECKED");
+ break;
+
+ case P_BOOLREV:
+ printf("<input type=radio name=\"parm_%s\" value=Yes %s>yes&nbsp;&nbsp;", parm->label, (*(BOOL *)ptr)?"":"CHECKED");
+ printf("<input type=radio name=\"parm_%s\" value=No %s>no", parm->label, (*(BOOL *)ptr)?"CHECKED":"");
+ break;
+
+ case P_INTEGER:
+ printf("<input type=text size=8 name=\"parm_%s\" value=%d>", parm->label, *(int *)ptr);
+ break;
+
+ case P_OCTAL:
+ printf("<input type=text size=8 name=\"parm_%s\" value=0%o>", parm->label, *(int *)ptr);
+ break;
+
+ case P_ENUM:
+ for (i=0;parm->enum_list[i].name;i++)
+ printf("<input type=radio name=\"parm_%s\" value=%s %s>%s&nbsp;&nbsp;",
+ parm->label, parm->enum_list[i].name,
+ (*(int *)ptr)==parm->enum_list[i].value?"CHECKED":"",
+ parm->enum_list[i].name);
+ break;
+
+ }
+ printf("</td></tr>\n");
+}
+
+/* display a set of parameters for a service */
+static void show_parameters(int snum, int allparameters, int advanced, int printers)
+{
+ int i = 0;
+ struct parm_struct *parm;
+
+ printf("<table>\n");
+
+ while ((parm = lp_next_parameter(snum, &i, allparameters))) {
+ if (parm->flags & FLAG_HIDE) continue;
+ if (!advanced) {
+ if (!printers && !(parm->flags & FLAG_BASIC)) continue;
+ if (printers && !(parm->flags & FLAG_PRINT)) continue;
+ }
+ show_parameter(snum, parm);
+ }
+ printf("</table>\n");
+}
+
+
+static int save_reload(void)
+{
+ FILE *f;
+
+ f = fopen(servicesf,"w");
+ if (!f) {
+ printf("failed to open %s for writing\n", servicesf);
+ return 0;
+ }
+
+ fprintf(f, "# Samba config file created using SWAT\n");
+
+ lp_dump(f);
+
+ fclose(f);
+
+ lp_killunused(NULL);
+
+ if (!lp_load(servicesf,False)) {
+ printf("Can't reload %s\n", servicesf);
+ return 0;
+ }
+
+ return 1;
+}
+
+
+
+/* commit a set of parameters for a service */
+static void commit_parameters(int snum)
+{
+ int i = 0;
+ struct parm_struct *parm;
+ pstring label;
+ char *v;
+
+ while ((parm = lp_next_parameter(snum, &i, 1))) {
+ sprintf(label, "parm_%s", parm->label);
+ if ((v = cgi_variable(label))) {
+ lp_do_parameter(snum, parm->label, v);
+ }
+ }
+
+ save_reload();
+}
+
+
+/* load the smb.conf file into loadparm. */
+static void load_config(void)
+{
+ if (!lp_load(servicesf,False)) {
+ printf("<b>Can't load %s - using defaults</b><p>\n",
+ servicesf);
+ }
+}
+
+/* spit out the html for a link with an image */
+static void image_link(char *name,char *hlink, char *src, int width, int height)
+{
+ printf("<A HREF=\"%s\"><img width=%d height=%d src=\"%s\" alt=\"%s\"></A>\n", hlink, width, height, src, name);
+}
+
+/* display the main navigation controls at the top of each page along
+ with a title */
+static void show_main_buttons(void)
+{
+ printf("<H2 align=center>Samba Web Administration Tool</H2>\n");
+
+ image_link("Globals", "globals", "images/globals.gif", 50, 50);
+ image_link("Shares", "shares", "images/shares.gif", 50, 50);
+ image_link("Printers", "printers", "images/printers.gif", 50, 50);
+
+ printf("<HR>\n");
+}
+
+/* display a welcome page */
+static void welcome_page(void)
+{
+ include_html("help/welcome.html");
+}
+
+
+/* display a globals editing page */
+static void globals_page(void)
+{
+ int advanced = 0;
+
+ printf("<H2>Global Variables</H2>\n");
+
+ if (cgi_variable("Advanced") && !cgi_variable("Basic"))
+ advanced = 1;
+
+ if (cgi_variable("Commit")) {
+ commit_parameters(GLOBALS_SNUM);
+ }
+
+ printf("<FORM method=post>\n");
+
+ printf("<input type=submit name=\"Commit\" value=\"Commit Changes\">\n");
+ if (advanced == 0) {
+ printf("<input type=submit name=\"Advanced\" value=\"Advanced View\">\n");
+ } else {
+ printf("<input type=submit name=\"Basic\" value=\"Basic View\">\n");
+ }
+ printf("<p>\n");
+
+ show_parameters(GLOBALS_SNUM, 1, advanced, 0);
+
+ if (advanced) {
+ printf("<input type=hidden name=\"Advanced\" value=1>\n");
+ }
+
+ printf("</form>\n");
+}
+
+/* display a shares editing page */
+static void shares_page(void)
+{
+ char *share = cgi_variable("share");
+ char *s;
+ int snum=-1;
+ int i;
+ int advanced = 0;
+
+ if (share)
+ snum = lp_servicenumber(share);
+
+ printf("<H2>Share Parameters</H2>\n");
+
+ if (cgi_variable("Advanced") && !cgi_variable("Basic"))
+ advanced = 1;
+
+ if (cgi_variable("Commit") && snum >= 0) {
+ commit_parameters(snum);
+ }
+
+ if (cgi_variable("Delete") && snum >= 0) {
+ lp_remove_service(snum);
+ save_reload();
+ share = NULL;
+ snum = -1;
+ }
+
+ if (cgi_variable("createshare") && (share=cgi_variable("newshare"))) {
+ lp_copy_service(DEFAULTS_SNUM, share);
+ save_reload();
+ snum = lp_servicenumber(share);
+ }
+
+ printf("<FORM method=post>\n");
+
+ printf("<table>\n");
+ printf("<tr><td><input type=submit name=selectshare value=\"Choose Share\"></td>\n");
+ printf("<td><select name=share>\n");
+ if (snum < 0)
+ printf("<option value=\" \"> \n");
+ for (i=0;i<lp_numservices();i++) {
+ s = lp_servicename(i);
+ if (s && (*s) && strcmp(s,"IPC$")) {
+ printf("<option %s value=\"%s\">%s\n",
+ (share && strcmp(share,s)==0)?"SELECTED":"",
+ s, s);
+ }
+ }
+ printf("</select></td></tr><p>");
+
+ printf("<tr><td><input type=submit name=createshare value=\"Create Share\"></td>\n");
+ printf("<td><input type=text size=30 name=newshare></td></tr>\n");
+ printf("</table>");
+
+
+ if (snum >= 0) {
+ printf("<input type=submit name=\"Commit\" value=\"Commit Changes\">\n");
+ printf("<input type=submit name=\"Delete\" value=\"Delete Share\">\n");
+ if (advanced == 0) {
+ printf("<input type=submit name=\"Advanced\" value=\"Advanced View\">\n");
+ } else {
+ printf("<input type=submit name=\"Basic\" value=\"Basic View\">\n");
+ }
+ printf("<p>\n");
+ }
+
+ if (snum >= 0) {
+ show_parameters(snum, 1, advanced, 0);
+ }
+
+ if (advanced) {
+ printf("<input type=hidden name=\"Advanced\" value=1>\n");
+ }
+
+ printf("</FORM>\n");
+}
+
+
+/* display a printers editing page */
+static void printers_page(void)
+{
+ char *share = cgi_variable("share");
+ char *s;
+ int snum=-1;
+ int i;
+ int advanced = 0;
+
+ if (share)
+ snum = lp_servicenumber(share);
+
+ printf("<H2>Printer Parameters</H2>\n");
+
+ if (cgi_variable("Advanced") && !cgi_variable("Basic"))
+ advanced = 1;
+
+ if (cgi_variable("Commit") && snum >= 0) {
+ commit_parameters(snum);
+ }
+
+ if (cgi_variable("Delete") && snum >= 0) {
+ lp_remove_service(snum);
+ save_reload();
+ share = NULL;
+ snum = -1;
+ }
+
+ if (cgi_variable("createshare") && (share=cgi_variable("newshare"))) {
+ lp_copy_service(DEFAULTS_SNUM, share);
+ snum = lp_servicenumber(share);
+ lp_do_parameter(snum, "print ok", "Yes");
+ save_reload();
+ snum = lp_servicenumber(share);
+ }
+
+ printf("<FORM method=post>\n");
+
+ printf("<table>\n");
+ printf("<tr><td><input type=submit name=selectshare value=\"Choose Printer\"></td>\n");
+ printf("<td><select name=share>\n");
+ if (snum < 0 || !lp_print_ok(snum))
+ printf("<option value=\" \"> \n");
+ for (i=0;i<lp_numservices();i++) {
+ s = lp_servicename(i);
+ if (s && (*s) && strcmp(s,"IPC$") && lp_print_ok(i)) {
+ printf("<option %s value=\"%s\">%s\n",
+ (share && strcmp(share,s)==0)?"SELECTED":"",
+ s, s);
+ }
+ }
+ printf("</select></td></tr><p>");
+
+ printf("<tr><td><input type=submit name=createshare value=\"Create Printer\"></td>\n");
+ printf("<td><input type=text size=30 name=newshare></td></tr>\n");
+ printf("</table>");
+
+
+ if (snum >= 0) {
+ printf("<input type=submit name=\"Commit\" value=\"Commit Changes\">\n");
+ printf("<input type=submit name=\"Delete\" value=\"Delete Printer\">\n");
+ if (advanced == 0) {
+ printf("<input type=submit name=\"Advanced\" value=\"Advanced View\">\n");
+ } else {
+ printf("<input type=submit name=\"Basic\" value=\"Basic View\">\n");
+ }
+ printf("<p>\n");
+ }
+
+ if (snum >= 0) {
+ show_parameters(snum, 1, advanced, 1);
+ }
+
+ if (advanced) {
+ printf("<input type=hidden name=\"Advanced\" value=1>\n");
+ }
+
+ printf("</FORM>\n");
+}
+
+
+int main(int argc, char *argv[])
+{
+ extern char *optarg;
+ extern int optind;
+ extern FILE *dbf;
+ int opt;
+ char *page;
+
+ /* just in case it goes wild ... */
+ alarm(300);
+
+ dbf = fopen("/dev/null", "w");
+
+ if (!dbf) dbf = stderr;
+
+ cgi_setup(SWATDIR);
+
+ while ((opt = getopt(argc, argv,"s:")) != EOF) {
+ switch (opt) {
+ case 's':
+ pstrcpy(servicesf,optarg);
+ break;
+ }
+ }
+
+
+ print_header();
+
+ charset_initialise();
+
+ /* if this binary is setuid then run completely as root */
+ setuid(0);
+
+ load_config();
+
+ cgi_load_variables(NULL);
+
+ show_main_buttons();
+
+ page = cgi_baseurl();
+
+ if (strcmp(page, "globals")==0) {
+ globals_page();
+ } else if (strcmp(page,"shares")==0) {
+ shares_page();
+ } else if (strcmp(page,"printers")==0) {
+ printers_page();
+ } else {
+ welcome_page();
+ }
+
+ print_footer();
+ return 0;
+}
+
+
diff --git a/source3/web/cgi.c b/source3/web/cgi.c
index ae60d72b7b..7c84f47ada 100644
--- a/source3/web/cgi.c
+++ b/source3/web/cgi.c
@@ -43,6 +43,7 @@ static int content_length;
static int request_post;
static int request_get;
static char *query_string;
+static char *baseurl;
static void unescape(char *buf)
{
@@ -610,12 +611,20 @@ void cgi_setup(char *rootdir)
*p = 0;
}
- if (strcmp(url,"/")) {
+ if (strstr(url+1,"..")==0 && file_exist(url+1)) {
cgi_download(url+1);
}
printf("HTTP/1.1 200 OK\r\nConnection: close\r\n");
-
+
+ baseurl = url+1;
}
+/***************************************************************************
+return the current pages URL
+ ***************************************************************************/
+char *cgi_baseurl(void)
+{
+ return baseurl;
+}
diff --git a/source3/web/swat.c b/source3/web/swat.c
new file mode 100644
index 0000000000..4810d87af3
--- /dev/null
+++ b/source3/web/swat.c
@@ -0,0 +1,483 @@
+/*
+ Unix SMB/Netbios implementation.
+ Version 1.9.
+ html smb.conf editing - prototype only
+ Copyright (C) Andrew Tridgell 1997-1998
+
+ 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.
+*/
+
+#ifdef SYSLOG
+#undef SYSLOG
+#endif
+
+#include "includes.h"
+#include "smb.h"
+
+#define GLOBALS_SNUM -2
+#define DEFAULTS_SNUM -1
+
+static pstring servicesf = CONFIGFILE;
+
+
+/* start the page with standard stuff */
+static void print_header(void)
+{
+ printf("Content-type: text/html\r\n\r\n");
+ printf("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n");
+ printf("<HTML>\n<HEAD>\n<TITLE>Samba Web Administration Tool</TITLE>\n</HEAD>\n<BODY>\n\n");
+}
+
+
+/* finish off the page */
+static void print_footer(void)
+{
+ printf("\n</BODY>\n</HTML>\n");
+}
+
+/* include a lump of html in a page */
+static void include_html(char *fname)
+{
+ FILE *f = fopen(fname,"r");
+ char buf[1024];
+ int ret;
+
+ if (!f) {
+ printf("ERROR: Can't open %s\n", fname);
+ return;
+ }
+
+ while (!feof(f)) {
+ ret = fread(buf, 1, sizeof(buf), f);
+ if (ret <= 0) break;
+ fwrite(buf, 1, ret, stdout);
+ }
+
+ fclose(f);
+}
+
+
+/* display one editable parameter */
+static void show_parameter(int snum, struct parm_struct *parm)
+{
+ int i;
+ void *ptr = parm->ptr;
+
+ if (parm->class == P_LOCAL) {
+ ptr = lp_local_ptr(snum, ptr);
+ }
+
+ printf("<tr><td><A HREF=\"help/parameters.html#%s\">?</A> %s</td><td>",
+ parm->label, parm->label);
+
+ switch (parm->type) {
+ case P_CHAR:
+ printf("<input type=text size=2 name=\"parm_%s\" value=\"%c\">",
+ parm->label, *(char *)ptr);
+ break;
+
+ case P_STRING:
+ case P_USTRING:
+ printf("<input type=text size=40 name=\"parm_%s\" value=\"%s\">",
+ parm->label, *(char **)ptr);
+ break;
+
+ case P_GSTRING:
+ case P_UGSTRING:
+ printf("<input type=text size=40 name=\"parm_%s\" value=\"%s\">",
+ parm->label, (char *)ptr);
+ break;
+
+ case P_BOOL:
+ printf("<input type=radio name=\"parm_%s\" value=Yes %s>yes&nbsp;&nbsp;", parm->label, (*(BOOL *)ptr)?"CHECKED":"");
+ printf("<input type=radio name=\"parm_%s\" value=No %s>no", parm->label, (*(BOOL *)ptr)?"":"CHECKED");
+ break;
+
+ case P_BOOLREV:
+ printf("<input type=radio name=\"parm_%s\" value=Yes %s>yes&nbsp;&nbsp;", parm->label, (*(BOOL *)ptr)?"":"CHECKED");
+ printf("<input type=radio name=\"parm_%s\" value=No %s>no", parm->label, (*(BOOL *)ptr)?"CHECKED":"");
+ break;
+
+ case P_INTEGER:
+ printf("<input type=text size=8 name=\"parm_%s\" value=%d>", parm->label, *(int *)ptr);
+ break;
+
+ case P_OCTAL:
+ printf("<input type=text size=8 name=\"parm_%s\" value=0%o>", parm->label, *(int *)ptr);
+ break;
+
+ case P_ENUM:
+ for (i=0;parm->enum_list[i].name;i++)
+ printf("<input type=radio name=\"parm_%s\" value=%s %s>%s&nbsp;&nbsp;",
+ parm->label, parm->enum_list[i].name,
+ (*(int *)ptr)==parm->enum_list[i].value?"CHECKED":"",
+ parm->enum_list[i].name);
+ break;
+
+ }
+ printf("</td></tr>\n");
+}
+
+/* display a set of parameters for a service */
+static void show_parameters(int snum, int allparameters, int advanced, int printers)
+{
+ int i = 0;
+ struct parm_struct *parm;
+
+ printf("<table>\n");
+
+ while ((parm = lp_next_parameter(snum, &i, allparameters))) {
+ if (parm->flags & FLAG_HIDE) continue;
+ if (!advanced) {
+ if (!printers && !(parm->flags & FLAG_BASIC)) continue;
+ if (printers && !(parm->flags & FLAG_PRINT)) continue;
+ }
+ show_parameter(snum, parm);
+ }
+ printf("</table>\n");
+}
+
+
+static int save_reload(void)
+{
+ FILE *f;
+
+ f = fopen(servicesf,"w");
+ if (!f) {
+ printf("failed to open %s for writing\n", servicesf);
+ return 0;
+ }
+
+ fprintf(f, "# Samba config file created using SWAT\n");
+
+ lp_dump(f);
+
+ fclose(f);
+
+ lp_killunused(NULL);
+
+ if (!lp_load(servicesf,False)) {
+ printf("Can't reload %s\n", servicesf);
+ return 0;
+ }
+
+ return 1;
+}
+
+
+
+/* commit a set of parameters for a service */
+static void commit_parameters(int snum)
+{
+ int i = 0;
+ struct parm_struct *parm;
+ pstring label;
+ char *v;
+
+ while ((parm = lp_next_parameter(snum, &i, 1))) {
+ sprintf(label, "parm_%s", parm->label);
+ if ((v = cgi_variable(label))) {
+ lp_do_parameter(snum, parm->label, v);
+ }
+ }
+
+ save_reload();
+}
+
+
+/* load the smb.conf file into loadparm. */
+static void load_config(void)
+{
+ if (!lp_load(servicesf,False)) {
+ printf("<b>Can't load %s - using defaults</b><p>\n",
+ servicesf);
+ }
+}
+
+/* spit out the html for a link with an image */
+static void image_link(char *name,char *hlink, char *src, int width, int height)
+{
+ printf("<A HREF=\"%s\"><img width=%d height=%d src=\"%s\" alt=\"%s\"></A>\n", hlink, width, height, src, name);
+}
+
+/* display the main navigation controls at the top of each page along
+ with a title */
+static void show_main_buttons(void)
+{
+ printf("<H2 align=center>Samba Web Administration Tool</H2>\n");
+
+ image_link("Globals", "globals", "images/globals.gif", 50, 50);
+ image_link("Shares", "shares", "images/shares.gif", 50, 50);
+ image_link("Printers", "printers", "images/printers.gif", 50, 50);
+
+ printf("<HR>\n");
+}
+
+/* display a welcome page */
+static void welcome_page(void)
+{
+ include_html("help/welcome.html");
+}
+
+
+/* display a globals editing page */
+static void globals_page(void)
+{
+ int advanced = 0;
+
+ printf("<H2>Global Variables</H2>\n");
+
+ if (cgi_variable("Advanced") && !cgi_variable("Basic"))
+ advanced = 1;
+
+ if (cgi_variable("Commit")) {
+ commit_parameters(GLOBALS_SNUM);
+ }
+
+ printf("<FORM method=post>\n");
+
+ printf("<input type=submit name=\"Commit\" value=\"Commit Changes\">\n");
+ if (advanced == 0) {
+ printf("<input type=submit name=\"Advanced\" value=\"Advanced View\">\n");
+ } else {
+ printf("<input type=submit name=\"Basic\" value=\"Basic View\">\n");
+ }
+ printf("<p>\n");
+
+ show_parameters(GLOBALS_SNUM, 1, advanced, 0);
+
+ if (advanced) {
+ printf("<input type=hidden name=\"Advanced\" value=1>\n");
+ }
+
+ printf("</form>\n");
+}
+
+/* display a shares editing page */
+static void shares_page(void)
+{
+ char *share = cgi_variable("share");
+ char *s;
+ int snum=-1;
+ int i;
+ int advanced = 0;
+
+ if (share)
+ snum = lp_servicenumber(share);
+
+ printf("<H2>Share Parameters</H2>\n");
+
+ if (cgi_variable("Advanced") && !cgi_variable("Basic"))
+ advanced = 1;
+
+ if (cgi_variable("Commit") && snum >= 0) {
+ commit_parameters(snum);
+ }
+
+ if (cgi_variable("Delete") && snum >= 0) {
+ lp_remove_service(snum);
+ save_reload();
+ share = NULL;
+ snum = -1;
+ }
+
+ if (cgi_variable("createshare") && (share=cgi_variable("newshare"))) {
+ lp_copy_service(DEFAULTS_SNUM, share);
+ save_reload();
+ snum = lp_servicenumber(share);
+ }
+
+ printf("<FORM method=post>\n");
+
+ printf("<table>\n");
+ printf("<tr><td><input type=submit name=selectshare value=\"Choose Share\"></td>\n");
+ printf("<td><select name=share>\n");
+ if (snum < 0)
+ printf("<option value=\" \"> \n");
+ for (i=0;i<lp_numservices();i++) {
+ s = lp_servicename(i);
+ if (s && (*s) && strcmp(s,"IPC$")) {
+ printf("<option %s value=\"%s\">%s\n",
+ (share && strcmp(share,s)==0)?"SELECTED":"",
+ s, s);
+ }
+ }
+ printf("</select></td></tr><p>");
+
+ printf("<tr><td><input type=submit name=createshare value=\"Create Share\"></td>\n");
+ printf("<td><input type=text size=30 name=newshare></td></tr>\n");
+ printf("</table>");
+
+
+ if (snum >= 0) {
+ printf("<input type=submit name=\"Commit\" value=\"Commit Changes\">\n");
+ printf("<input type=submit name=\"Delete\" value=\"Delete Share\">\n");
+ if (advanced == 0) {
+ printf("<input type=submit name=\"Advanced\" value=\"Advanced View\">\n");
+ } else {
+ printf("<input type=submit name=\"Basic\" value=\"Basic View\">\n");
+ }
+ printf("<p>\n");
+ }
+
+ if (snum >= 0) {
+ show_parameters(snum, 1, advanced, 0);
+ }
+
+ if (advanced) {
+ printf("<input type=hidden name=\"Advanced\" value=1>\n");
+ }
+
+ printf("</FORM>\n");
+}
+
+
+/* display a printers editing page */
+static void printers_page(void)
+{
+ char *share = cgi_variable("share");
+ char *s;
+ int snum=-1;
+ int i;
+ int advanced = 0;
+
+ if (share)
+ snum = lp_servicenumber(share);
+
+ printf("<H2>Printer Parameters</H2>\n");
+
+ if (cgi_variable("Advanced") && !cgi_variable("Basic"))
+ advanced = 1;
+
+ if (cgi_variable("Commit") && snum >= 0) {
+ commit_parameters(snum);
+ }
+
+ if (cgi_variable("Delete") && snum >= 0) {
+ lp_remove_service(snum);
+ save_reload();
+ share = NULL;
+ snum = -1;
+ }
+
+ if (cgi_variable("createshare") && (share=cgi_variable("newshare"))) {
+ lp_copy_service(DEFAULTS_SNUM, share);
+ snum = lp_servicenumber(share);
+ lp_do_parameter(snum, "print ok", "Yes");
+ save_reload();
+ snum = lp_servicenumber(share);
+ }
+
+ printf("<FORM method=post>\n");
+
+ printf("<table>\n");
+ printf("<tr><td><input type=submit name=selectshare value=\"Choose Printer\"></td>\n");
+ printf("<td><select name=share>\n");
+ if (snum < 0 || !lp_print_ok(snum))
+ printf("<option value=\" \"> \n");
+ for (i=0;i<lp_numservices();i++) {
+ s = lp_servicename(i);
+ if (s && (*s) && strcmp(s,"IPC$") && lp_print_ok(i)) {
+ printf("<option %s value=\"%s\">%s\n",
+ (share && strcmp(share,s)==0)?"SELECTED":"",
+ s, s);
+ }
+ }
+ printf("</select></td></tr><p>");
+
+ printf("<tr><td><input type=submit name=createshare value=\"Create Printer\"></td>\n");
+ printf("<td><input type=text size=30 name=newshare></td></tr>\n");
+ printf("</table>");
+
+
+ if (snum >= 0) {
+ printf("<input type=submit name=\"Commit\" value=\"Commit Changes\">\n");
+ printf("<input type=submit name=\"Delete\" value=\"Delete Printer\">\n");
+ if (advanced == 0) {
+ printf("<input type=submit name=\"Advanced\" value=\"Advanced View\">\n");
+ } else {
+ printf("<input type=submit name=\"Basic\" value=\"Basic View\">\n");
+ }
+ printf("<p>\n");
+ }
+
+ if (snum >= 0) {
+ show_parameters(snum, 1, advanced, 1);
+ }
+
+ if (advanced) {
+ printf("<input type=hidden name=\"Advanced\" value=1>\n");
+ }
+
+ printf("</FORM>\n");
+}
+
+
+int main(int argc, char *argv[])
+{
+ extern char *optarg;
+ extern int optind;
+ extern FILE *dbf;
+ int opt;
+ char *page;
+
+ /* just in case it goes wild ... */
+ alarm(300);
+
+ dbf = fopen("/dev/null", "w");
+
+ if (!dbf) dbf = stderr;
+
+ cgi_setup(SWATDIR);
+
+ while ((opt = getopt(argc, argv,"s:")) != EOF) {
+ switch (opt) {
+ case 's':
+ pstrcpy(servicesf,optarg);
+ break;
+ }
+ }
+
+
+ print_header();
+
+ charset_initialise();
+
+ /* if this binary is setuid then run completely as root */
+ setuid(0);
+
+ load_config();
+
+ cgi_load_variables(NULL);
+
+ show_main_buttons();
+
+ page = cgi_baseurl();
+
+ if (strcmp(page, "globals")==0) {
+ globals_page();
+ } else if (strcmp(page,"shares")==0) {
+ shares_page();
+ } else if (strcmp(page,"printers")==0) {
+ printers_page();
+ } else {
+ welcome_page();
+ }
+
+ print_footer();
+ return 0;
+}
+
+