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