xref: /plan9/sys/src/ape/lib/ap/plan9/access.c (revision 781103c4074deb8af160e8a0da2742ba6b29dc2b)
13e12c5d1SDavid du Colombier #include "lib.h"
23e12c5d1SDavid du Colombier #include <string.h>
33e12c5d1SDavid du Colombier #include <sys/stat.h>
43e12c5d1SDavid du Colombier #include <fcntl.h>
53e12c5d1SDavid du Colombier #include <unistd.h>
63e12c5d1SDavid du Colombier #include <errno.h>
79a747e4fSDavid du Colombier #include <stdlib.h>
83e12c5d1SDavid du Colombier #include "sys9.h"
93e12c5d1SDavid du Colombier #include "dir.h"
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier int
access(const char * name,int mode)123e12c5d1SDavid du Colombier access(const char *name, int mode)
133e12c5d1SDavid du Colombier {
14*781103c4SDavid du Colombier 	int fd;
159a747e4fSDavid du Colombier 	Dir *db;
163e12c5d1SDavid du Colombier 	struct stat st;
173e12c5d1SDavid du Colombier 	static char omode[] = {
183e12c5d1SDavid du Colombier 		0,
193e12c5d1SDavid du Colombier 		3,
203e12c5d1SDavid du Colombier 		1,
213e12c5d1SDavid du Colombier 		2,
223e12c5d1SDavid du Colombier 		0,
233e12c5d1SDavid du Colombier 		2,
243e12c5d1SDavid du Colombier 		2,
253e12c5d1SDavid du Colombier 		2
263e12c5d1SDavid du Colombier 	};
273e12c5d1SDavid du Colombier 	char tname[1024];
283e12c5d1SDavid du Colombier 
293e12c5d1SDavid du Colombier 	if(mode == 0){
309a747e4fSDavid du Colombier 		db = _dirstat(name);
319a747e4fSDavid du Colombier 		if(db == nil){
323e12c5d1SDavid du Colombier 			_syserrno();
333e12c5d1SDavid du Colombier 			return -1;
343e12c5d1SDavid du Colombier 		}
359a747e4fSDavid du Colombier 		free(db);
369a747e4fSDavid du Colombier 		return 0;
373e12c5d1SDavid du Colombier 	}
383e12c5d1SDavid du Colombier 	fd = open(name, omode[mode&7]);
393e12c5d1SDavid du Colombier 	if(fd >= 0){
403e12c5d1SDavid du Colombier 		close(fd);
413e12c5d1SDavid du Colombier 		return 0;
423e12c5d1SDavid du Colombier 	}
433e12c5d1SDavid du Colombier 	else if(stat(name, &st)==0 && S_ISDIR(st.st_mode)){
443e12c5d1SDavid du Colombier 		if(mode & (R_OK|X_OK)){
453e12c5d1SDavid du Colombier 			fd = open(name, O_RDONLY);
463e12c5d1SDavid du Colombier 			if(fd < 0)
473e12c5d1SDavid du Colombier 				return -1;
483e12c5d1SDavid du Colombier 			close(fd);
493e12c5d1SDavid du Colombier 		}
503e12c5d1SDavid du Colombier 		if(mode & W_OK){
513e12c5d1SDavid du Colombier 			strncpy(tname, name, sizeof(tname)-9);
523e12c5d1SDavid du Colombier 			strcat(tname, "/_AcChAcK");
533e12c5d1SDavid du Colombier 			fd = creat(tname, 0666);
543e12c5d1SDavid du Colombier 			if(fd < 0)
553e12c5d1SDavid du Colombier 				return -1;
563e12c5d1SDavid du Colombier 			close(fd);
573e12c5d1SDavid du Colombier 			_REMOVE(tname);
583e12c5d1SDavid du Colombier 		}
593e12c5d1SDavid du Colombier 		return 0;
603e12c5d1SDavid du Colombier 	}
613e12c5d1SDavid du Colombier 	return -1;
623e12c5d1SDavid du Colombier }
63