⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getpwent.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
				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 + -