Added configuration parameter 'vfs object' to specify loadable object
[samba.git] / source3 / param / loadparm.c
index ff8ccff99b615f64b86631577234f71d642c6d7e..2446520afb405b4e7cdee380cf3b89d64fba57eb 100644 (file)
@@ -231,6 +231,13 @@ typedef struct
   BOOL bNTPipeSupport;
   BOOL bStatCache;
   BOOL bKernelOplocks;
+#if defined(HAVE_MYSQL_H) && defined(WITH_MYSQLSAM)
+  char *sMysqlDatabase;
+  char *sMysqlTable;
+  char *sMysqlUser;
+  char *sMysqlHost;
+  char *sMysqlPassFile;
+#endif
 } global;
 
 static global Globals;
@@ -282,6 +289,7 @@ typedef struct
   char *writelist;
   char *volume;
   char *fstype;
+  char *vfsObjectFile;
   int  iMinPrintSpace;
   int  iCreate_mask;
   int  iCreate_force_mode;
@@ -375,6 +383,7 @@ static service sDefault =
   NULL,    /* writelist */
   NULL,    /* volume */
   NULL,    /* fstype */
+  NULL,    /* vfs object */
   0,       /* iMinPrintSpace */
   0744,    /* iCreate_mask */
   0000,    /* iCreate_force_mode */
@@ -442,6 +451,7 @@ static BOOL handle_include(char *pszParmValue, char **ptr);
 static BOOL handle_copy(char *pszParmValue, char **ptr);
 static BOOL handle_character_set(char *pszParmValue,char **ptr);
 static BOOL handle_coding_system(char *pszParmValue,char **ptr);
+static BOOL handle_vfs_object(char *pszParmValue, char **ptr);
 
 static void set_default_server_announce_type(void);
 
@@ -747,6 +757,14 @@ static struct parm_struct parm_table[] =
   {"ldap passwd file", P_STRING,  P_GLOBAL, &Globals.szLdapPasswdFile,  NULL,   NULL,  0},
 #endif /* WITH_LDAP */
 
+#if defined(HAVE_MYSQL_H) && defined(WITH_MYSQLSAM)
+  {"MySQL Options", P_SEP, P_SEPARATOR},
+  {"mysql host",       P_STRING, P_GLOBAL, &Globals.sMysqlHost,        NULL,   NULL,  0},
+  {"mysql user",       P_STRING, P_GLOBAL, &Globals.sMysqlUser,        NULL,   NULL,  0},
+  {"mysql pass file",  P_STRING, P_GLOBAL, &Globals.sMysqlPassFile,    NULL,   NULL,  0},
+  {"mysql database",   P_STRING, P_GLOBAL, &Globals.sMysqlDatabase,    NULL,   NULL,  0},
+  {"mysql table",      P_STRING, P_GLOBAL, &Globals.sMysqlTable,       NULL,   NULL,  0},
+#endif /* MYSQL */
 
   {"Miscellaneous Options", P_SEP, P_SEPARATOR},
 
@@ -779,6 +797,7 @@ static struct parm_struct parm_table[] =
   {"available",        P_BOOL,    P_LOCAL,  &sDefault.bAvailable,       NULL,   NULL,  0},
   {"volume",           P_STRING,  P_LOCAL,  &sDefault.volume,           NULL,   NULL,  0},
   {"fstype",           P_STRING,  P_LOCAL,  &sDefault.fstype,           NULL,   NULL,  0},
+  {"vfs object",       P_STRING,  P_LOCAL,  &sDefault.vfsObjectFile,    handle_vfs_object,   NULL,  0},
   {"set directory",    P_BOOLREV, P_LOCAL,  &sDefault.bNo_set_dir,      NULL,   NULL,  0},
   {"wide links",       P_BOOL,    P_LOCAL,  &sDefault.bWidelinks,       NULL,   NULL,  FLAG_GLOBAL},
   {"follow symlinks",  P_BOOL,    P_LOCAL,  &sDefault.bSymlinks,        NULL,   NULL,  FLAG_GLOBAL},
@@ -971,6 +990,14 @@ static void init_globals(void)
    */
   Globals.bKernelOplocks = True;
 
+#if defined(HAVE_MYSQL_H) && defined(WITH_MYSQLSAM)
+  string_set(&Globals.sMysqlHost,"localhost");
+  string_set(&Globals.sMysqlUser,"root");
+  string_set(&Globals.sMysqlPassFile,NULL);
+  string_set(&Globals.sMysqlDatabase,"samba");
+  string_set(&Globals.sMysqlTable,"smbpasswd");
+#endif
+
   /*
    * This must be done last as it checks the value in 
    * client_code_page.
@@ -1276,6 +1303,7 @@ FN_LOCAL_STRING(lp_force_group,force_group)
 FN_LOCAL_STRING(lp_readlist,readlist)
 FN_LOCAL_STRING(lp_writelist,writelist)
 FN_LOCAL_STRING(lp_fstype,fstype)
+FN_LOCAL_STRING(lp_vfsobj,vfsObjectFile)
 static FN_LOCAL_STRING(lp_volume,volume)
 FN_LOCAL_STRING(lp_mangled_map,szMangledMap)
 FN_LOCAL_STRING(lp_veto_files,szVetoFiles)
@@ -1329,6 +1357,13 @@ FN_LOCAL_INTEGER(lp_printing,iPrinting)
 
 FN_LOCAL_CHAR(lp_magicchar,magic_char)
 
+#if defined(HAVE_MYSQL_H) && defined(WITH_MYSQLSAM)
+FN_GLOBAL_STRING(lp_mysql_host,&Globals.sMysqlHost)
+FN_GLOBAL_STRING(lp_mysql_user,&Globals.sMysqlUser)
+FN_GLOBAL_STRING(lp_mysql_passfile,&Globals.sMysqlPassFile)
+FN_GLOBAL_STRING(lp_mysql_db,&Globals.sMysqlDatabase)
+FN_GLOBAL_STRING(lp_mysql_table,&Globals.sMysqlTable)
+#endif
 
 
 /* local prototypes */
@@ -1809,6 +1844,21 @@ BOOL lp_file_list_changed(void)
   return(False);
 }
 
+/***************************************************************************
+  handle the interpretation of the vfs object parameter
+  *************************************************************************/
+static BOOL handle_vfs_object(char *pszParmValue,char **ptr)
+{
+    /* Set string value */
+
+    string_set(ptr,pszParmValue);
+
+    /* Do any other initialisation required for vfs.  Note that
+       anything done here may have linking repercussions in nmbd. */
+
+    return True;
+}
+
 /***************************************************************************
   handle the interpretation of the coding system parameter
   *************************************************************************/
@@ -2620,15 +2670,64 @@ char *volume_label(int snum)
 ********************************************************************/
 static void set_default_server_announce_type(void)
 {
-  default_server_announce = (SV_TYPE_WORKSTATION | SV_TYPE_SERVER |
-                              SV_TYPE_SERVER_UNIX | SV_TYPE_PRINTQ_SERVER);
-  if(lp_announce_as() == ANNOUNCE_AS_NT)
-    default_server_announce |= (SV_TYPE_SERVER_NT | SV_TYPE_NT);
-  else if(lp_announce_as() == ANNOUNCE_AS_WIN95)
-    default_server_announce |= SV_TYPE_WIN95_PLUS;
-  else if(lp_announce_as() == ANNOUNCE_AS_WFW)
-    default_server_announce |= SV_TYPE_WFW;
-  default_server_announce |= (lp_time_server() ? SV_TYPE_TIME_SOURCE : 0);
+       default_server_announce = 0;
+       default_server_announce |= SV_TYPE_WORKSTATION;
+       default_server_announce |= SV_TYPE_SERVER;
+       default_server_announce |= SV_TYPE_SERVER_UNIX;
+       default_server_announce |= SV_TYPE_PRINTQ_SERVER;
+
+       switch (lp_announce_as())
+       {
+               case ANNOUNCE_AS_NT:
+               {
+                       default_server_announce |= SV_TYPE_SERVER_NT;
+                       default_server_announce |= SV_TYPE_NT;
+                       break;
+               }
+               case ANNOUNCE_AS_WIN95:
+               {
+                       default_server_announce |= SV_TYPE_WIN95_PLUS;
+                       break;
+               }
+               case ANNOUNCE_AS_WFW:
+               {
+                       default_server_announce |= SV_TYPE_WFW;
+                       break;
+               }
+               default:
+               {
+                       break;
+               }
+       }
+
+       switch (lp_server_role())
+       {
+               case ROLE_DOMAIN_MEMBER:
+               {
+                       default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
+                       break;
+               }
+               case ROLE_DOMAIN_PDC:
+               {
+                       default_server_announce |= SV_TYPE_DOMAIN_CTRL;
+                       break;
+               }
+               case ROLE_DOMAIN_BDC:
+               {
+                       default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
+                       break;
+               }
+               case ROLE_DOMAIN_NONE:
+               default:
+               {
+                       break;
+               }
+       }
+
+       if (lp_time_server())
+       {
+               default_server_announce |= SV_TYPE_TIME_SOURCE;
+       }
 }