static void fswrite(Req *r) { vlong n, m, got; Aux *a = r->fid->aux; vlong len = r->ifcall.count; vlong off = r->ifcall.offset; char *buf = r->ifcall.data; got = 0; n = Sess->mtu -OVERHEAD; do{ if(len - got < n) n = len - got; m = CIFSwrite(Sess, a->sp, a->fh, off + got, buf + got, n); if(m != -1) got += m; } while(got < len && m >= n); r->ofcall.count = got; if(m == -1) responderrstr(r); else respond(r, nil); }
static void fsopen(Req *r) { int rc; FInfo fi; Aux *a = r->fid->aux; a->end = a->off = 0; a->cache = emalloc9p(max(Sess->mtu, MTU)); if(ptype(r->fid->qid.path) == Pinfo){ if(makeinfo(pindex(r->fid->qid.path)) != -1) respond(r, nil); else respond(r, "cannot generate info"); return; } if(r->fid->qid.type & QTDIR){ respond(r, nil); return; } if(Sess->caps & CAP_NT_SMBS) rc = ntcreateopen(a, mapfile(a->path), r->ifcall.mode, 0777, 0, 0, &fi); else rc = smbcreateopen(a, mapfile(a->path), r->ifcall.mode, 0777, 0, 0, &fi); if(rc == -1){ responderrstr(r); return; } respond(r, nil); }
static void fscreate(Req *r) { FInfo fi; int rc, is_dir; char *npath; Aux *a = r->fid->aux; a->end = a->off = 0; a->cache = emalloc9p(max(Sess->mtu, MTU)); is_dir = (r->ifcall.perm & DMDIR) == DMDIR; npath = smprint("%s/%s", a->path, r->ifcall.name); if(Sess->caps & CAP_NT_SMBS) rc = ntcreateopen(a, mapfile(npath), r->ifcall.mode, r->ifcall.perm, 1, is_dir, &fi); else rc = smbcreateopen(a, mapfile(npath), r->ifcall.mode, r->ifcall.perm, 1, is_dir, &fi); if(rc == -1){ free(npath); responderrstr(r); return; } r->fid->qid = mkqid(npath, fi.attribs & ATTR_DIRECTORY, fi.changed, 0, 0); r->ofcall.qid = r->fid->qid; free(a->path); a->path = npath; respond(r, nil); }
static void fsstat(Req *r) { int rc; FInfo fi; Aux *a = r->fid->aux; if(ptype(r->fid->qid.path) == Proot) V2D(&r->d, r->fid->qid, ""); else if(ptype(r->fid->qid.path) == Pinfo) dirgeninfo(pindex(r->fid->qid.path), &r->d); else if(ptype(r->fid->qid.path) == Pshare) V2D(&r->d, r->fid->qid, a->path +1); else{ memset(&fi, 0, sizeof fi); if(Sess->caps & CAP_NT_SMBS) rc = T2queryall(Sess, a->sp, mapfile(a->path), &fi); else rc = T2querystandard(Sess, a->sp, mapfile(a->path), &fi); if(rc == -1){ responderrstr(r); return; } I2D(&r->d, a->sp, a->path, &fi); if(Billtrog == 0) upd_names(Sess, a->sp, mapfile(a->path), &r->d); } respond(r, nil); }
static void fsread(Req *r) { vlong n, m, got; Aux *a = r->fid->aux; char *buf = r->ofcall.data; vlong len = r->ifcall.count; vlong off = r->ifcall.offset; if(ptype(r->fid->qid.path) == Pinfo){ r->ofcall.count = readinfo(pindex(r->fid->qid.path), buf, len, off); respond(r, nil); return; } if(r->fid->qid.type & QTDIR){ dirread9p(r, dirgen, a); respond(r, nil); return; } got = 0; n = Sess->mtu -OVERHEAD; do{ if(len - got < n) n = len - got; m = CIFSread(Sess, a->sp, a->fh, off + got, buf + got, n, len); if(m != -1) got += m; } while(got < len && m >= n); r->ofcall.count = got; if(m == -1) responderrstr(r); else respond(r, nil); }
static void xread(Req *r) { int i, size, height, ascent; vlong path; Fmt fmt; XFont *f; char *data; Memsubfont *sf; Memimage *m; path = r->fid->qid.path; switch(QTYPE(path)) { case Qroot: dirread9p(r, rootgen, nil); break; case Qfontdir: dirread9p(r, fontgen, r->fid); break; case Qsizedir: dirread9p(r, sizegen, r->fid); break; case Qfontfile: fmtstrinit(&fmt); f = &xfont[QFONT(path)]; load(f); if(f->unit == 0 && f->loadheight == nil) { readstr(r, "font missing\n"); break; } height = 0; ascent = 0; if(f->unit > 0) { height = f->height * (int)QSIZE(path)/f->unit + 0.99999999; ascent = height - (int)(-f->originy * (int)QSIZE(path)/f->unit + 0.99999999); } if(f->loadheight != nil) f->loadheight(f, QSIZE(path), &height, &ascent); fmtprint(&fmt, "%11d %11d\n", height, ascent); for(i=0; i<nelem(f->range); i++) { if(f->range[i] == 0) continue; fmtprint(&fmt, "0x%04x 0x%04x x%04x.bit\n", i*SubfontSize, ((i+1)*SubfontSize) - 1, i*SubfontSize); } data = fmtstrflush(&fmt); readstr(r, data); free(data); break; case Qsubfontfile: f = &xfont[QFONT(path)]; load(f); if(r->fid->aux == nil) { r->fid->aux = mksubfont(f, f->name, QRANGE(path)*SubfontSize, ((QRANGE(path)+1)*SubfontSize)-1, QSIZE(path), QANTIALIAS(path)); if(r->fid->aux == nil) { responderrstr(r); return; } } sf = r->fid->aux; m = sf->bits; if(r->ifcall.offset < 5*12) { char *chan; if(QANTIALIAS(path)) chan = "k8"; else chan = "k1"; data = smprint("%11s %11d %11d %11d %11d ", chan, m->r.min.x, m->r.min.y, m->r.max.x, m->r.max.y); readstr(r, data); free(data); break; } r->ifcall.offset -= 5*12; size = bytesperline(m->r, chantodepth(m->chan)) * Dy(m->r); if(r->ifcall.offset < size) { readbuf(r, byteaddr(m, m->r.min), size); break; } r->ifcall.offset -= size; data = emalloc9p(3*12+6*(sf->n+1)); sprint(data, "%11d %11d %11d ", sf->n, sf->height, sf->ascent); packinfo(sf->info, (uchar*)data+3*12, sf->n); readbuf(r, data, 3*12+6*(sf->n+1)); free(data); break; } respond(r, nil); }