changeset 1159:f1c924e08e63 draft

Attached is an implementation for groupdel. This is aliased to delgroup, for a requirement at my end. Also lib/password.c is modified to along with.
author Ashwini Sharma <ak.ashwini1981@gmail.com>
date Mon, 23 Dec 2013 07:23:28 -0600
parents 81c64569c16e
children a2a7eb0dd933
files lib/password.c toys/pending/groupdel.c
diffstat 2 files changed, 81 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/lib/password.c	Mon Dec 23 07:19:07 2013 -0600
+++ b/lib/password.c	Mon Dec 23 07:23:28 2013 -0600
@@ -118,6 +118,7 @@
  * 2. complete entry for user details, when creating new user
  * 3. group members comma',' separated list, when adding user to group
  * 4. complete entry for group details, when creating new group
+ * 5. entry = NULL, delete the named entry user/group
  */
 int update_password(char *filename, char* username, char* entry)
 {
@@ -167,7 +168,7 @@
   {
     if (strncmp(line, namesfx, strlen(namesfx)))
       fprintf(newfp, "%s\n", line);
-    else {
+    else if (entry) {
       char *current_ptr = NULL;
 
       found = 1;
@@ -180,7 +181,9 @@
           fprintf(newfp, "%s\n",current_ptr);
         } else fprintf(newfp, "%s\n",current_ptr);
       } else if (!strcmp(toys.which->name, "groupadd") || 
-          !strcmp(toys.which->name, "addgroup")){
+          !strcmp(toys.which->name, "addgroup") ||
+          !strcmp(toys.which->name, "delgroup") ||
+          !strcmp(toys.which->name, "groupdel")){
         current_ptr = get_nextcolon(line, 3); //past gid/admin list
         *current_ptr = '\0';
         fprintf(newfp, "%s", line);
@@ -190,7 +193,7 @@
     free(line);
   }
   free(namesfx);
-  if (!found) fprintf(newfp, "%s\n", entry);
+  if (!found && entry) fprintf(newfp, "%s\n", entry);
   fcntl(fileno(exfp), F_SETLK, &lock);
   fclose(exfp);
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toys/pending/groupdel.c	Mon Dec 23 07:23:28 2013 -0600
@@ -0,0 +1,75 @@
+/* groupdel.c - delete a group
+ *
+ * Copyright 2013 Ashwini Kumar <ak.ashwini1981@gmail.com>
+ * Copyright 2013 Kyungwan Han <asura321@gmail.com>
+ *
+ * See http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/groupdel.html
+
+USE_GROUPDEL(NEWTOY(groupdel, "<1>2", TOYFLAG_NEEDROOT|TOYFLAG_SBIN))
+USE_GROUPDEL(OLDTOY(delgroup, groupdel, OPTSTR_groupdel, TOYFLAG_NEEDROOT|TOYFLAG_SBIN))
+
+config GROUPDEL
+  bool "groupdel"
+  default n
+  help
+    usage: delgroup [USER] GROUP
+    groupdel GROUP
+
+    Delete a group or delete a user from a group
+*/
+
+#define FOR_groupdel
+#include "toys.h"
+
+void groupdel_main(void)
+{
+  struct group *grp = NULL;
+  char *entry = NULL;
+
+  if (toys.optc == 2) {  //del user from group
+    //toys.optargs[0]- user, toys.optargs[1] - group
+    if (!getpwnam(toys.optargs[0])) 
+      error_exit("user '%s' does not exist", toys.optargs[0]);
+    if (!(grp = getgrnam(toys.optargs[1]))) 
+      error_exit("group '%s' does not exist", toys.optargs[1]);
+    if (!(grp = getgrnam(toys.optargs[1]))) 
+      error_exit("group '%s' does not exist", toys.optargs[1]);
+    if (!grp->gr_mem) return;
+    else {
+      int i, found = -1;
+
+      for (i = 0; grp->gr_mem[i] && (found == -1); i++)
+        if (!strcmp(grp->gr_mem[i], *toys.optargs)) found = i;
+
+      if (found == -1) {
+        xprintf("%s: The user '%s' is not a member of '%s'\n", toys.which->name,
+            toys.optargs[0], toys.optargs[1]);
+        return;
+      }
+      entry = xstrdup("");
+      for (i=0; grp->gr_mem[i]; i++) {
+        if (found != i) { //leave out user from grp member list
+          if (i && *entry) strcat(entry, ",");
+          entry = xrealloc(entry, strlen(entry) + strlen(grp->gr_mem[i]) + 2);
+          strcat(entry, grp->gr_mem[i]);
+        }
+      }
+    }
+  } else {    //delete the group
+    struct passwd *pw = NULL;
+
+    if (!(grp = getgrnam(*toys.optargs))) 
+      error_exit("group '%s' doesn't exist", *toys.optargs);
+    //is it a primary grp of user
+    while ((pw = getpwent())) {
+      if (pw->pw_gid == grp->gr_gid) {
+        endpwent();
+        error_exit("can't remove primary group of user '%s'", pw->pw_name);
+      }
+    }
+    endpwent();
+  }
+  update_password("/etc/group", grp->gr_name, entry);
+  update_password("/etc/gshadow", grp->gr_name, entry);
+  free(entry);
+}