148 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
Hello Marek,
 | 
						|
 | 
						|
I have created a diffile against the 980403 release that adds
 | 
						|
functionality to newusers for automatic handling of users with only
 | 
						|
anonomous ftp login (using the guestgroup feature in ftpaccess, which
 | 
						|
means that the users home directory looks like '/home/user/./'). It also
 | 
						|
adds a commandline argument to specify an initial directory structure
 | 
						|
for such users, with a tarball normally containing the bin,lib,etc
 | 
						|
directories used in the chrooted environment.
 | 
						|
 | 
						|
I am using it to automatically create chunks of users with only ftp
 | 
						|
access for a webserver.
 | 
						|
 | 
						|
I have tried to follow your coding standards and I believe it is bug
 | 
						|
free but.. well, who knows. :) It's not much code however.
 | 
						|
 | 
						|
I hope you find it useful. Do what you like with it, feel free to ask if
 | 
						|
anything is unclear.
 | 
						|
 | 
						|
Best rgds,
 | 
						|
  Calle Karlsson
 | 
						|
  ckn@kash.se
 | 
						|
 | 
						|
diff -uNr shadow-980403.orig/src/newusers.c shadow-980403/src/newusers.c
 | 
						|
--- shadow-980403.orig/src/newusers.c	Fri Jan 30 00:22:43 1998
 | 
						|
+++ shadow-980403/src/newusers.c	Fri Apr 17 16:55:33 1998
 | 
						|
@@ -76,11 +76,35 @@
 | 
						|
 static void
 | 
						|
 usage(void)
 | 
						|
 {
 | 
						|
-	fprintf(stderr, "Usage: %s [ input ]\n", Prog);
 | 
						|
+	fprintf (stderr, "Usage: %s [-p prototype tarfile] [ input ]\n", Prog);
 | 
						|
+	fprintf (stderr, "The prototype tarfile is only used for users\n");
 | 
						|
+	fprintf (stderr, "marked as anonymous ftp users. It must be a full pathname.\n");
 | 
						|
 	exit(1);
 | 
						|
 }
 | 
						|
 
 | 
						|
 /*
 | 
						|
+ * createuserdir - create a directory and chmod it
 | 
						|
+ */
 | 
						|
+
 | 
						|
+static int
 | 
						|
+createuserdir (char * dir, int uid, int gid, int line)
 | 
						|
+{
 | 
						|
+	if (mkdir (dir, 0777 & ~getdef_num("UMASK", 077))) {
 | 
						|
+		fprintf (stderr, "%s: line %d: mkdir %s failed\n",
 | 
						|
+			 Prog, line, dir);
 | 
						|
+		return -1;
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	if (chown (dir, uid, gid)) {
 | 
						|
+		fprintf (stderr, "%s: line %d: chown %s failed\n",
 | 
						|
+			 Prog, line, dir);
 | 
						|
+		return -1;
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	return 0;
 | 
						|
+}
 | 
						|
+
 | 
						|
+/*
 | 
						|
  * add_group - create a new group or add a user to an existing group
 | 
						|
  */
 | 
						|
 
 | 
						|
@@ -328,6 +352,8 @@
 | 
						|
 main(int argc, char **argv)
 | 
						|
 {
 | 
						|
 	char	buf[BUFSIZ];
 | 
						|
+	char	anonproto[BUFSIZ];
 | 
						|
+	int	flag;
 | 
						|
 	char	*fields[8];
 | 
						|
 	int	nfields;
 | 
						|
 	char	*cp;
 | 
						|
@@ -340,12 +366,23 @@
 | 
						|
 
 | 
						|
 	Prog = Basename(argv[0]);
 | 
						|
 
 | 
						|
-	if (argc > 1 && argv[1][0] == '-')
 | 
						|
-		usage ();
 | 
						|
+	* anonproto = '\0';
 | 
						|
+
 | 
						|
+	while ((flag = getopt (argc, argv, "p:h")) != EOF) {
 | 
						|
+		switch (flag) {
 | 
						|
+		case 'p':
 | 
						|
+			STRFCPY(anonproto, optarg);
 | 
						|
+			break;
 | 
						|
+		case 'h':
 | 
						|
+		default:
 | 
						|
+			usage ();
 | 
						|
+			break;
 | 
						|
+		}
 | 
						|
+	}
 | 
						|
 
 | 
						|
-	if (argc == 2) {
 | 
						|
-		if (! freopen (argv[1], "r", stdin)) {
 | 
						|
-			snprintf(buf, sizeof buf, "%s: %s", Prog, argv[1]);
 | 
						|
+	if (optind < argc) {
 | 
						|
+		if (! freopen (argv[optind], "r", stdin)) {
 | 
						|
+			snprintf(buf, sizeof buf, "%s: %s", Prog, argv[optind]);
 | 
						|
 			perror (buf);
 | 
						|
 			exit (1);
 | 
						|
 		}
 | 
						|
@@ -499,15 +536,36 @@
 | 
						|
 		if (fields[6][0])
 | 
						|
 			newpw.pw_shell = fields[6];
 | 
						|
 
 | 
						|
-		if (newpw.pw_dir[0] && access(newpw.pw_dir, F_OK)) {
 | 
						|
-			if (mkdir (newpw.pw_dir,
 | 
						|
-					0777 & ~getdef_num("UMASK", 077)))
 | 
						|
-				fprintf (stderr, "%s: line %d: mkdir failed\n",
 | 
						|
-					Prog, line);
 | 
						|
-			else if (chown (newpw.pw_dir,
 | 
						|
-					newpw.pw_uid, newpw.pw_gid))
 | 
						|
-				fprintf (stderr, "%s: line %d: chown failed\n",
 | 
						|
-					Prog, line);
 | 
						|
+		if (newpw.pw_dir[0]) {
 | 
						|
+		        char * userdir = strdup (newpw.pw_dir);
 | 
						|
+			char * anonpart;
 | 
						|
+			int rc;
 | 
						|
+
 | 
						|
+			if ((anonpart = strstr (userdir, "/./"))) {
 | 
						|
+			        * anonpart = '\0';
 | 
						|
+				anonpart += 2;
 | 
						|
+			}
 | 
						|
+			
 | 
						|
+			if (access(userdir, F_OK))
 | 
						|
+				rc = createuserdir (userdir, newpw.pw_uid, newpw.pw_gid, line);
 | 
						|
+			else
 | 
						|
+				rc = 0;
 | 
						|
+
 | 
						|
+			if (rc == 0 && anonpart) {
 | 
						|
+				if (* anonproto) {
 | 
						|
+					char cmdbuf [BUFSIZ];
 | 
						|
+					snprintf(cmdbuf, sizeof cmdbuf,
 | 
						|
+						 "cd %s; tar xf %s",
 | 
						|
+						 userdir, anonproto);
 | 
						|
+					system (cmdbuf);
 | 
						|
+				}
 | 
						|
+				if (strlen (anonpart) > 1) {
 | 
						|
+					strcat (userdir, anonpart);
 | 
						|
+					if (access (userdir, F_OK))
 | 
						|
+						createuserdir (userdir, newpw.pw_uid, newpw.pw_gid, line);
 | 
						|
+				}
 | 
						|
+			}
 | 
						|
+			free (userdir);
 | 
						|
 		}
 | 
						|
 
 | 
						|
 		/*
 |