home *** CD-ROM | disk | FTP | other *** search
- /*
- (C) Copyright Taiichi Yuasa and Masami Hagiya, 1984. All rights reserved.
- */
-
- /*
- filesystem.c
- DG-SPECIFIC
- */
-
- #include "packets:filestatus.h"
- #include "include.h"
-
- #define $FLNK 00 /* LINK */
- #define $FIPC 036 /* IPC PORT ENTRY */
- #define $FDIR 012 /* DISK DIRECTORY */
- #define $FLDU 013 /* LD ROOT DIRECTORY */
- #define $FCPD 014 /* CONTROL POINT DIRECTORY */
- #define $FDKU 024 /* DISK UNIT */
- #define $FMCU 025 /* MULTIPROCESSOR COMMUNICATIONS UNIT */
- #define $FMTU 026 /* MAG TAPE UNIT */
- #define $FLPU 027 /* DATA CHANNEL LINE PRINTER */
- #define $FLPD 030 /* DATA CHANNEL LP2 UNIT */
-
- #define EREOF 030 /* END OF FILE */
- #define ERFDE 025 /* FILE DOES NOT EXIST */
-
- #define $MXPL 0400 /* MAX PATHNAME LENGTH (BYTES) */
-
- #define $DELETE 01 /* DELETE FILE */
- #define $RENAME 02 /* RENAME A FILE */
- #define $GUNM 072 /* GET A PROCESS'S USER NAME */
- #define $DIR 075 /* CHANGE WORKING DIRECTORY */
- #define $FSTAT 077 /* GET FILE STATUS */
- #define $GNAME 0111 /* GET FULL PATHNAME */
- #define $GACL 0115 /* GET A FILE'S ACL */
- #define $GNFN 0131 /* GET NEXT FILE NAME FROM DIR */
-
- #define MAXNAME 256
-
- union fstat {
- P_FSTAT other;
- P_FSTAT_DIR dir;
- P_FSTAT_IPC ipc;
- P_FSTAT_UNIT unit;
- };
-
- int debug;
-
- rename_file(filen, newname)
- char *filen, *newname;
- {
- int ac0, ac1, ac2, ier;
-
- ac0 = filen;
- ac1 = newname;
- if (ier = sys($RENAME, &ac0, &ac1, &ac2))
- sys_emes(ier);
- }
-
- delete_file(filen)
- char *filen;
- {
- int ac0, ac1, ac2, ier;
-
- ac0 = filen;
- if (ier = sys($DELETE, &ac0, &ac1, &ac2))
- sys_emes(ier);
- }
-
- probe_file(filen, truename, bufflen)
- char *filen, *truename;
- int bufflen;
- {
- int ac0, ac1, ac2, ier;
-
- ac0 = filen;
- ac1 = truename;
- ac2 = bufflen;
- if (ier = sys($GNAME, &ac0, &ac1, &ac2))
- if (ier == ERFDE)
- return(FALSE);
- else
- sys_emes(ier);
- return(TRUE);
- }
-
- int
- dir_where_file(filen, dirn)
- char *filen, *dirn;
- {
- int ac0, ac1, ac2, ier;
- int i, j, d, d1;
- char slist[$MXPL+2];
- char pathn[MAXNAME];
- char dummy[MAXNAME];
-
- slist[0] = '=';
- slist[1] = '\0';
-
- ac1 = &slist[2];
- ac2 = $MXPL + 2;
- if (ier = sys($GLIST, &ac0, &ac1, &ac2))
- sys_emes(ier);
-
- d = d1 = 0;
- for (d = d1 = 0; ; d1 = d) {
- for (i = 0; (pathn[i] = slist[d]) != '\0'; i++, d++)
- ;
- if (i == 0) return(FALSE);
- d++;
- for (j = 0; (pathn[i] = filen[j]) != '\0'; i++, j++)
- ;
- if (probe_file(pathn, dummy, MAXNAME)) break;
- }
- probe_file(&slist[d1], dirn, MAXNAME);
- return(TRUE);
- }
-
- FILE *
- backup_fopen(filen, open_opt)
- char *filen, *open_opt;
- {
- int ac0, ac1, ac2, ier;
- int i, j;
- object p, d, f;
- FILE *fd;
- char *c;
- char filename[MAXNAME], dirn[MAXNAME];
- char buname[MAXNAME];
- vs_mark;
-
- p = make_simple_string(filen);
- vs_push(p);
- p = coerce_to_pathname(p);
- vs_pop;
- vs_push(p);
- f = make_pathname(Cnil, Cnil, Cnil,
- p->pn.pn_name,
- p->pn.pn_type,
- p->pn.pn_version);
- vs_push(f);
- f = coerce_to_namestring(f);
- vs_pop;
- vs_push(f);
-
- if (f == Cnil)
- FEerror("Zero length filename was specified.", 0);
-
- c = f->st.st_self;
- j = f->st.st_fillp;
-
- filename[0] = '=';
- for (i = 0; i < j; i++)
- filename[i+1] = c[i];
- filename[i+1] = '\0';
-
- if (p->pn.pn_directory == Cnil)
- if (!dir_where_file(filen, dirn))
- sys_emes(ERFDE);
- else
- ;
- else {
- d = make_pathname(Cnil, Cnil,
- p->pn.pn_directory,
- Cnil, Cnil, Cnil);
- vs_push(d);
- d = coerce_to_namestring(d);
- c = d->st.st_self;
- j = d->st.st_fillp;
- for (i = 0; i < j; i++)
- dirn[i] = c[i];
- if (i > 0 && dirn[i-1] == ':') i--;
- dirn[i] = '\0';
- }
- ac0 = dirn;
- if (ier = sys($DIR, &ac0, &ac1, &ac2))
- sys_emes(ier);
- for (i = 0; (buname[i] = filename[i+1]) != '\0'; i++)
- ;
- buname[i++] = '.';
- buname[i++] = 'B';
- buname[i++] = 'U';
- buname[i] = '\0';
-
- ac0 = buname;
- if ((ier = sys($DELETE, &ac0, &ac1, &ac2)) != NULL &&
- ier != ERFDE)
- sys_emes(ier);
- rename_file(filename, buname);
-
- fd = fopen(filename, open_opt);
-
- ac0 = 0;
- if (ier = sys($DIR, &ac0, &ac1, &ac2))
- sys_emes(ier);
-
- vs_reset;
- return(fd);
- }
-
- get_file_status(filen, filep)
- char *filen;
- P_FSTAT *filep;
- {
- int ac0, ac1, ac2, ier;
-
- ac0 = filen;
- ac1 = 0;
- ac2 = filep;
- if (ier = sys($FSTAT, &ac0, &ac1, &ac2))
- sys_emes(ier);
- }
-
- get_file_status_chan(fd, filep)
- FILE *fd;
- P_FSTAT *filep;
- {
- int ac0, ac1, ac2, ier;
-
- ac0 = fchannel(fd);
- ac1 = 020000000000; /* channel in ac0 */
- ac2 = filep;
- if (ier = sys($FSTAT, &ac0, &ac1, &ac2))
- sys_emes(ier);
- }
-
- object
- file_write_date(filen)
- char *filen;
- {
- union fstat filep;
- unsigned char ftype;
- short dd, tt;
- object time, time_zone, time_gap;
-
- get_file_status(filen, &filep);
- ftype = filep.other.styp_type;
- switch(ftype) {
- case $FIPC:
- dd = filep.ipc.stch.short_time[_DATE];
- tt = filep.ipc.stch.short_time[_TIME];
- break;
- case $FLDU:
- case $FDIR:
- case $FCPD:
- dd = filep.dir.stmh.short_time[_DATE];
- tt = filep.dir.stmh.short_time[_TIME];
- break;
- case $FDKU:
- case $FMCU:
- case $FMTU:
- case $FLPU:
- case $FLPD:
- dd = filep.unit.stch.short_time[_DATE];
- tt = filep.unit.stch.short_time[_TIME];
- break;
- default:
- dd = filep.other.stmh.short_time[_DATE];
- tt = filep.other.stmh.short_time[_TIME];
- break;
- }
- time = make_fixnum((dd - 1) * 24 * 3600 + tt * 2);
- /* tt is bi-seconds */
- vs_push(time);
- time_gap = make_fixnum(2145830400);
- vs_push(time_gap);
- time = number_plus(time, time_gap);
- vs_pop;
- vs_pop;
- vs_push(time);
- time_zone = make_fixnum(TIME_ZONE * 3600);
- vs_push(time_zone);
- time = number_plus(time, time_zone);
- vs_pop;
- vs_pop;
-
- return(time);
- }
-
- int
- file_len(fd)
- FILE *fd;
- {
- union fstat filep;
- unsigned char ftype;
-
- get_file_status_chan(fd, &filep);
- ftype = filep.other.styp_type;
- switch(ftype) {
- case $FIPC:
- case $FDKU:
- case $FMCU:
- case $FMTU:
- case $FLPU:
- case $FLPD:
- return(-1);
- case $FLDU:
- case $FDIR:
- case $FCPD:
- return(filep.dir.sefm);
- default:
- return(filep.other.sefm);
- }
-
- }
-
- file_author(filen, author)
- char *filen, *author;
- {
- char aclbuf[256];
- char *up, *ap, *bp;
- int ac0, ac1, ac2, ier;
- int i;
-
- for (i = 0; i < 256; i++) aclbuf[i] = '\0';
- ac0 = filen;
- ac1 = aclbuf;
- if (ier = sys($GACL, &ac0, &ac1, &ac2))
- sys_emes(ier);
- bp = author;
- for (up = aclbuf; ;up = ap + 1) {
- for (ap = up; *ap != '\0'; ap++)
- ;
- if (up == ap) break;
- ap++;
- if (*ap & $FACO) {
- if (bp != author) *bp++ = ',';
- for (i = 0; up[i] != '\0'; i++)
- *bp++ = up[i];
- }
- }
- if (bp == author)
- return(FALSE);
- else {
- *bp = '\0';
- return(TRUE);
- }
- }
-
- username(uname)
- char *uname;
- {
- int ac0, ac1, ac2, ier;
-
- ac0 = -1;
- ac1 = 1;
- ac2 = uname;
- if (ier = sys($GUNM, &ac0, &ac1, &ac2))
- sys_emes(ier);
- }
-
- object
- truename(file)
- object file;
- {
- object x;
- char filen[MAXNAME], pathn[MAXNAME];
- int i, j;
- char *c;
-
- x = coerce_to_namestring(file);
- vs_push(x);
- for (i = 0, j = x->st.st_fillp, c = x->st.st_self; i < j; i++)
- filen[i] = c[i];
- if (i > 1 && filen[i - 1] == ':') i--;
- filen[i] = '\0';
- if (!probe_file(filen, pathn, MAXNAME))
- sys_emes(ERFDE);
- x = make_simple_string(pathn);
- vs_pop;
- vs_push(x);
- x = coerce_to_pathname(x);
- vs_pop;
- return(x);
- }
-
- int
- file_exists(file)
- object file;
- {
- char filen[MAXNAME], pathn[MAXNAME];
- int i, j;
- char *c;
-
- if (type_of(file) != t_string)
- FEwrong_type_argument(Sstring, file);
-
- for (i = 0, j = file->st.st_fillp, c = file->st.st_self;
- i < j; i++)
- filen[i] = c[i];
- if (i > 1 && filen[i-1] == ':') i--;
- filen[i] = '\0';
- return(probe_file(filen, pathn, MAXNAME));
- }
-
- Ltruename()
- {
- check_arg(1);
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = truename(vs_base[0]);
- }
-
- Luser_homedir_pathname()
- {
- int i, args;
- object x;
- char usern[MAXNAME], dirn[MAXNAME];
-
- args = vs_top - vs_base;
- if (args > 1) too_many_arguments();
- if (args == 1) {
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- if (vs_base[0] != Cnil) {
- vs_base[0] = Cnil;
- return;
- }
- }
- username(usern);
- dirn[0] = dirn[4] = ':';
- dirn[1] = 'U';
- dirn[2] = dirn[3] = 'D';
- for (i = 0; (dirn[i+5] = usern[i]) != '\0';i++)
- ;
- i += 5;
- dirn[i++] = ':';
- dirn[i] = '\0';
- x = make_simple_string(dirn);
- vs_push(x);
- x = coerce_to_pathname(x);
- vs_top = vs_base;
- vs_push(x);
- }
-
- Lrename_file()
- {
- object old, new, new1, truename_old, truename_new;
- int i, j;
- char *c;
- char oldn[MAXNAME], newn[MAXNAME];
-
- check_arg(2);
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- check_type_or_pathname_string_symbol_stream(&vs_base[1]);
-
- new1 = vs_base[1];
- if (type_of(new1) == t_stream)
- FEerror("A filename is expected.", 0);
- new1 = coerce_to_pathname(new1);
- if (new1->pn.pn_host != Cnil ||
- new1->pn.pn_device != Cnil ||
- new1->pn.pn_directory != Cnil)
- FEerror("A filename is expected.", 0);
- vs_push(new1);
-
- new = namestring(new1);
- j = new->st.st_fillp;
- c = new->st.st_self;
- for (i = 0; i < j; i++)
- newn[i] = c[i];
- newn[i] = '\0';
-
- truename_old = truename(vs_base[0]);
- vs_push(truename_old);
- truename_old = coerce_to_pathname(truename_old);
- vs_pop;
- vs_push(truename_old);
-
- old = coerce_to_namestring(vs_base[0]);
- j = old->st.st_fillp;
- c = old->st.st_self;
- for (i = 0; i < j; i++)
- oldn[i] = c[i];
- oldn[i] = '\0';
-
- rename_file(oldn, newn);
-
- old = coerce_to_pathname(vs_base[0]);
- vs_push(old);
- new = make_pathname(
- old->pn.pn_host,
- old->pn.pn_device,
- old->pn.pn_directory,
- new1->pn.pn_name,
- new1->pn.pn_type,
- old->pn.pn_version);
- vs_push(new);
- truename_new = truename(new);
-
- vs_top = vs_base;
- vs_push(new);
- vs_push(truename_old);
- vs_push(truename_new);
- }
-
- Ldelete_file()
- {
- int i, j;
- char *c;
- char pathn[MAXNAME];
- char truen[MAXNAME];
-
- check_arg(1);
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_namestring(vs_base[0]);
- j = vs_base[0]->st.st_fillp;
- c = vs_base[0]->st.st_self;
- for (i = 0; i < j; i++)
- pathn[i] = c[i];
- if (i > 1 && pathn[i-1] == ':') i--;
- pathn[i] = '\0';
- probe_file(pathn, truen, MAXNAME);
- delete_file(truen);
- vs_base[0] = Ct;
- }
-
- Lprobe_file()
- {
- int i, j, dirflg;
- char *c;
- char filen[MAXNAME], pathname[MAXNAME];
-
- check_arg(1);
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_namestring(vs_base[0]);
- c = vs_base[0]->st.st_self;
- j = vs_base[0]->st.st_fillp;
- for (i = 0; i < j; i++)
- filen[i] = c[i];
- if (i > 1 && filen[i-1] == ':') {
- i--;
- dirflg = TRUE;
- } else
- dirflg = FALSE;
- filen[i] = '\0';
- if (!probe_file(filen, pathname, MAXNAME)) {
- vs_base[0] = Cnil;
- return;
- }
- if (dirflg) {
- for (i = 0; pathname[i] != '\0'; i++)
- ;
- pathname[i++] = ':';
- pathname[i] = '\0';
- }
- vs_base[0] = make_simple_string(pathname);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- }
-
- Lfile_write_date()
- {
- int i, j;
- char *c;
- char filen[MAXNAME];
-
- check_arg(1);
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_namestring(vs_base[0]);
- c = vs_base[0]->st.st_self;
- j = vs_base[0]->st.st_fillp;
- for (i = 0; i < j; i++)
- filen[i] = c[i];
- if (i > 1 && filen[i-1] == ':') i--;
- filen[i] = '\0';
- vs_base[0] = file_write_date(filen);
- }
-
- Lfile_author()
- {
- int i, j;
- char *c;
- char filen[MAXNAME];
- char author[MAXNAME];
-
- check_arg(1);
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- vs_base[0] = coerce_to_namestring(vs_base[0]);
- c = vs_base[0]->st.st_self;
- j = vs_base[0]->st.st_fillp;
- for (i = 0; i < j; i++)
- filen[i] = c[i];
- if (i > 1 && filen[i-1] == ':') i--;
- filen[i] = '\0';
- if (file_author(filen, author))
- vs_base[0] = make_simple_string(author);
- else
- vs_base[0] = Cnil;
-
- }
-
- Ldirectory()
- {
- int ac0, ac1, ac2, ier;
- int i, j;
- char dirn[MAXNAME], template[MAXNAME];
- char filen[MAXNAME], temp[MAXNAME];
- char *c;
- FILE *fd;
- P_GNFN gnfnp;
- object d, s;
-
- check_arg(1);
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
-
- gnfnp.nfky = 0;
- gnfnp.nfrs = 0;
- gnfnp.nfnm = filen;
- gnfnp.nftp = -1;
-
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- if (vs_base[0]->pn.pn_directory == Cnil) {
- temp[0] = '=';
- temp[1] = '\0';
- probe_file(temp, dirn, MAXNAME);
- } else {
- d =
- make_pathname(Cnil, Cnil,
- vs_base[0]->pn.pn_directory,
- Cnil, Cnil, Cnil);
- vs_push(d);
- s = coerce_to_namestring(d);
- vs_pop;
- j = s->st.st_fillp;
- c = s->st.st_self;
- for (i = 0; i < j; i++)
- temp[i] = c[i];
- if (i > 1 && temp[i-1] == ':')
- i--;
- temp[i] = '\0';
- if (!probe_file(temp, dirn, MAXNAME)) {
- vs_top = vs_base;
- vs_push(Cnil);
- return;
- }
- }
-
- if (vs_base[0]->pn.pn_name == Cnil &&
- vs_base[0]->pn.pn_type == Cnil)
- gnfnp.nftp = -1;
- else {
- s = make_pathname(Cnil, Cnil, Cnil,
- vs_base[0]->pn.pn_name,
- vs_base[0]->pn.pn_type,
- vs_base[0]->pn.pn_version);
- vs_push(s);
- s = namestring(s);
- vs_pop;
- gnfnp.nftp = template;
- j = s->st.st_fillp;
- c = s->st.st_self;
- for (i = 0; i < j; i++)
- template[i] = c[i];
- template[i] = '\0';
- }
-
- if ((fd = fopen(dirn, "r")) == NULL) {
- if ((ier = lasterror()) == ERFDE) {
- vs_top = vs_base;
- vs_push(Cnil);
- return;
- }
- sys_emes(ier);
- }
- for (i = 0; (temp[i] = dirn[i]) != '\0'; i++)
- ;
- if (i > 1) temp[i++] = ':'; /* not root directory ? */
- j = i;
- ac0 = 0;
- ac1 = fchannel(fd);
- ac2 = &gnfnp;
- vs_top = vs_base;
- vs_push(Cnil);
- vs_push(Cnil);
- while ((ier = sys($GNFN, &ac0, &ac1, &ac2)) == NULL) {
- for (i = 0; (temp[j+i] = filen[i]) != '\0'; i++)
- ;
- probe_file(temp, filen, MAXNAME);
- vs_base[1] = make_simple_string(filen);
- vs_base[1] = coerce_to_pathname(vs_base[1]);
- vs_base[0] = make_cons(vs_base[1], vs_base[0]);
- }
- fclose(fd);
- if (ier == EREOF) {
- vs_top = vs_base + 1;
- return;
- } else
- sys_emes(ier);
- }
-
- init_filesystem()
- {
- make_function("TRUENAME", Ltruename);
- make_function("USER-HOMEDIR-PATHNAME", Luser_homedir_pathname);
- make_function("RENAME-FILE", Lrename_file);
- make_function("DELETE-FILE", Ldelete_file);
- make_function("PROBE-FILE", Lprobe_file);
- make_function("FILE-WRITE-DATE", Lfile_write_date);
- make_function("FILE-AUTHOR", Lfile_author);
- make_function("DIRECTORY", Ldirectory);
- }
-