xref: /original-bsd/usr.bin/f77/libU77/access_.c (revision 7bad34b3)
1 /*-
2  * Copyright (c) 1980 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.proprietary.c%
6  */
7 
8 #ifndef lint
9 static char sccsid[] = "@(#)access_.c	5.2 (Berkeley) 04/12/91";
10 #endif /* not lint */
11 
12 /*
13  * determine accessability of a file
14  *
15  * calling format:
16  *	integer access
17  *	ierror = access(filename, mode)
18  * where:
19  *	ierror will be 0 for successful access; an error number otherwise.
20  *	filename is a character string
21  *	mode is a character string which may include any combination of
22  *	'r', 'w', 'x', ' '. (' ' => test for existence)
23  */
24 
25 #include "../libI77/f_errno.h"
26 #include <sys/param.h>
27 #ifndef	MAXPATHLEN
28 #define MAXPATHLEN	128
29 #endif
30 
31 long access_(name, mode, namlen, modlen)
32 char *name, *mode;
33 long namlen, modlen;
34 {
35 	char buf[MAXPATHLEN];
36 	int m = 0;
37 
38 	if (namlen >= sizeof buf)
39 		return((long)(errno=F_ERARG));
40 	g_char(name, namlen, buf);
41 	if (buf[0] == '\0')
42 		return((long)(errno=ENOENT));
43 	if (access(buf, 0) < 0)
44 		return((long)errno);
45 	while (modlen--) switch(*mode++)
46 	{
47 		case 'x':
48 			m |= 1;
49 			break;
50 
51 		case 'w':
52 			m |= 2;
53 			break;
54 
55 		case 'r':
56 			m |= 4;
57 			break;
58 	}
59 	if (m > 0 && access(buf, m) < 0)
60 		return((long)errno);
61 	return(0L);
62 }
63