📄 getpwent.c
字号:
return 1; } break; default:#ifdef S5EMUL if (strncmp(pw->pw_name, name, L_cuserid - 1) == 0)#else if (strcmp(pw->pw_name, name) == 0)#endif return 1; } return 0;}staticmatchuid(line1, pwp, uid, errstr) char line1[]; struct passwd **pwp; char **errstr;{ register struct _pwjunk *_pw = _pwjunk(); struct passwd *savepw; struct passwd *pw = *pwp; char group[256]; if (_pw == 0) return (0); switch(line1[0]) { case '+': if (strcmp(pw->pw_name, "+") == 0) { savepw = save(pw); pw = getuidfromyellow(uid, savepw, errstr); if (pw) { *pwp = pw; return 1; } else { return 0; } } if (line1[1] == '@') { (void) strcpy(group,pw->pw_name+2); savepw = save(pw); pw = getuidfromyellow(uid, savepw, errstr); if (pw && innetgr(group,(char *) NULL,pw->pw_name,domain)) { *pwp = pw; return 1; } else { return 0; } } savepw = save(pw); pw = getnamefromyellow(pw->pw_name+1, savepw, errstr); if (pw && pw->pw_uid == uid) { *pwp = pw; return 1; } else return 0; break; case '-': if (line1[1] == '@') { (void) strcpy(group,pw->pw_name+2); pw = getuidfromyellow(uid, &NULLPW, errstr); if (pw && innetgr(group,(char *) NULL,pw->pw_name,domain)) { *pwp = NULL; return 1; } } else if (uid == uidof(pw->pw_name+1, errstr)) { *pwp = NULL; return 1; } break; default: if (pw->pw_uid == uid) return 1; } return 0;}staticuidof(name, errstr) char *name; char **errstr;{ register struct _pwjunk *_pw = _pwjunk(); struct passwd *pw; if (_pw == 0) return (0); pw = getnamefromyellow(name, &NULLPW, errstr); if (pw) return pw->pw_uid; else return MAXINT;}staticgetnextfromyellow(){ register struct _pwjunk *_pw = _pwjunk(); int reason; char *key = NULL; int keylen; if (_pw == 0) return; reason = yp_next(domain, "passwd.byname",oldyp, oldyplen, &key ,&keylen,&yp,&yplen); if (reason) {#ifdef DEBUGfprintf(stderr, "reason yp_next failed is %d\n", reason);#endif yp = NULL; } if (oldyp) free(oldyp); oldyp = key; oldyplen = keylen;}staticgetfirstfromyellow(){ register struct _pwjunk *_pw = _pwjunk(); int reason; char *key = NULL; int keylen; if (_pw == 0) return; reason = yp_first(domain, "passwd.byname", &key, &keylen, &yp, &yplen); if (reason) {#ifdef DEBUGfprintf(stderr, "reason yp_first failed is %d\n", reason);#endif yp = NULL; } if (oldyp) free(oldyp); oldyp = key; oldyplen = keylen;}static struct passwd *getnamefromyellow(name, savepw, errstr) char *name; struct passwd *savepw; char **errstr;{ register struct _pwjunk *_pw = _pwjunk(); struct passwd *pw; int reason; char *val; int vallen; if (_pw == 0) return (0); reason = yp_match(domain, "passwd.byname", name, strlen(name) , &val, &vallen); if (reason) {#ifdef DEBUGfprintf(stderr, "reason yp_next failed is %d\n", reason);#endif return NULL; } else { pw = interpret(val, vallen, errstr); free(val); if (pw == NULL) return NULL; if (savepw->pw_passwd && *savepw->pw_passwd) pw->pw_passwd = savepw->pw_passwd; if (savepw->pw_age && *savepw->pw_age) pw->pw_age = savepw->pw_age; if (savepw->pw_gecos && *savepw->pw_gecos) pw->pw_gecos = savepw->pw_gecos; if (savepw->pw_dir && *savepw->pw_dir) pw->pw_dir = savepw->pw_dir; if (savepw->pw_shell && *savepw->pw_shell) pw->pw_shell = savepw->pw_shell; return pw; }}static struct passwd *getuidfromyellow(uid, savepw, errstr) int uid; struct passwd *savepw; char **errstr;{ register struct _pwjunk *_pw = _pwjunk(); struct passwd *pw; int reason; char *val; int vallen; char uidstr[20]; if (_pw == 0) return (0); (void) sprintf(uidstr, "%d", uid); reason = yp_match(domain, "passwd.byuid", uidstr, strlen(uidstr) , &val, &vallen); if (reason) {#ifdef DEBUGfprintf(stderr, "reason yp_next failed is %d\n", reason);#endif return NULL; } else { pw = interpret(val, vallen, errstr); free(val); if (pw == NULL) return NULL; if (savepw->pw_passwd && *savepw->pw_passwd) pw->pw_passwd = savepw->pw_passwd; if (savepw->pw_age && *savepw->pw_age) pw->pw_age = savepw->pw_age; if (savepw->pw_gecos && *savepw->pw_gecos) pw->pw_gecos = savepw->pw_gecos; if (savepw->pw_dir && *savepw->pw_dir) pw->pw_dir = savepw->pw_dir; if (savepw->pw_shell && *savepw->pw_shell) pw->pw_shell = savepw->pw_shell; return pw; }}static struct passwd *interpretwithsave(val, len, savepw, errstr) char *val; struct passwd *savepw; char **errstr;{ struct passwd *pw; if ((pw = interpret(val, len, errstr)) == NULL) return NULL; if (savepw->pw_passwd && *savepw->pw_passwd) pw->pw_passwd = savepw->pw_passwd; if (savepw->pw_age && *savepw->pw_age) pw->pw_age = savepw->pw_age; if (savepw->pw_gecos && *savepw->pw_gecos) pw->pw_gecos = savepw->pw_gecos; if (savepw->pw_dir && *savepw->pw_dir) pw->pw_dir = savepw->pw_dir; if (savepw->pw_shell && *savepw->pw_shell) pw->pw_shell = savepw->pw_shell; return pw;}static struct passwd *interpret(val, len, errstr) char *val; char **errstr;{ register struct _pwjunk *_pw = _pwjunk(); register char *p, *np; char *end, name[20], *errmsg = 0; long x; register int ypentry; int nameok; if (_pw == 0) return (0); (void) strncpy(interpline, val, len); p = interpline; interpline[len] = '\n'; interpline[len+1] = 0; /* * Set "ypentry" if this entry references the NIS; * if so, null UIDs and GIDs are allowed (because they will be * filled in from the matching NIS entry). */ ypentry = (*p == '+'); /* Skip entries if name is white space (includes blank lines) */ for (nameok = 0, np = p; *np && *np != ':'; np++) { if (!isspace(*np)) { nameok = 1; break; } } interppasswd.pw_name = p; if (nameok == 0) { (void) pwskip(p); errmsg = "invalid name field"; goto invalid; } if ((*(p = pwskip(p)) == '\n') && !ypentry) { errmsg = "premature end of line after name"; goto invalid; } /* p points to passwd */ interppasswd.pw_passwd = p; if ((*(p = pwskip(p)) == '\n') && !ypentry) { errmsg = "premature end of line after passwd"; goto invalid; } /* p points to uid */ if (*p == ':' && !ypentry) { /* check for non-null uid */ errmsg = "null uid"; goto invalid; } x = strtol(p, &end, 10); p = end; if (*p != ':' && !ypentry) { /* check for numeric value - must have stopped on the colon */ errmsg = "invalid uid"; goto invalid; } if ((*(p = pwskip(p)) == '\n') && !ypentry) { errmsg = "premature end of line after uid"; goto invalid; } interppasswd.pw_uid = x; /* p points to gid */ if (*p == ':' && !ypentry) { /* check for non-null gid */ errmsg = "null gid"; goto invalid; } x = strtol(p, &end, 10); p = end; if (*p != ':' && !ypentry) { /* check for numeric value - must have stopped on the colon */ errmsg = "invalid gid"; goto invalid; } if ((*(p = pwskip(p)) == '\n') && !ypentry) { errmsg = "premature end of line after gid"; goto invalid; } interppasswd.pw_gid = x; interppasswd.pw_comment = EMPTY; interppasswd.pw_gecos = p; if ((*(p = pwskip(p)) == '\n') && !ypentry) { errmsg = "premature end of line after gecos"; goto invalid; } /* p points to dir */ interppasswd.pw_dir = p; if ((strchr(p, ':') == NULL) && !ypentry) { errmsg = "premature end of line after home directory"; goto invalid; } p = pwskip(p); interppasswd.pw_shell = p; /* Skip up to newline */ while (*p && *p != '\n') p++; if (*p) *p = '\0'; p = interppasswd.pw_passwd; while(*p && *p != ',') p++; if(*p) *p++ = '\0'; interppasswd.pw_age = p; return(&interppasswd);invalid: if (errstr != NULL) { strncpy(name, interpline, sizeof(name)); name[sizeof(name) - 1] = '\0'; (void) pwskip(name); strncpy(errstring, errmsg, sizeof(errstring) - sizeof(name) - 5); strcat(errstring, ": \""); strncat(errstring, name, sizeof(name)); strcat(errstring, "\""); *errstr = errstring; } return(NULL);}staticfreeminuslist() { register struct _pwjunk *_pw = _pwjunk(); struct list *ls; if (_pw == 0) return; for (ls = minuslist; ls != NULL; ls = ls->nxt) { free(ls->name); free((char *) ls); } minuslist = NULL;}staticaddtominuslist(name) char *name;{ register struct _pwjunk *_pw = _pwjunk(); struct list *ls; char *buf; if (_pw == 0) return; ls = (struct list *) malloc(sizeof(struct list)); buf = malloc((unsigned) strlen(name) + 1); (void) strcpy(buf, name); ls->name = buf; ls->nxt = minuslist; minuslist = ls;}/* * save away psswd, gecos, dir and shell fields, which are the only * ones which can be specified in a local + entry to override the * value in the NIS */static struct passwd *save(pw) struct passwd *pw;{ static struct passwd *sv; /* free up stuff from last call */ if (sv) { free(sv->pw_passwd); free(sv->pw_gecos); free(sv->pw_dir); free(sv->pw_shell); free((char *) sv); } sv = (struct passwd *) malloc(sizeof(struct passwd)); sv->pw_passwd = malloc((unsigned) strlen(pw->pw_passwd) + 1); (void) strcpy(sv->pw_passwd, pw->pw_passwd); sv->pw_age = malloc((unsigned) strlen(pw->pw_age) + 1); (void) strcpy(sv->pw_age, pw->pw_age); sv->pw_gecos = malloc((unsigned) strlen(pw->pw_gecos) + 1); (void) strcpy(sv->pw_gecos, pw->pw_gecos); sv->pw_dir = malloc((unsigned) strlen(pw->pw_dir) + 1); (void) strcpy(sv->pw_dir, pw->pw_dir); sv->pw_shell = malloc((unsigned) strlen(pw->pw_shell) + 1); (void) strcpy(sv->pw_shell, pw->pw_shell); return sv;}staticonminuslist(pw) struct passwd *pw;{ register struct _pwjunk *_pw = _pwjunk(); struct list *ls; register char *nm; if (_pw == 0) return (0); nm = pw->pw_name; for (ls = minuslist; ls != NULL; ls = ls->nxt) { if (strcmp(ls->name,nm) == 0) { return(1); } } return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -