long sys_close(SyscallFrame *f) { int fd; File *file; if (argfd(f, 0, &fd)) { // todo errstr return -1; } file = proc->files[fd]; releasefile(file); proc->files[fd] = nil; return 0; }
static File * getfile(char *fname) { File *f = allocfile(); if (f == nil) return nil; if (strcmp(fname, "/hello.txt") == 0) { initfile(f, hello, strlen(hello)); } else if (strcmp(fname, "/dev/cons") == 0) { consfile(f); } else { releasefile(f); f = nil; } return f; }
int sys_open(SyscallFrame *f) { char *fname; long l; int omode, fd; File *file; if (argstr(f, 0, &fname) < 0) return -1; if (arglong(f, 1, &l) < 0) return -1; omode = (long)l; if (omode & (OEXEC | OTRUNC | OCEXEC | ORCLOSE)) { // todo errstr return -1; } if (omode & (OWRITE | ORDWR) && !canwrite(fname)) { // todo errstr return -1; } file = getfile(fname); if (file == nil) return -1; file->omode = omode; fd = allocfd(proc, file); if (fd == -1) { // todo errstr releasefile(file); return -1; } return fd; }
/* * return a block of a tar file */ int mktar(Dfile *df, Symbol *dp, uchar *area, uint offset, int len) { int fd, i, j, n, off; uchar *p, *buf; uchar *vec; File *f; f = &df->file[dp->fno]; vec = f->refvec; p = area; /* find file */ for(i = 0; i < df->nfile && len > 0; i++){ if((vec[i/8] & (1<<(i&7))) == 0) continue; f = &df->file[i]; n = Tblocksize + ((f->len + Tblocksize - 1)/Tblocksize)*Tblocksize; if(offset >= n){ offset -= n; continue; } if(offset < Tblocksize){ buf = mktardir(f); if(offset + len > Tblocksize) j = Tblocksize - offset; else j = len; //if(debug)fprint(2, "reading %d bytes dir of %s\n", j, f->name); memmove(p, buf+offset, j); p += j; len -= j; offset += j; free(buf); } if(len <= 0) break; off = offset - Tblocksize; if(off >= 0 && off < f->len){ if(off + len > f->len) j = f->len - off; else j = len; fd = getfile(df, f); if(fd >= 0){ //if(debug)fprint(2, "reading %d bytes from offset %d of %s\n", j, off, f->name); if(pread(fd, p, j, off) != j) syslog(0, dependlog, "%r reading %d bytes from offset %d of %s", j, off, f->name); } releasefile(f); p += j; len -= j; offset += j; } if(len <= 0) break; if(offset < n){ if(offset + len > n) j = n - offset; else j = len; //if(debug)fprint(2, "filling %d bytes after %s\n", j, f->name); memset(p, 0, j); p += j; len -= j; } offset = 0; } /* null blocks at end of tar file */ if(offset < 2*Tblocksize && len > 0){ if(offset + len > 2*Tblocksize) j = 2*Tblocksize - offset; else j = len; //if(debug)fprint(2, "filling %d bytes at end\n", j); memset(p, 0, j); p += j; } return p - area; }