| #include <u.h> |
| #include <libc.h> |
| #include <venti.h> |
| #include <libsec.h> |
| #include <thread.h> |
| |
| enum |
| { |
| Blocksize = 8192 |
| }; |
| |
| int chatty; |
| |
| void |
| usage(void) |
| { |
| fprint(2, "usage: writefile [-v] [-h host] < data\n"); |
| threadexitsall("usage"); |
| } |
| |
| void |
| threadmain(int argc, char *argv[]) |
| { |
| int n; |
| uchar score[VtScoreSize]; |
| uchar *buf; |
| char *host; |
| vlong off; |
| VtEntry e; |
| VtRoot root; |
| VtCache *c; |
| VtConn *z; |
| VtFile *f; |
| |
| quotefmtinstall(); |
| fmtinstall('F', vtfcallfmt); |
| fmtinstall('V', vtscorefmt); |
| |
| host = nil; |
| ARGBEGIN{ |
| case 'V': |
| chattyventi++; |
| break; |
| case 'h': |
| host = EARGF(usage()); |
| break; |
| case 'v': |
| chatty++; |
| break; |
| default: |
| usage(); |
| break; |
| }ARGEND |
| |
| if(argc != 0) |
| usage(); |
| |
| buf = vtmallocz(Blocksize); |
| |
| z = vtdial(host); |
| if(z == nil) |
| sysfatal("could not connect to server: %r"); |
| |
| if(vtconnect(z) < 0) |
| sysfatal("vtconnect: %r"); |
| |
| // write file |
| c = vtcachealloc(z, Blocksize*32); |
| if(c == nil) |
| sysfatal("vtcachealloc: %r"); |
| f = vtfilecreateroot(c, Blocksize, Blocksize, VtDataType); |
| if(f == nil) |
| sysfatal("vtfilecreateroot: %r"); |
| off = 0; |
| vtfilelock(f, VtOWRITE); |
| while((n = read(0, buf, Blocksize)) > 0){ |
| if(vtfilewrite(f, buf, n, off) != n) |
| sysfatal("vtfilewrite: %r"); |
| off += n; |
| if(vtfileflushbefore(f, off) < 0) |
| sysfatal("vtfileflushbefore: %r"); |
| } |
| if(vtfileflush(f) < 0) |
| sysfatal("vtfileflush: %r"); |
| if(vtfilegetentry(f, &e) < 0) |
| sysfatal("vtfilegetentry: %r"); |
| vtfileunlock(f); |
| |
| // write directory entry |
| memset(&root, 0, sizeof root); |
| vtentrypack(&e, buf, 0); |
| if(vtwrite(z, root.score, VtDirType, buf, VtEntrySize) < 0) |
| sysfatal("vtwrite dir: %r"); |
| |
| // write root |
| strcpy(root.name, "data"); |
| strcpy(root.type, "file"); |
| root.blocksize = Blocksize; |
| vtrootpack(&root, buf); |
| if(vtwrite(z, score, VtRootType, buf, VtRootSize) < 0) |
| sysfatal("vtwrite root: %r"); |
| |
| print("file:%V\n", score); |
| threadexitsall(0); |
| } |
| |