svn commit: samba r12029 - in trunk/source/param: .

jra at samba.org jra at samba.org
Fri Dec 2 20:13:10 GMT 2005


Author: jra
Date: 2005-12-02 20:13:09 +0000 (Fri, 02 Dec 2005)
New Revision: 12029

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=12029

Log:
Ensure we reset mod time on usershare service. Add a
parameter "usershare template share" to allow admins
to configure a template for all user shares.
Jeremy.

Modified:
   trunk/source/param/loadparm.c


Changeset:
Modified: trunk/source/param/loadparm.c
===================================================================
--- trunk/source/param/loadparm.c	2005-12-02 20:08:51 UTC (rev 12028)
+++ trunk/source/param/loadparm.c	2005-12-02 20:13:09 UTC (rev 12029)
@@ -189,6 +189,7 @@
 	char *szManglingMethod;
 	char **szServicesList;
 	char *szUsersharePath;
+	char *szUsershareTemplateShare;
 	int mangle_prefix;
 	int max_log_size;
 	char *szLogLevel;
@@ -1220,6 +1221,7 @@
 	{"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
 	{"usershare max shares", P_INTEGER, P_GLOBAL, &Globals.iUsershareMaxShares, NULL, NULL, FLAG_ADVANCED},
 	{"usershare path", P_STRING, P_GLOBAL, &Globals.szUsersharePath, NULL, NULL, FLAG_ADVANCED},
+	{"usershare template share", P_STRING, P_GLOBAL, &Globals.szUsershareTemplateShare, NULL, NULL, FLAG_ADVANCED},
 	{"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE }, 
 	{"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
 	{"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
@@ -1638,6 +1640,7 @@
 
 	/* User defined shares. */
 	string_set(&Globals.szUsersharePath, "");
+	string_set(&Globals.szUsershareTemplateShare, "");
 	Globals.iUsershareMaxShares = 0;
 }
 
@@ -1825,7 +1828,6 @@
 FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
 FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)
 
-FN_GLOBAL_STRING(lp_usershare_path, &Globals.szUsersharePath)
 FN_GLOBAL_LIST(lp_eventlog_list, &Globals.szEventLogs)
 
 FN_GLOBAL_BOOL(lp_disable_netbios, &Globals.bDisableNetbios)
@@ -4240,7 +4242,7 @@
 	    with permissions to share directory etc.
 ***************************************************************************/
 
-static int process_usershare_file(const char *dir_name, const char *file_name)
+static int process_usershare_file(const char *dir_name, const char *file_name, int snum_template)
 {
 	SMB_STRUCT_STAT sbuf;
 	pstring fname;
@@ -4353,9 +4355,14 @@
 
 	SAFE_FREE(lines);
 
-	/* Everything ok - add the service. */
+	/* Everything ok - add the service possibly using a template. */
 	if (snum <= 0) {
-		if ((snum = add_a_service(&sDefault, service_name)) < 0) {
+		const service *sp = &sDefault;
+		if (snum_template != -1) {
+			sp = ServicePtrs[snum_template];
+		}
+
+		if ((snum = add_a_service(sp, service_name)) < 0) {
 			DEBUG(0, ("process_usershare_file: Failed to add "
 				"new service %s\n", service_name));
 			talloc_destroy(ctx);
@@ -4367,8 +4374,15 @@
 
 	talloc_destroy(ctx);
 
+	/* If from a template it may be marked invalid. */
+	ServicePtrs[snum]->valid = True;
+
 	/* Set the service as a valid usershare. */
 	ServicePtrs[snum]->usershare = USERSHARE_VALID;
+
+	/* And note when it was loaded. */
+	ServicePtrs[snum]->usershare_last_mod = sbuf.st_mtime;
+
 	return 0;
 }
 
@@ -4385,6 +4399,7 @@
 	unsigned int num_dir_entries, num_bad_dir_entries;
 	unsigned int allowed_bad_entries = ((2*max_user_shares)/10);
 	int iService;
+	int snum_template = -1;
 
 	add_to_file_list(usersharepath, usersharepath);
 
@@ -4409,6 +4424,26 @@
 		return;
 	}
 
+	/* Ensure the template share exists if it's set. */
+	if (Globals.szUsershareTemplateShare[0]) {
+		/* We can't use lp_servicenumber here as we are recommending that
+		   template shares have -valid=False set. */
+		for (snum_template = iNumServices - 1; snum_template >= 0; snum_template--) {
+			if (ServicePtrs[snum_template]->szService &&
+					strequal(ServicePtrs[snum_template]->szService,
+						Globals.szUsershareTemplateShare)) {
+				break;
+			}
+		}
+
+		if (snum_template == -1) {
+			DEBUG(0,("process_usershare_directory: usershare template share %s "
+				"does not exist.\n",
+				Globals.szUsershareTemplateShare ));
+			return;
+		}
+	}
+
 	/* Mark all existing usershares as pending delete. */
 	for (iService = iNumServices - 1; iService >= 0; iService--) {
 		if (VALID(iService) && ServicePtrs[iService]->usershare) {
@@ -4426,7 +4461,7 @@
 	for (num_dir_entries = 0, num_bad_dir_entries = 0;
 			(de = sys_readdir(dp));
 			num_dir_entries++ ) {
-		int ret = process_usershare_file(usersharepath, de->d_name);
+		int ret = process_usershare_file(usersharepath, de->d_name, snum_template);
 		if (ret == 0) {
 			num_usershares++;
 			if (num_usershares >= max_user_shares) {



More information about the samba-cvs mailing list