plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

devnull.c (1223B)


      1 /* Copyright (c) 2004 Russ Cox */
      2 #include <u.h>
      3 #include <libc.h>
      4 #include <venti.h>
      5 #include <thread.h>
      6 #include <libsec.h>
      7 
      8 #ifndef _UNISTD_H_
      9 #pragma varargck type "F" VtFcall*
     10 #pragma varargck type "T" void
     11 #endif
     12 
     13 int verbose;
     14 
     15 enum
     16 {
     17 	STACK = 8192
     18 };
     19 
     20 void
     21 usage(void)
     22 {
     23 	fprint(2, "usage: venti/devnull [-v] [-a address]\n");
     24 	threadexitsall("usage");
     25 }
     26 
     27 void
     28 threadmain(int argc, char **argv)
     29 {
     30 	VtReq *r;
     31 	VtSrv *srv;
     32 	char *address;
     33 
     34 	fmtinstall('V', vtscorefmt);
     35 	fmtinstall('F', vtfcallfmt);
     36 
     37 	address = "tcp!*!venti";
     38 
     39 	ARGBEGIN{
     40 	case 'v':
     41 		verbose++;
     42 		break;
     43 	case 'a':
     44 		address = EARGF(usage());
     45 		break;
     46 	default:
     47 		usage();
     48 	}ARGEND
     49 
     50 	srv = vtlisten(address);
     51 	if(srv == nil)
     52 		sysfatal("vtlisten %s: %r", address);
     53 
     54 	while((r = vtgetreq(srv)) != nil){
     55 		r->rx.msgtype = r->tx.msgtype+1;
     56 		if(verbose)
     57 			fprint(2, "<- %F\n", &r->tx);
     58 		switch(r->tx.msgtype){
     59 		case VtTping:
     60 			break;
     61 		case VtTgoodbye:
     62 			break;
     63 		case VtTread:
     64 			r->rx.error = vtstrdup("no such block");
     65 			r->rx.msgtype = VtRerror;
     66 			break;
     67 		case VtTwrite:
     68 			packetsha1(r->tx.data, r->rx.score);
     69 			break;
     70 		case VtTsync:
     71 			break;
     72 		}
     73 		if(verbose)
     74 			fprint(2, "-> %F\n", &r->rx);
     75 		vtrespond(r);
     76 	}
     77 	threadexitsall(nil);
     78 }