Contents of /trunk/netkit-rsh/patches/netkit-rsh-0.17-rexec-netrc.patch
Parent Directory | Revision Log
Revision 153 -
(show annotations)
(download)
Tue May 8 20:52:56 2007 UTC (17 years, 4 months ago) by niro
File size: 6850 byte(s)
Tue May 8 20:52:56 2007 UTC (17 years, 4 months ago) by niro
File size: 6850 byte(s)
-import
1 | --- netkit-rsh-0.17/rexec/ruserpass.c.netrc 2004-10-14 12:02:04.000000000 -0500 |
2 | +++ netkit-rsh-0.17/rexec/ruserpass.c 2004-10-14 12:14:14.000000000 -0500 |
3 | @@ -0,0 +1,214 @@ |
4 | +/* |
5 | + * Copyright (c) 1985 Regents of the University of California. |
6 | + * All rights reserved. |
7 | + * |
8 | + * Redistribution and use in source and binary forms, with or without |
9 | + * modification, are permitted provided that the following conditions |
10 | + * are met: |
11 | + * 1. Redistributions of source code must retain the above copyright |
12 | + * notice, this list of conditions and the following disclaimer. |
13 | + * 2. Redistributions in binary form must reproduce the above copyright |
14 | + * notice, this list of conditions and the following disclaimer in the |
15 | + * documentation and/or other materials provided with the distribution. |
16 | + * 3. All advertising materials mentioning features or use of this software |
17 | + * must display the following acknowledgement: |
18 | + * This product includes software developed by the University of |
19 | + * California, Berkeley and its contributors. |
20 | + * 4. Neither the name of the University nor the names of its contributors |
21 | + * may be used to endorse or promote products derived from this software |
22 | + * without specific prior written permission. |
23 | + * |
24 | + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
25 | + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
26 | + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
27 | + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
28 | + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
29 | + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
30 | + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
31 | + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
32 | + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
33 | + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
34 | + * SUCH DAMAGE. |
35 | + */ |
36 | + |
37 | +/* |
38 | + * from: @(#)ruserpass.c 5.3 (Berkeley) 3/1/91 |
39 | + */ |
40 | +char ruserpass_rcsid[] = |
41 | + "$Id: netkit-rsh-0.17-rexec-netrc.patch,v 1.1 2007-05-08 20:20:11 niro Exp $"; |
42 | + |
43 | +#include <stdio.h> |
44 | +#include <stdlib.h> |
45 | +#include <utmp.h> |
46 | +#include <ctype.h> |
47 | +#include <sys/stat.h> |
48 | +#include <sys/param.h> |
49 | +#include <errno.h> |
50 | +#include <string.h> |
51 | +#include <unistd.h> |
52 | + |
53 | +static FILE *cfile; |
54 | +static int token(void); |
55 | + |
56 | +#define MACBUF_LEN 4096 |
57 | + |
58 | +#define DEFAULT 1 |
59 | +#define LOGIN 2 |
60 | +#define PASSWD 3 |
61 | +#define ACCOUNT 4 |
62 | +#define MACDEF 5 |
63 | +#define ID 10 |
64 | +#define MACH 11 |
65 | + |
66 | +static char tokval[100]; |
67 | + |
68 | +static struct toktab { |
69 | + const char *tokstr; |
70 | + int tval; |
71 | +} toktab[]= { |
72 | + { "default", DEFAULT }, |
73 | + { "login", LOGIN }, |
74 | + { "password", PASSWD }, |
75 | + { "passwd", PASSWD }, |
76 | + { "account", ACCOUNT }, |
77 | + { "machine", MACH }, |
78 | + { "macdef", MACDEF }, |
79 | + { NULL, 0 } |
80 | +}; |
81 | + |
82 | +int |
83 | +xruserpass(const char *host, char **aname, char **apass) |
84 | +{ |
85 | + const char *hdir; |
86 | + char buf[BUFSIZ], *tmp; |
87 | + char myname[MAXHOSTNAMELEN]; |
88 | + const char *mydomain; |
89 | + int t, usedefault = 0; |
90 | + struct stat stb; |
91 | + |
92 | + hdir = getenv("HOME"); |
93 | + if (hdir == NULL) |
94 | + hdir = "."; |
95 | + snprintf(buf, sizeof(buf), "%s/.netrc", hdir); |
96 | + cfile = fopen(buf, "r"); |
97 | + if (cfile == NULL) { |
98 | + if (errno != ENOENT) |
99 | + perror(buf); |
100 | + return(0); |
101 | + } |
102 | + if (gethostname(myname, sizeof(myname)) < 0) |
103 | + myname[0] = '\0'; |
104 | + if ((mydomain = strchr(myname, '.')) == NULL) |
105 | + mydomain = ""; |
106 | +next: |
107 | + while ((t = token())) switch(t) { |
108 | + |
109 | + case DEFAULT: |
110 | + usedefault = 1; |
111 | + /* FALL THROUGH */ |
112 | + |
113 | + case MACH: |
114 | + if (!usedefault) { |
115 | + if (token() != ID) |
116 | + continue; |
117 | + /* |
118 | + * Allow match of incompletely-specified host in |
119 | + * local domain. |
120 | + */ |
121 | + if (strcasecmp(host, tokval) == 0) |
122 | + goto match; |
123 | + if ((tmp = index(host, '.')) != NULL && |
124 | + strcasecmp(tmp, mydomain) == 0 && |
125 | + strncasecmp(host, tokval, tmp - host) == 0 && |
126 | + tokval[tmp - host] == '\0') |
127 | + goto match; |
128 | + continue; |
129 | + } |
130 | + match: |
131 | + while ((t = token()) && t != MACH && t != DEFAULT) switch(t) { |
132 | + |
133 | + case LOGIN: |
134 | + if (token()) { |
135 | + if (*aname == 0) { |
136 | + *aname = malloc((unsigned) strlen(tokval) + 1); |
137 | + (void) strcpy(*aname, tokval); |
138 | + } else { |
139 | + if (strcmp(*aname, tokval)) |
140 | + goto next; |
141 | + } |
142 | + } |
143 | + break; |
144 | + case PASSWD: |
145 | + if (*aname==NULL) { |
146 | + fprintf(stderr, "Error: `password' must follow `login' in .netrc\n"); |
147 | + goto bad; |
148 | + } |
149 | + if (strcmp(*aname, "anonymous") && |
150 | + fstat(fileno(cfile), &stb) >= 0 && |
151 | + (stb.st_mode & 077) != 0) { |
152 | + fprintf(stderr, "Error - .netrc file not correct permissions.\n"); |
153 | + fprintf(stderr, "Remove password or correct mode (should be 600).\n"); |
154 | + goto bad; |
155 | + } |
156 | + if (token() && *apass == 0) { |
157 | + *apass = malloc((unsigned) strlen(tokval) + 1); |
158 | + (void) strcpy(*apass, tokval); |
159 | + } |
160 | + break; |
161 | + case ACCOUNT: |
162 | + break; |
163 | + case MACDEF: |
164 | + break; |
165 | + default: |
166 | + fprintf(stderr, "Unknown .netrc keyword %s\n", tokval); |
167 | + break; |
168 | + } |
169 | + goto done; |
170 | + } |
171 | +done: |
172 | + (void) fclose(cfile); |
173 | + return(0); |
174 | +bad: |
175 | + (void) fclose(cfile); |
176 | + return(-1); |
177 | +} |
178 | + |
179 | +static |
180 | +int |
181 | +token(void) |
182 | +{ |
183 | + char *cp; |
184 | + int c; |
185 | + struct toktab *t; |
186 | + |
187 | + if (feof(cfile)) |
188 | + return (0); |
189 | + while ((c = getc(cfile)) != EOF && |
190 | + (c == '\n' || c == '\t' || c == ' ' || c == ',')) |
191 | + continue; |
192 | + if (c == EOF) |
193 | + return (0); |
194 | + cp = tokval; |
195 | + if (c == '"') { |
196 | + while ((c = getc(cfile)) != EOF && c != '"') { |
197 | + if (c == '\\') |
198 | + c = getc(cfile); |
199 | + *cp++ = c; |
200 | + } |
201 | + } else { |
202 | + *cp++ = c; |
203 | + while ((c = getc(cfile)) != EOF |
204 | + && c != '\n' && c != '\t' && c != ' ' && c != ',') { |
205 | + if (c == '\\') |
206 | + c = getc(cfile); |
207 | + *cp++ = c; |
208 | + } |
209 | + } |
210 | + *cp = 0; |
211 | + if (tokval[0] == 0) |
212 | + return (0); |
213 | + for (t = toktab; t->tokstr; t++) |
214 | + if (!strcmp(t->tokstr, tokval)) |
215 | + return (t->tval); |
216 | + return (ID); |
217 | +} |
218 | --- netkit-rsh-0.17/rexec/rexec.c.netrc 2004-10-14 12:02:04.000000000 -0500 |
219 | +++ netkit-rsh-0.17/rexec/rexec.c 2004-10-14 12:16:46.000000000 -0500 |
220 | @@ -100,6 +100,8 @@ |
221 | void echo_sig(int sig); |
222 | void safe_write_error(const char *message); |
223 | |
224 | +int xruserpass(const char *host, char **aname, char **apass); |
225 | + |
226 | /* These need to be global for signal passing. */ |
227 | int aux_sock=-1; /* Socket for auxiliary channel. */ |
228 | int extra_error = 1; /* Setup special channel for standard error? */ |
229 | @@ -165,7 +167,10 @@ |
230 | a newline. */ |
231 | passwd = getpass("Password: "); |
232 | } else { |
233 | - |
234 | + if (xruserpass(host, &user_name, &passwd) < 0) { |
235 | + user_name = NULL; |
236 | + passwd = NULL; |
237 | + } |
238 | if ( user_name == NULL ) |
239 | user_name = getenv("REXEC_USER"); |
240 | if ( user_name == NULL ) { |
241 | --- netkit-rsh-0.17/rexec/Makefile.netrc 2004-10-14 12:15:30.000000000 -0500 |
242 | +++ netkit-rsh-0.17/rexec/Makefile 2004-10-14 12:03:37.000000000 -0500 |
243 | @@ -11,7 +11,7 @@ |
244 | |
245 | all: rexec |
246 | |
247 | -rexec: rexec.c |
248 | +rexec: rexec.o ruserpass.o |
249 | |
250 | rexec.1: |
251 |