xref: /onnv-gate/usr/src/cmd/cmd-inet/usr.sbin/in.ftpd/getpwnam.c (revision 0:68f95e015346)
1 #pragma ident	"%Z%%M%	%I%	%E% SMI"
2 
3 /*
4  * Replacement for getpwnam - we need it to handle files other than
5  * /etc/passwd so we can permit different passwd files for each different
6  * host
7  * (c) 1998-2000 by Bernhard Rosenkr�nzer <bero@redhat.com>
8  * 19980930	Initial version
9  * 20000211	Various fixes
10  */
11 
12 #include "config.h"
13 #include <pwd.h>
14 #include <sys/types.h>
15 #include <stdio.h>
16 #ifdef SHADOW_PASSWORD
17 # ifdef HAVE_SHADOW_H
18 #  include <shadow.h>
19 # endif
20 #endif
21 
22 #ifndef HAVE_FGETPWENT /* Some systems (*BSD) don't have fgetpwent... */
23 #ifdef HAVE_STRINGS_H
24 #include <strings.h>
25 #else
26 #include <string.h>
27 #endif
fgetpwent(FILE * stream)28 struct passwd *fgetpwent(FILE *stream)
29 {
30 	char *entry=(char *) malloc(1024);
31 	struct passwd *p=(struct passwd *) malloc(sizeof(struct passwd));
32 	char *tmp,*tmp2;
33 
34 	if(!fgets(entry,1024,stream)) {
35 		free(entry);
36 		free(p);
37 		return NULL;
38 	}
39 	tmp=strdup(entry);
40 	if(strchr(tmp,':')) {
41 		*strchr(tmp,':')=0;
42 		p->pw_name=tmp;
43 	} else {
44 		free(tmp); free(entry);	free(p); return NULL;
45 	}
46 	tmp2=strchr(entry,':')+1;
47 	tmp=strdup(tmp2);
48 	if(strchr(tmp,':')) {
49 		*strchr(tmp,':')=0;
50 		p->pw_passwd=tmp;
51 	} else {
52 		free(tmp); free(entry); free(p->pw_name); free(p); return NULL;
53 	}
54 	tmp2=strchr(tmp2,':')+1;
55 	tmp=strdup(tmp2);
56 	if(strchr(tmp,':')) {
57 		*strchr(tmp,':')=0;
58 		p->pw_uid=(uid_t) atoi(tmp);
59 	} else {
60 		free(tmp); free(entry); free(p->pw_passwd); free(p->pw_name); free(p); return NULL;
61 	}
62 	free(tmp);
63 	tmp2=strchr(tmp2,':')+1;
64 	tmp=strdup(tmp2);
65 	if(strchr(tmp,':')) {
66 		*strchr(tmp,':')=0;
67 		p->pw_gid=(gid_t) atoi(tmp);
68 	} else {
69 		free(tmp); free(entry); free(p->pw_passwd); free(p->pw_name); free(p); return NULL;
70 	}
71 	free(tmp);
72 	tmp2=strchr(tmp2,':')+1;
73 	tmp=strdup(tmp2);
74 	if(strchr(tmp,':')) {
75 		*strchr(tmp,':')=0;
76 		p->pw_gecos=tmp;
77 	} else {
78 		free(tmp); free(entry); free(p->pw_passwd); free(p->pw_name); free(p); return NULL;
79 	}
80 	tmp2=strchr(tmp2,':')+1;
81 	tmp=strdup(tmp2);
82 	if(strchr(tmp,':')) {
83 		*strchr(tmp,':')=0;
84 		p->pw_dir=tmp;
85 	} else {
86 		free(tmp); free(entry); free(p->pw_gecos); free(p->pw_passwd); free(p->pw_name); free(p); return NULL;
87 	}
88 	tmp2=strchr(tmp2,':')+1;
89 	if(strchr(tmp2,':')) {
90 		free(entry); free(p->pw_dir); free(p->pw_gecos); free(p->pw_passwd); free(p->pw_name); free(p); return NULL;
91 	}
92 	while(strlen(tmp2) && isspace(tmp2[strlen(tmp2)-1]))
93 		tmp2[strlen(tmp2)-1]=0;
94 	p->pw_shell=strdup(tmp2);
95 	free(entry);
96 	return p;
97 }
98 #endif
99 
100 
bero_getpwnam(const char * name,const char * file)101 struct passwd *bero_getpwnam(const char * name, const char * file)
102 {
103 	FILE *f;
104 	struct passwd *p;
105 	struct passwd *r;
106 
107 	if (!strcmp(file,"/etc/passwd"))
108 	  return (getpwnam(name));
109 	f=fopen(file,"r");
110 	if(f==NULL)
111 		return NULL;
112 	p=NULL;
113 	r=NULL;
114 	while((r==NULL) && (p=fgetpwent(f)))
115 		if(!strcasecmp(p->pw_name,name))
116 			r=p;
117 	fclose(f);
118 	return r;
119 }
120 
bero_getpwuid(uid_t uid,const char * file)121 struct passwd *bero_getpwuid(uid_t uid, const char * file)
122 {
123 	FILE *f;
124 	struct passwd *p;
125 	struct passwd *r;
126 
127 	if (!strcmp(file,"/etc/passwd"))
128 	  return getpwuid(uid);
129 	f=fopen(file,"r");
130 	if(f==NULL)
131 		return NULL;
132 	p=NULL;
133 	r=NULL;
134 	while((r==NULL) && (p=fgetpwent(f)))
135 		if(p->pw_uid==uid)
136 			r=p;
137 	fclose(f);
138 	return r;
139 }
140 
141 #ifdef SHADOW_PASSWORD
bero_getspnam(const char * name,const char * file)142 struct spwd *bero_getspnam(const char * name, const char * file)
143 {
144 	FILE *f;
145 	struct spwd *s;
146 	struct spwd *r;
147 	f=fopen(file,"r");
148 	if(f==NULL)
149 		return NULL;
150 	s=NULL;
151 	r=NULL;
152 	while((r==NULL) && (s=fgetspent(f)))
153 		if(!strcasecmp(s->sp_namp,name))
154 			r=s;
155 	fclose(f);
156 	return r;
157 }
158 #endif
159