after a few off-the-list exchanges with Daniel, i caught two bugs with
xuserset.

1) the supplied arguments were not parsed properly when trying to add a
single user with xuserset.

2) to add all the users from /etc/passwd, xuserset made a looping call
over getpwent() but xp_user_add did a getpwnam() to find the uid for
xcpu-admin which reset the passwd database causing it to go in an
infinite loop.

few more structural changes in xuserset & xgroupset.

-- 
Signed-off-by: Abhishek Kulkarni <[EMAIL PROTECTED]>
Index: utils/xgroupset.c
===================================================================
--- utils/xgroupset.c	(revision 722)
+++ utils/xgroupset.c	(working copy)
@@ -137,31 +137,29 @@
 	if (!strcmp("flush", cmd)) {
 		if (xp_group_flush(nds, adminkey) < 0)
 			goto error;
-	} else {
-		if (!strcmp("delete", cmd)) {			
-			if (groupfile) {
-				setgrent();
-				while ((gr = getgrent()) != NULL)
-					xp_group_del(nds, adminkey, gr->gr_name);
-				endgrent();
-			} else {
-				groupname = argv[optind++];
-				if (xp_group_del(nds, adminkey, groupname) < 0)
-					goto error;
-			}
-		} else { /* group add */
-			if (groupfile) {
-				setgrent();
-				while ((gr = getgrent()) != NULL)
-					xp_group_add(nds, adminkey, gr->gr_name, gr->gr_gid);
-				endgrent();
-			} else {
-				groupname = argv[optind++];
-				gid = strtol(argv[optind++], NULL, 10);
-				if (xp_group_add(nds, adminkey, groupname, gid) < 0)
-					goto error;
-			}
+	} else if (!strcmp("delete", cmd)) {
+		if (groupfile) {
+			setgrent();
+			while ((gr = getgrent()) != NULL)
+				xp_group_del(nds, adminkey, gr->gr_name);
+			endgrent();
+		} else {
+			groupname = argv[optind++];
+			if (xp_group_del(nds, adminkey, groupname) < 0)
+				goto error;
 		}
+	} else { /* group add */
+		if (groupfile) {
+			setgrent();
+			while ((gr = getgrent()) != NULL)
+				xp_group_add(nds, adminkey, gr->gr_name, gr->gr_gid);
+			endgrent();
+		} else {
+			groupname = argv[optind++];
+			gid = strtol(argv[optind++], NULL, 10);
+			if (xp_group_add(nds, adminkey, groupname, gid) < 0)
+				goto error;
+		}
 	}
 	return 0;
 error:
Index: utils/xuserset.c
===================================================================
--- utils/xuserset.c	(revision 722)
+++ utils/xuserset.c	(working copy)
@@ -175,55 +175,54 @@
 	if (!strcmp("flush", cmd)) {
 		if (xp_user_flush(nds, adminkey) < 0)
 			goto error;
-	} else {
-		if (!strcmp("delete", cmd)) {
-			if (passwdfile) {
-				setpwent();
-				while ((pw = getpwent()) != NULL)
-					xp_user_del(nds, adminkey, pw->pw_name);
-				endpwent();
-			} else {
-				username = argv[optind++];
-				if (xp_user_del(nds, adminkey, username) < 0)
-					goto error;
-			}
-		} else { /* user add */
-			if (passwdfile) {
-				setpwent();
-				while ((pw = getpwent()) != NULL) {
-					snprintf(ukeypath, sizeof(ukeypath), "%s/.ssh/id_rsa.pub", pw->pw_dir);
-					if (get_user_key(ukeypath, userkey, sizeof(userkey)) < 0) {
-						sp_suerror("get_user_key", errno);
-						continue;
-					}
-
-					if ((gr = getgrgid(pw->pw_gid)) == NULL) {
-						sp_suerror("get_user_key", errno);
-						continue;
-					}
-
-					xp_user_add(nds, adminkey, pw->pw_name, pw->pw_uid,
-						    gr->gr_name, userkey);
+	} else if (!strcmp("delete", cmd)) {
+		if (passwdfile) {
+			setpwent();
+			while ((pw = getpwent()) != NULL)
+				xp_user_del(nds, adminkey, pw->pw_name);
+			endpwent();
+		} else {
+			username = argv[optind++];
+			if (xp_user_del(nds, adminkey, username) < 0)
+				goto error;
+		}
+	} else { /* user add */
+		if (passwdfile) {
+			setpwent();
+			while ((pw = getpwent()) != NULL) {
+				snprintf(ukeypath, sizeof(ukeypath), "%s/.ssh/id_rsa.pub", pw->pw_dir);
+				if (get_user_key(ukeypath, userkey, sizeof(userkey)) < 0) {
+					sp_suerror("get_user_key", errno);
+					continue;
 				}
-				endpwent();
-			} else {
-				userid = strtol(argv[optind++], NULL, 10);
-				groupname = argv[optind++];
-
-				if (get_user_key(argv[optind++], userkey, sizeof(userkey)) < 0) {
+				
+				if ((gr = getgrgid(pw->pw_gid)) == NULL) {
 					sp_suerror("get_user_key", errno);
-					goto error;
+					continue;
 				}
-
-				if (xp_user_add(nds, adminkey, username, userid,
-						groupname, userkey) < 0)
-					goto error;
+				
+				xp_user_add(nds, adminkey, pw->pw_name, pw->pw_uid,
+					    gr->gr_name, userkey);
 			}
+			endpwent();
+		} else {
+			username = argv[optind++];
+			userid = strtol(argv[optind++], NULL, 10);
+			groupname = argv[optind++];
+			
+			if (get_user_key(argv[optind], userkey, sizeof(userkey)) < 0) {
+				sp_suerror("get_user_key", errno);
+				goto error;
+			}
+			
+			if (xp_user_add(nds, adminkey, username, userid,
+					groupname, userkey) < 0)
+				goto error;
 		}
 	}
 	return 0;
 error:
 	sp_rerror(&ename, &ecode);
 	fprintf(stderr, "Error: %s\n", ename);
-	return 1;
+	return -1;
 }
Index: libxcpu/user.c
===================================================================
--- libxcpu/user.c	(revision 722)
+++ libxcpu/user.c	(working copy)
@@ -143,7 +143,6 @@
 static inline Ubuf *
 ubuf_init(char *buf, int size, char *uname, u32 uid, char *gname, Xkey *adminkey)
 {
-	struct passwd *xcpu_admin;
 	Ubuf *upbuf = sp_malloc(sizeof(*upbuf));
 	if (!upbuf)
 		return NULL;
@@ -158,10 +157,6 @@
 	upbuf->adminuser = sp_malloc(sizeof(*upbuf->adminuser));
 	upbuf->adminuser->uname = strdup("xcpu-admin");
 	upbuf->adminuser->uid = 65530;
-	xcpu_admin = getpwnam(upbuf->adminuser->uname);
-	if (xcpu_admin)
-		upbuf->adminuser->uid = xcpu_admin->pw_uid;
-
 	return upbuf;
 }
 
Index: libxcpu/node.c
===================================================================
--- libxcpu/node.c	(revision 722)
+++ libxcpu/node.c	(working copy)
@@ -50,15 +50,8 @@
 #include "libxcpu.h"
 #include "xcpuimpl.h"
 
-/*
-static Spuser adminuser = {
-	.uname = "admin",
-	.uid = 0.
-};
-*/
+static Xpnodeerror *errorpool = NULL;
 
-static Xpnodeerror *errorpool;
-
 Xpnode *
 xp_node_create(char *name, char *addr, char *arch, char *status, int numjobs)
 {
@@ -162,18 +155,17 @@
 void 
 xp_nodeerror_print(char *prog)
 {
-	Xpnodeerror *ne, *pe;
-	
+	Xpnodeerror *ne = NULL, *pe = NULL;	
 	for(pe = NULL, ne = errorpool; ne != NULL; pe = ne, ne = ne->next) {
 		fprintf(stderr, "%s: %s: Error %d: %s\n",
 			prog, ne->node->name, ne->ecode, ne->ename);
 
 		errorpool = ne->next;
-		free(ne);
-		
-		if(pe != NULL)
+		if (pe)
 			free(pe);
 	}
+	if (pe)
+		free(pe);
 }
 
 /*

Reply via email to