int main(int argc, char *argv[]) { int xval = 0; struct passwd *pw; ngroups_max = sysconf(_SC_NGROUPS_MAX); if (ngroups_max < 0) { (void) fprintf(stderr, "groups: could not get configuration info\n"); exit(1); } if (ngroups_max == 0) exit(0); if (argc == 1) { if ((pw = getpwuid(getuid())) == NULL) { (void) fprintf(stderr, "groups: No passwd entry\n"); xval = 1; } else showgroups(pw); } else while (*++argv) { if ((pw = getpwnam(*argv)) == NULL) { (void) fprintf(stderr, "groups: %s : No such user\n", *argv); xval = 1; } else { if (argc > 2) (void) printf("%s : ", *argv); showgroups(pw); } } return (xval); }
/* try to join a group */ int joinagroup(int sock) { Packet * pkt; char bufr[MAXPKTLEN]; char * bufrptr; int bufrlen; char * gname; char * mname; /* send a list group request */ sendpkt(sock, LIST_GROUPS, 0, NULL); /* recv a list group reply */ pkt = recvpkt(sock); if (!pkt) { fprintf(stderr, "error: server died\n"); exit(1); } if (pkt->type != LIST_GROUPS) { fprintf(stderr, "error: unexpected reply from server\n"); exit(1); } /* display groups */ showgroups(pkt->lent, pkt->text); /* read in group name */ printf("which group? "); fgets(bufr, MAXPKTLEN, stdin); bufr[strlen(bufr)-1] = '\0'; /* may want to quit */ if (strcmp(bufr, "") == 0 || strncmp(bufr, QUIT_STRING, strlen(QUIT_STRING)) == 0) { close(sock); exit(0); } gname = strdup(bufr); /* read in member name */ printf("what nickname? "); fgets(bufr, MAXPKTLEN, stdin); bufr[strlen(bufr)-1] = '\0'; /* may want to quit */ if (strcmp(bufr, "") == 0 || strncmp(bufr, QUIT_STRING, strlen(QUIT_STRING)) == 0) { close(sock); exit(0); } mname = strdup(bufr); /* send a join group message */ bufrptr = bufr; strcpy(bufrptr, gname); bufrptr += strlen(bufrptr) + 1; strcpy(bufrptr, mname); bufrptr += strlen(bufrptr) + 1; bufrlen = bufrptr - bufr; sendpkt(sock, JOIN_GROUP, bufrlen, bufr); /* read the reply */ pkt = recvpkt(sock); if (!pkt) { fprintf(stderr, "error: server died\n"); exit(1); } if (pkt->type != JOIN_ACCEPTED && pkt->type != JOIN_REJECTED) { fprintf(stderr, "error: unexpected reply from server\n"); exit(1); } /* if rejected display the reason */ if (pkt->type == JOIN_REJECTED) { printf("admin: %s\n", pkt->text); free(gname); free(mname); return(0); } else { printf("admin: joined '%s' as '%s'\n", gname, mname); free(gname); free(mname); return(1); } }