xref: /plan9/sys/src/libc/9sys/access.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier 
43e12c5d1SDavid du Colombier int
access(char * name,int mode)53e12c5d1SDavid du Colombier access(char *name, int mode)
63e12c5d1SDavid du Colombier {
73e12c5d1SDavid du Colombier 	int fd;
8*9a747e4fSDavid du Colombier 	Dir *db;
93e12c5d1SDavid du Colombier 	static char omode[] = {
103e12c5d1SDavid du Colombier 		0,
113e12c5d1SDavid du Colombier 		OEXEC,
123e12c5d1SDavid du Colombier 		OWRITE,
133e12c5d1SDavid du Colombier 		ORDWR,
143e12c5d1SDavid du Colombier 		OREAD,
15*9a747e4fSDavid du Colombier 		OEXEC,	/* only approximate */
163e12c5d1SDavid du Colombier 		ORDWR,
17*9a747e4fSDavid du Colombier 		ORDWR	/* only approximate */
183e12c5d1SDavid du Colombier 	};
193e12c5d1SDavid du Colombier 
207dd7cddfSDavid du Colombier 	if(mode == AEXIST){
21*9a747e4fSDavid du Colombier 		db = dirstat(name);
22*9a747e4fSDavid du Colombier 		free(db);
23*9a747e4fSDavid du Colombier 		if(db != nil)
243e12c5d1SDavid du Colombier 			return 0;
253e12c5d1SDavid du Colombier 		return -1;
263e12c5d1SDavid du Colombier 	}
273e12c5d1SDavid du Colombier 	fd = open(name, omode[mode&7]);
283e12c5d1SDavid du Colombier 	if(fd >= 0){
293e12c5d1SDavid du Colombier 		close(fd);
303e12c5d1SDavid du Colombier 		return 0;
313e12c5d1SDavid du Colombier 	}
323e12c5d1SDavid du Colombier 	return -1;
333e12c5d1SDavid du Colombier }
34