annotate sbr/ruserpass.c @ 12:441a2190cfae

Lion fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Apr 2012 13:10:49 +0900
parents a6481689f99c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 * Copyright (c) 1985 Regents of the University of California.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3 * All rights reserved.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5 * Redistribution and use in source and binary forms are permitted
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 * provided that the above copyright notice and this paragraph are
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 * duplicated in all such forms and that any documentation,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 * advertising materials, and other materials related to such
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 * distribution and use acknowledge that the software was developed
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 * by the University of California, Berkeley. The name of the
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 * University may not be used to endorse or promote products derived
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 * from this software without specific prior written permission.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 #ifndef lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 static char sccsid[] = "@(#)ruserpass.c 5.1 (Berkeley) 3/1/89";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 #endif /* not lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 #include <ctype.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 #include <pwd.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 #include <errno.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28
10
a6481689f99c *** empty log message ***
kono
parents: 0
diff changeset
29 // char *malloc(), *index(), *getenv(), *getpass(), *getlogin();
a6481689f99c *** empty log message ***
kono
parents: 0
diff changeset
30 // char *strcpy();
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
31 #include <unistd.h>
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
32
10
a6481689f99c *** empty log message ***
kono
parents: 0
diff changeset
33 #include <stdlib.h>
a6481689f99c *** empty log message ***
kono
parents: 0
diff changeset
34 #include <string.h>
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 static FILE *cfile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 #ifndef MAXHOSTNAMELEN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 #define MAXHOSTNAMELEN 64
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 #define DEFAULT 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 #define LOGIN 2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 #define PASSWD 3
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 #define ACCOUNT 4
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 #define MACDEF 5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 #define ID 10
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 #define MACH 11
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 static int token();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 static char tokval[256];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 static struct toktab {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 char *tokstr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 int tval;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 } toktab[]= {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 "default", DEFAULT,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 "login", LOGIN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 "password", PASSWD,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 "passwd", PASSWD,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 "account", ACCOUNT,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 "machine", MACH,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 "macdef", MACDEF,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 0, 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 ruserpass(host, aname, apass)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 char *host, **aname, **apass;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 char *hdir, buf[BUFSIZ], *tmp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 char myname[MAXHOSTNAMELEN], *mydomain;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 int t, i, c, usedefault = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 struct stat stb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 hdir = getenv("HOME");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 if (hdir == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 hdir = ".";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 (void) sprintf(buf, "%s/.netrc", hdir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 cfile = fopen(buf, "r");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 if (cfile == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 if (errno != ENOENT)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 perror(buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 goto done;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 while ((t = token())) switch(t) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 case DEFAULT:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 usedefault = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 /* FALL THROUGH */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 case MACH:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 if (!usedefault) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 if (token() != ID)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 * Allow match either for user's host name.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 if (uleq(host, tokval))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 goto match;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 match:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 while ((t = token()) && t != MACH && t != DEFAULT) switch(t) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 case LOGIN:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 if (token() && *aname == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 *aname = malloc((unsigned) strlen(tokval) + 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 (void) strcpy(*aname, tokval);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 case PASSWD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 if (fstat(fileno(cfile), &stb) >= 0 &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 (stb.st_mode & 077) != 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 fprintf(stderr, "Error - .netrc file not correct mode.\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 fprintf(stderr, "Remove password or correct mode.\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 goto bad;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 if (token() && *apass == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 *apass = malloc((unsigned) strlen(tokval) + 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 (void) strcpy(*apass, tokval);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 case ACCOUNT:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 case MACDEF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 goto done_close;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 fprintf(stderr, "Unknown .netrc keyword %s\n", tokval);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 goto done;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 done_close:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 (void) fclose(cfile);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 done:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 if (!*aname) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 char tmp[80];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 char *myname;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 if ((myname = getlogin()) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 struct passwd *pp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 if ((pp = getpwuid (getuid())) != NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 myname = pp->pw_name;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 printf("Name (%s:%s): ", host, myname ? myname : "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 (void) fgets(tmp, sizeof(tmp) - 1, stdin);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 tmp[strlen(tmp) - 1] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 if (*tmp != '\0') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 myname = tmp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 *aname = malloc((unsigned) strlen(myname) + 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 strcpy (*aname, myname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 if (!*apass) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 char prompt[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 char *mypass;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 sprintf(prompt, "Password (%s:%s): ", host, *aname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 mypass = getpass (prompt);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 if (*mypass == '\0') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 mypass = *aname;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 *apass = malloc((unsigned) strlen(mypass) + 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 strcpy (*apass, mypass);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 return(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 bad:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 (void) fclose(cfile);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 return(-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 static int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 token()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 int c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 struct toktab *t;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 if (feof(cfile))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 return (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 while ((c = getc(cfile)) != EOF &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 (c == '\n' || c == '\t' || c == ' ' || c == ','))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 if (c == EOF)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 return (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 cp = tokval;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197 if (c == '"') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 while ((c = getc(cfile)) != EOF && c != '"') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 if (c == '\\')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 c = getc(cfile);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 if (cp > tokval + sizeof(tokval) - 2) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 fprintf(stderr, ".netrc keyword too long.\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 tokval[0] = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 *cp++ = c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 *cp++ = c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 while ((c = getc(cfile)) != EOF
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 && c != '\n' && c != '\t' && c != ' ' && c != ',') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 if (c == '\\')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 c = getc(cfile);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 if (cp > tokval + sizeof(tokval) - 2) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 fprintf(stderr, ".netrc keyword too long.\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 tokval[0] = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 *cp++ = c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 if (tokval[0] == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 return (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 for (t = toktab; t->tokstr; t++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 if (!strcmp(t->tokstr, tokval))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 return (t->tval);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 return (ID);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 }