]>
git.saurik.com Git - apple/network_cmds.git/blob - ftp.tproj/ruserpass.c
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7 * Reserved. This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 1.0 (the 'License'). You may not use this file
10 * except in compliance with the License. Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
14 * The Original Code and all software distributed under the License are
15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19 * License for the specific language governing rights and limitations
22 * @APPLE_LICENSE_HEADER_END@
25 * Copyright (c) 1985, 1993, 1994
26 * The Regents of the University of California. All rights reserved.
28 * Redistribution and use in source and binary forms, with or without
29 * modification, are permitted provided that the following conditions
31 * 1. Redistributions of source code must retain the above copyright
32 * notice, this list of conditions and the following disclaimer.
33 * 2. Redistributions in binary form must reproduce the above copyright
34 * notice, this list of conditions and the following disclaimer in the
35 * documentation and/or other materials provided with the distribution.
36 * 3. All advertising materials mentioning features or use of this software
37 * must display the following acknowledgement:
38 * This product includes software developed by the University of
39 * California, Berkeley and its contributors.
40 * 4. Neither the name of the University nor the names of its contributors
41 * may be used to endorse or promote products derived from this software
42 * without specific prior written permission.
44 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
45 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
46 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
47 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
48 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
49 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
50 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
51 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
52 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
53 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
57 #include <sys/types.h>
70 static int token
__P((void));
81 static char tokval
[100];
83 static struct toktab
{
87 { "default", DEFAULT
},
89 { "password", PASSWD
},
91 { "account", ACCOUNT
},
98 ruserpass(host
, aname
, apass
, aacct
)
99 char *host
, **aname
, **apass
, **aacct
;
101 char *hdir
, buf
[BUFSIZ
], *tmp
;
102 char myname
[MAXHOSTNAMELEN
], *mydomain
;
103 int t
, i
, c
, usedefault
= 0;
106 hdir
= getenv("HOME");
109 (void) sprintf(buf
, "%s/.netrc", hdir
);
110 cfile
= fopen(buf
, "r");
116 if (gethostname(myname
, sizeof(myname
)) < 0)
118 if ((mydomain
= strchr(myname
, '.')) == NULL
)
121 while ((t
= token())) switch(t
) {
132 * Allow match either for user's input host name
133 * or official hostname. Also allow match of
134 * incompletely-specified host in local domain.
136 if (strcasecmp(host
, tokval
) == 0)
138 if (strcasecmp(hostname
, tokval
) == 0)
140 if ((tmp
= strchr(hostname
, '.')) != NULL
&&
141 strcasecmp(tmp
, mydomain
) == 0 &&
142 strncasecmp(hostname
, tokval
, tmp
-hostname
) == 0 &&
143 tokval
[tmp
- hostname
] == '\0')
145 if ((tmp
= strchr(host
, '.')) != NULL
&&
146 strcasecmp(tmp
, mydomain
) == 0 &&
147 strncasecmp(host
, tokval
, tmp
- host
) == 0 &&
148 tokval
[tmp
- host
] == '\0')
153 while ((t
= token()) && t
!= MACH
&& t
!= DEFAULT
) switch(t
) {
158 *aname
= malloc((unsigned) strlen(tokval
) + 1);
159 (void) strcpy(*aname
, tokval
);
161 if (strcmp(*aname
, tokval
))
166 if ((*aname
== NULL
|| strcmp(*aname
, "anonymous")) &&
167 fstat(fileno(cfile
), &stb
) >= 0 &&
168 (stb
.st_mode
& 077) != 0) {
169 warnx("Error: .netrc file is readable by others.");
170 warnx("Remove password or make file unreadable by others.");
173 if (token() && *apass
== 0) {
174 *apass
= malloc((unsigned) strlen(tokval
) + 1);
175 (void) strcpy(*apass
, tokval
);
179 if (fstat(fileno(cfile
), &stb
) >= 0
180 && (stb
.st_mode
& 077) != 0) {
181 warnx("Error: .netrc file is readable by others.");
182 warnx("Remove account or make file unreadable by others.");
185 if (token() && *aacct
== 0) {
186 *aacct
= malloc((unsigned) strlen(tokval
) + 1);
187 (void) strcpy(*aacct
, tokval
);
192 (void) fclose(cfile
);
195 while ((c
=getc(cfile
)) != EOF
&& c
== ' ' || c
== '\t');
196 if (c
== EOF
|| c
== '\n') {
197 printf("Missing macdef name argument.\n");
201 printf("Limit of 16 macros have already been defined\n");
204 tmp
= macros
[macnum
].mac_name
;
206 for (i
=0; i
< 8 && (c
=getc(cfile
)) != EOF
&&
211 printf("Macro definition missing null line terminator.\n");
216 while ((c
=getc(cfile
)) != EOF
&& c
!= '\n');
219 printf("Macro definition missing null line terminator.\n");
223 macros
[macnum
].mac_start
= macbuf
;
226 macros
[macnum
].mac_start
= macros
[macnum
-1].mac_end
+ 1;
228 tmp
= macros
[macnum
].mac_start
;
229 while (tmp
!= macbuf
+ 4096) {
230 if ((c
=getc(cfile
)) == EOF
) {
231 printf("Macro definition missing null line terminator.\n");
236 if (*(tmp
-1) == '\0') {
237 macros
[macnum
++].mac_end
= tmp
- 1;
244 if (tmp
== macbuf
+ 4096) {
245 printf("4K macro buffer exceeded\n");
250 warnx("Unknown .netrc keyword %s", tokval
);
256 (void) fclose(cfile
);
259 (void) fclose(cfile
);
270 if (feof(cfile
) || ferror(cfile
))
272 while ((c
= getc(cfile
)) != EOF
&&
273 (c
== '\n' || c
== '\t' || c
== ' ' || c
== ','))
279 while ((c
= getc(cfile
)) != EOF
&& c
!= '"') {
286 while ((c
= getc(cfile
)) != EOF
287 && c
!= '\n' && c
!= '\t' && c
!= ' ' && c
!= ',') {
296 for (t
= toktab
; t
->tokstr
; t
++)
297 if (!strcmp(t
->tokstr
, tokval
))