/* return the next quoted block */ static obj_t *n_extractquote(nsp_state *N, cstate *state, unsigned short verbatim) { #define __FN__ __FILE__ ":n_extractquote()" obj_t *cobj; char q = *N->readptr; char *qs, *qe; obj_t tobj; int n; DEBUG_IN(); settrace(); sanetest(); if ((q != '\'') && (q != '\"') && (q != '`')) { DEBUG_OUT(); return NULL; } N->readptr++; qs = (char *)N->readptr; n_skipquote(N, q, state, verbatim); qe = (char *)N->readptr; if (verbatim) { cobj = nsp_setstr(N, &N->r, "", qs, qe - qs - 1); } else { nc_memset((void *)&tobj, 0, sizeof(obj_t)); nsp_setstr(N, &tobj, "", NULL, qe - qs - 1); n = n_unescape(N, qs, tobj.val->d.str, qe - qs - 1, state); cobj = nsp_setstr(N, &N->r, "", tobj.val->d.str, n); nsp_unlinkval(N, &tobj); } DEBUG_OUT(); return cobj; #undef __FN__ }
void globalAlign(DYNAM *p_dynam) { int i,j; int lc1,lc2; double max, h, Ix, Iy; initglobalA(p_dynam); lc1=p_dynam->lc1; lc2=p_dynam->lc2; p_dynam->si=lc1-1; p_dynam->sj=lc2-1; for(i=1; i <lc1; i++) { for(j=1; j <lc2; j++) { p_dynam->h[i][j]= hglob(p_dynam,i,j); p_dynam->Ix[i][j]= ixglob(p_dynam,i,j); p_dynam->Iy[i][j]= iyglob(p_dynam,i,j); settrace(p_dynam,i,j); } } h = p_dynam->h[lc1-1][lc2-1]; Ix = p_dynam->Ix[lc1-1][lc2-1]; Iy = p_dynam->Iy[lc1-1][lc2-1]; max=maximumdouble(3,h,Ix,Iy); p_dynam->score=max; }
static obj_t *n_newobj(nsp_state *N, cstate *state) { #define __FN__ __FILE__ ":n_newobj()" settrace(); if (state->lobj1 == NULL) { state->lobj1 = state->tobj1->val->d.table.f = n_newiobj(N, state->index); } else { state->lobj1->next = n_newiobj(N, state->index); state->lobj1->next->prev = state->lobj1; state->lobj1 = state->lobj1->next; } state->index++; return state->lobj1; #undef __FN__ }
void overlapAlign(DYNAM *p_dynam) { int i , j , lc1 , lc2; double score=MIN_DOUBLE; double tmp; initLocalA(p_dynam); lc1=p_dynam->lc1; lc2=p_dynam->lc2; for(i = 1; i< lc1;i++) { for(j =1; j<lc2;j++) { /*The same conditions like for global but different initialization*/ p_dynam->h[i][j]= hglob(p_dynam,i,j); p_dynam->Ix[i][j]= ixglob(p_dynam,i,j); p_dynam->Iy[i][j]= iyglob(p_dynam,i,j); settrace(p_dynam,i,j); } } /*find maximal score in last row or last column*/ for(i = 1 ; i< lc1; i++) { tmp = maximumdouble(3 , p_dynam->h[i][lc2-1] , p_dynam->Ix[i][lc2-1] , p_dynam->Iy[i][lc2-1]); if(tmp > score) { /*set traceback start*/ p_dynam->si=i; p_dynam->sj=lc2-1; score=tmp; } } for(i=1 ; i< lc2; i++) { tmp = maximumdouble(3 , p_dynam->h[lc1-1][i] , p_dynam->Ix[lc1-1][i] , p_dynam->Iy[lc1-1][i]); if(tmp>score) { /*set traceback start*/ p_dynam->si=lc1-1; p_dynam->sj=i; score=score; } } p_dynam->score = score; }
/* Advance readptr to next matching quote */ static void n_skipquote(nsp_state *N, unsigned short c, cstate *state, unsigned short verbatim) { #define __FN__ __FILE__ ":n_skipquote()" settrace(); while (*N->readptr) { if (*N->readptr == '\\' && !verbatim) { N->readptr++; } else if (*N->readptr == c) { N->readptr++; break; } else if (*N->readptr == '\n') { ++state->lineno; } N->readptr++; if (!*N->readptr) n_error(N, NE_SYNTAX, __FN__, "unterminated string"); } return; #undef __FN__ }
static long n_unescape(nsp_state *N, char *src, char *dst, long len, cstate *state) { #define __FN__ __FILE__ ":n_unescape()" long i, n; short e = 0; settrace(); if (dst == NULL) return 0; for (i = 0, n = 0; i < len; i++) { if (!e) { if (src[i] == '\\') { e = 1; } else { dst[n++] = src[i]; } continue; } switch (src[i]) { case '0': dst[n++] = 0; break; case 'a': dst[n++] = '\a'; break; case 't': dst[n++] = '\t'; break; case 'f': dst[n++] = '\f'; break; case 'e': dst[n++] = 27; break; case 'r': dst[n++] = '\r'; break; case 'n': dst[n++] = '\n'; break; case '\'': dst[n++] = '\''; break; case '\"': dst[n++] = '\"'; break; case '`': dst[n++] = '`'; break; case '\\': dst[n++] = '\\'; break; default: n_warn(N, __FN__, "bad escape %d", src[i]); break; } e = 0; } dst[n] = '\0'; return n; #undef __FN__ }
void localAlign(DYNAM *p_dynam) { int i,j; int lc1,lc2; double score = MIN_DOUBLE; double tmp; initLocalA(p_dynam); lc1=p_dynam->lc1; lc2=p_dynam->lc2; for(i = 1; i< lc1;i++) { for(j =1; j<lc2;j++) { /*The same conditions like for global, except for the h matrix.*/ p_dynam->h[i][j]= maximumdouble(2, 0.0 ,hglob(p_dynam,i,j)); p_dynam->Ix[i][j]= ixglob(p_dynam,i,j); p_dynam->Iy[i][j]= iyglob(p_dynam,i,j); settrace(p_dynam, i, j); } } /*find maximal score in matrices*/ for(i = 1 ; i< lc1; i++) { for(j = 1 ; j < lc2 ; j++) { tmp = maximumdouble(3, p_dynam->h[i][j] , p_dynam->Ix[i][j] , p_dynam->Iy[i][j] ); if(tmp>score) { p_dynam->si=i; /*set start of traceback*/ p_dynam->sj=j; /*set start of traceback*/ score=tmp; } } } p_dynam->score = score; }
void threadmain(int argc, char *argv[]) { int vers; ArenaPart *ap; Part *part; Arena *arena; uint64_t addr, limit, asize, apsize; char *file, *name, aname[ANameSize]; int i, n, blocksize, tabsize, zero; ventifmtinstall(); statsinit(); blocksize = 8 * 1024; asize = 512 * 1024 *1024; tabsize = 512 * 1024; /* BUG: should be determine from number of arenas */ zero = -1; vers = ArenaVersion5; ARGBEGIN{ case 'D': settrace(EARGF(usage())); break; case 'a': asize = unittoull(EARGF(usage())); if(asize == TWID64) usage(); break; case 'b': blocksize = unittoull(EARGF(usage())); if(blocksize == ~0) usage(); if(blocksize > MaxDiskBlock){ fprint(2, "block size too large, max %d\n", MaxDiskBlock); threadexitsall("usage"); } break; case '4': vers = ArenaVersion4; break; case 'Z': zero = 0; break; default: usage(); break; }ARGEND if(zero == -1){ if(vers == ArenaVersion4) zero = 1; else zero = 0; } if(argc != 2) usage(); name = argv[0]; file = argv[1]; if(nameok(name) < 0) sysfatal("illegal name template %s", name); part = initpart(file, ORDWR|ODIRECT); if(part == nil) sysfatal("can't open partition %s: %r", file); if(zero) zeropart(part, blocksize); maxblocksize = blocksize; initdcache(20*blocksize); ap = newarenapart(part, blocksize, tabsize); if(ap == nil) sysfatal("can't initialize arena: %r"); apsize = ap->size - ap->arenabase; n = apsize / asize; if(apsize - (n * asize) >= MinArenaSize) n++; fprint(2, "fmtarenas %s: %,d arenas, %,lld bytes storage, %,d bytes for index map\n", file, n, apsize, ap->tabsize); ap->narenas = n; ap->map = MKNZ(AMap, n); ap->arenas = MKNZ(Arena*, n); addr = ap->arenabase; for(i = 0; i < n; i++){ limit = addr + asize; if(limit >= ap->size || ap->size - limit < MinArenaSize){ limit = ap->size; if(limit - addr < MinArenaSize) sysfatal("bad arena set math: runt arena at %lld,%lld %lld", addr, limit, ap->size); } snprint(aname, ANameSize, "%s%d", name, i); if(0) fprint(2, "adding arena %s at [%lld,%lld)\n", aname, addr, limit); arena = newarena(part, vers, aname, addr, limit - addr, blocksize); if(!arena) fprint(2, "can't make new arena %s: %r", aname); freearena(arena); ap->map[i].start = addr; ap->map[i].stop = limit; namecp(ap->map[i].name, aname); addr = limit; } if(wbarenapart(ap) < 0) fprint(2, "can't write back arena partition header for %s: %r\n", file); flushdcache(); threadexitsall(0); }
/* Save a vector with the analysis type given (name). */ void com_save2(wordlist *wl, char *name) { settrace(wl, VF_ACCUM, name); }
void com_save(wordlist *wl) { settrace(wl, VF_ACCUM, NULL); }
void threadmain(int argc, char *argv[]) { char *haddr, *vaddr, *webroot, *file; traceinit(); threadsetname("main"); vaddr = nil; haddr = "tcp!*!9000"; webroot = nil; ARGBEGIN{ case 'a': vaddr = EARGF(usage()); break; case 'D': settrace(EARGF(usage())); break; case 'd': debug = 1; nofork = 1; break; case 'h': haddr = EARGF(usage()); break; case 'L': ventilogging = 1; break; case 'r': readonly = 1; break; case 's': nofork = 1; break; case 'W': webroot = EARGF(usage()); break; default: usage(); }ARGEND if(argc < 1) usage(); file = argv[0]; if(!nofork) rfork(RFNOTEG); #ifdef PLAN9PORT { /* sigh - needed to avoid signals when writing to hungup networks */ struct sigaction sa; memset(&sa, 0, sizeof sa); sa.sa_handler = SIG_IGN; sigaction(SIGPIPE, &sa, nil); } #endif ventifmtinstall(); trace(TraceQuiet, "venti started"); fprint(2, "%T venti: "); statsinit(); mminit(file, readonly ? OREAD : ORDWR); /* * default other configuration-file parameters */ if(vaddr == nil) vaddr = "tcp!*!venti"; if(haddr){ fprint(2, "httpd %s...", haddr); if(httpdinit(haddr, webroot) < 0) fprint(2, "warning: can't start http server: %r"); } fprint(2, "init..."); fprint(2, "announce %s...", vaddr); ventisrv = vtlisten(vaddr); if(ventisrv == nil) sysfatal("can't announce %s: %r", vaddr); fprint(2, "serving.\n"); if(nofork) ventiserver(nil); else vtproc(ventiserver, nil); threadexits(nil); }
int main( int argc, char *argv[] ) { int res=0; if (argc < 3) { printf("frunagent <nodelist> start \"command\" [options] \n" " stop <commandid> [options]\n" " account <user> <password> <dir> [option]\n" " dir <dir> [option]\n" " alive <integer> [option]\n\n" "where <nodelist> is of the form h009100:h009119,h007010:h007020\n" "or 192.168.6.100:192.168.6.119,192.168.7.10:192.168.7.20\n" "or @filename where filename contains a file in the above format\n" "options: /n<number_of_thread> /t<call_time_out> /encrypt /o<replication_offset>\n" ); return 255; } InitModuleObjects(); StringBuffer tracepath; tracepath.append(".").append(PATHSEPCHAR).append("frunagent.txt"); settrace(tracepath.str(),false); ECHO_TO_CONSOLE=true; try { setoptions(argc,argv); split_node x(argc,argv); if (argv[1][0]=='@') { StringBuffer b; b.loadFile(argv[1]+1); char *finger = (char *) b.str(); while (*finger) { if (*finger == '\n') *finger++ = ';'; else if (*finger == '#') { while (*finger && *finger != '\n') *finger++ = ' '; } else finger++; } x.split_nodes_ex(b.str(),replicationoffset); } else x.split_nodes_ex(argv[1],replicationoffset); disp->all_done_ex(false); } catch(IException *e) { pexception("",e); e->Release(); res=255; } catch (...) { traceft("Caught unknown exception"); } #ifdef _TRACING traceflush(); #endif if (disp) delete disp; return res; }
uchar *n_decompose(nsp_state *N, char *srcfile, uchar *srctext, uchar **dsttext, int *dstsize) { #define __FN__ __FILE__ ":n_decompose()" cstate state; obj_t *cobj, *tobj; unsigned short op; uchar *p, *p2; settrace(); *dsttext = NULL; *dstsize = 0; if ((srctext[0] == 0x0D) && ((srctext[1] == 0xAC))) { n_warn(N, __FN__, "already chewed on this"); return srctext; } nc_memset((char *)&state, 0, sizeof(state)); state.lineno = 1; state.destmax = 1024; state.destbuf = (uchar *)n_alloc(N, state.destmax, 0); N->readptr = srctext; tobj = nsp_settable(N, &N->g, "decomped_script"); nsp_freetable(N, tobj); state.tobj1 = nsp_settable(N, tobj, "code"); n_decompose_sub(N, &state); /* header - 8 bytes */ testgrow(8); /* safe portable use of sprintf is still considered dangerous according to openbsd */ state.destbuf[state.offset++] = 0x0D; state.destbuf[state.offset++] = 0xAC; state.destbuf[state.offset++] = 0; state.destbuf[state.offset++] = 0; state.destbuf[state.offset++] = 0; state.destbuf[state.offset++] = 0; state.destbuf[state.offset++] = 0; state.destbuf[state.offset++] = 0; /* file size - 4 bytes */ state.destbuf[state.offset++] = 0; state.destbuf[state.offset++] = 0; state.destbuf[state.offset++] = 0; state.destbuf[state.offset++] = 0; /* optab offset - 4 bytes (little endian) */ state.destbuf[state.offset++] = 0; state.destbuf[state.offset++] = 0; state.destbuf[state.offset++] = 0; state.destbuf[state.offset++] = 0; /* symtab offset - 4 bytes (little endian) */ state.destbuf[state.offset++] = 0; state.destbuf[state.offset++] = 0; state.destbuf[state.offset++] = 0; state.destbuf[state.offset++] = 0; /* now write the ops */ /* optab offset */ writei4(state.offset, (state.destbuf + 12)); /* set line number to 1 */ testgrow((long)(5)); state.destbuf[state.offset++] = OP_LINENUM; writei4(1, (state.destbuf + state.offset)); state.offset += 4; for (cobj = state.tobj1->val->d.table.f; cobj; cobj = cobj->next) { op = (unsigned short)cobj->val->attr; cobj->val->attr = 0; if (op == OP_LINENUM) { testgrow((long)(5)); state.destbuf[state.offset++] = op & 255; writei4((int)cobj->val->d.num, (state.destbuf + state.offset)); state.offset += 4; continue; } if (!nsp_isstr(cobj)) break; if (op == OP_UNDEFINED) break; if (op == OP_POBRACE) { testgrow((long)(5)); state.destbuf[state.offset++] = op & 255; writei4(0, (state.destbuf + state.offset)); state.offset += 4; continue; } else if (op == OP_POPAREN) { testgrow((long)(3)); state.destbuf[state.offset++] = op & 255; writei2(0, (state.destbuf + state.offset)); state.offset += 2; continue; } else if (op == OP_STRDATA || op == OP_ESTRDATA) { testgrow((long)(6 + cobj->val->size)); state.destbuf[state.offset++] = op & 255; writei4(cobj->val->size, (state.destbuf + state.offset)); state.offset += 4; nc_memcpy((char *)state.destbuf + state.offset, cobj->val->d.str, cobj->val->size); state.offset += cobj->val->size; state.destbuf[state.offset++] = 0; } else if (op == OP_NUMDATA) { testgrow((long)(3 + cobj->val->size)); state.destbuf[state.offset++] = op & 255; state.destbuf[state.offset++] = (uchar)(cobj->val->size & 255); nc_memcpy((char *)state.destbuf + state.offset, cobj->val->d.str, cobj->val->size); state.offset += cobj->val->size; state.destbuf[state.offset++] = 0; } else if (op == OP_LABEL) { testgrow((long)(3 + cobj->val->size)); state.destbuf[state.offset++] = op & 255; state.destbuf[state.offset++] = (uchar)(cobj->val->size & 255); nc_memcpy((char *)state.destbuf + state.offset, cobj->val->d.str, cobj->val->size); state.offset += cobj->val->size; state.destbuf[state.offset++] = '\0'; } else if (OP_ISMATH(op) || OP_ISKEY(op) || OP_ISPUNC(op)) { testgrow(1); state.destbuf[state.offset++] = op & 255; if (op == OP_KFUNC) { char *p = srcfile; //n_warn(N, __FN__, "'%s'", p); if (cobj->next->val->attr == OP_LABEL) { cobj = cobj->next; op = (unsigned short)cobj->val->attr; cobj->val->attr = 0; testgrow((long)(3 + cobj->val->size)); state.destbuf[state.offset++] = op & 255; state.destbuf[state.offset++] = (uchar)(cobj->val->size & 255); nc_memcpy((char *)state.destbuf + state.offset, cobj->val->d.str, cobj->val->size); state.offset += cobj->val->size; state.destbuf[state.offset++] = '\0'; } if (srcfile == NULL) p = ""; testgrow((long)(3 + nc_strlen(p))); state.destbuf[state.offset++] = OP_LABEL; state.destbuf[state.offset++] = (uchar)(nc_strlen(p) & 255); nc_memcpy((char *)state.destbuf + state.offset, p, nc_strlen(p)); state.offset += nc_strlen(p); state.destbuf[state.offset++] = '\0'; } } else { n_warn(N, __FN__, "bad op?"); } } /* file size */ writei4(state.offset, (state.destbuf + 8)); /* add some trailing nulls for fun... */ testgrow(4); writei4(0, (state.destbuf + state.offset)); state.offset += 4; /* n_dumpvars(N, &N->g, 0); */ nsp_freetable(N, tobj); *dsttext = state.destbuf; *dstsize = state.destmax; for (p = *dsttext + 12; p < *dsttext + state.offset - 4;) { if (*p == OP_LINENUM) { p += 5; continue; } if (*p == OP_POBRACE) { p2 = n_seekop(N, p, 1); if (p2 <= p) { n_warn(N, __FN__, "pointer did not progress"); break; } --p2; // if (*p2!=OP_PCBRACE) n_warn(N, __FN__, "no OP_PCBRACE? %d", (p+(p2-p)+5)[0]); if (*p2 != OP_PCBRACE) { /* int i; for (i=0;i<state.offset;i++) { if (i==p2-*dsttext) { printf("-----------------------\r\n[%d]\r\n-------------------", state.destbuf[i]); } else { if (state.destbuf[i]>=32 && state.destbuf[i]<128) { printf("'%c' %d\r\n", state.destbuf[i], state.destbuf[i]); } else { printf("%d\r\n", state.destbuf[i]); } } } */ n_warn(N, __FN__, "no OP_PCBRACE? %d .. %d %d %d %d [%d] %d %d", OP_PCBRACE, p2[-4], p2[-3], p2[-2], p2[-1], p2[0], p2[1], p2[2]); //n_decompile(N, *dsttext+12, *dsttext+state.offset-4, NULL, 0); } writei4((p2 - p - 5), (p + 1)); } else if (*p == OP_POPAREN) { p2 = n_seekop(N, p, 1); if (p2 <= p) { n_warn(N, __FN__, "pointer did not progress"); break; } --p2; if (*p2 != OP_PCPAREN) { n_warn(N, __FN__, "no OP_PCPAREN? %d .. %d %d %d %d [%d] %d %d", OP_PCPAREN, p2[-4], p2[-3], p2[-2], p2[-1], p2[0], p2[1], p2[2]); } writei2((p2 - p - 3), (p + 1)); } p = n_seekop(N, p, 0); } return *dsttext; #undef __FN__ }
static void n_decompose_sub(nsp_state *N, cstate *state) { #define __FN__ __FILE__ ":n_decompose_sub()" char lastname[MAX_OBJNAMELEN + 1]; char *p; short op; short prevop = 0; settrace(); while (*N->readptr) { n_skipblank(N, state); op = n_getop(N, lastname); n_skipblank(N, state); if (op == OP_UNDEFINED) { n_warn(N, __FN__, "bad op? index=%d line=%d op=%d:%d name='%s'", state->index, state->lineno, op, N->readptr[0], lastname); return; } else if (op == OP_LABEL) { n_newobj(N, state); nsp_setstr(N, state->lobj1, NULL, lastname, -1); state->lobj1->val->attr = op; } else if (OP_ISMATH(op) || OP_ISKEY(op) || OP_ISPUNC(op)) { if (OP_ISKEY(op) && prevop == OP_PDOT) { // it's NOT a keyword! int i; for (i = OP_KEXIT; i <= OP_KBREAK; i++) { if (nc_strcmp(oplist[i].name, lastname) == 0) { n_newobj(N, state); nsp_setstr(N, state->lobj1, NULL, lastname, -1); state->lobj1->val->attr = OP_LABEL; break; } } } else { n_newobj(N, state); nsp_setstr(N, state->lobj1, NULL, n_getsym(N, op), -1); state->lobj1->val->attr = op; } } else if (N->readptr[0] == '\"' || N->readptr[0] == '\'' || N->readptr[0] == '`') { op = N->readptr[0]; n_newobj(N, state); nsp_linkval(N, state->lobj1, n_extractquote(N, state, 0)); state->lobj1->val->attr = op == '`' ? OP_ESTRDATA : OP_STRDATA; } else if (N->readptr[0] == '@' && (N->readptr[1] == '\"' || N->readptr[1] == '\'' || N->readptr[1] == '`')) { op = N->readptr[1]; N->readptr++; n_newobj(N, state); nsp_linkval(N, state->lobj1, n_extractquote(N, state, 1)); state->lobj1->val->attr = op == '`' ? OP_ESTRDATA : OP_STRDATA; } else if (nc_isdigit(*N->readptr)) { p = (char *)N->readptr; while (nc_isdigit(*N->readptr) || *N->readptr == '.') N->readptr++; n_newobj(N, state); nsp_setstr(N, state->lobj1, NULL, p, (char *)N->readptr - p); state->lobj1->val->attr = OP_NUMDATA; } prevop = op; } return; #undef __FN__ }
/* Advance readptr to next non-blank */ static void n_skipblank(nsp_state *N, cstate *state) { #define __FN__ __FILE__ ":n_skipblank()" uchar *p = N->readptr; settrace(); while (*p) { if (p[0] == '#') { p++; while (*p) { if (*p == '\n') { n_newobj(N, state); nsp_setnum(N, state->lobj1, NULL, ++state->lineno); state->lobj1->val->attr = OP_LINENUM; break; } else if (*p == '\r') break; p++; } } else if (p[0] == '/'&&p[1] == '/') { p += 2; while (*p) { if (*p == '\n') { n_newobj(N, state); nsp_setnum(N, state->lobj1, NULL, ++state->lineno); state->lobj1->val->attr = OP_LINENUM; break; } else if (*p == '\r') break; p++; } } else if (p[0] == '/'&&p[1] == '*') { p += 2; while (*p) { if (*p == '\n') state->lineno++; else if (p[0] == '*'&&p[1] == '/') { p += 2; if (*p == '\n') { n_newobj(N, state); nsp_setnum(N, state->lobj1, NULL, ++state->lineno); state->lobj1->val->attr = OP_LINENUM; } break; } p++; } } else { if (*p == '\n') { n_newobj(N, state); nsp_setnum(N, state->lobj1, NULL, ++state->lineno); state->lobj1->val->attr = OP_LINENUM; } } if (!nc_isspace(*p)) break; p++; } N->readptr = p; return; #undef __FN__ }
void threadmain(int argc, char *argv[]) { char *configfile, *haddr, *vaddr, *webroot; u32int mem, icmem, bcmem, minbcmem, mempcnt, stfree; Allocs allocs; Config config; traceinit(); threadsetname("main"); mempcnt = 0; vaddr = nil; haddr = nil; configfile = nil; webroot = nil; mem = Unspecified; icmem = 0; bcmem = 0; ARGBEGIN{ case 'a': vaddr = EARGF(usage()); break; case 'B': bcmem = unittoull(EARGF(usage())); break; case 'c': configfile = EARGF(usage()); break; case 'C': mem = unittoull(EARGF(usage())); break; case 'D': settrace(EARGF(usage())); break; case 'd': debug = 1; nofork = 1; break; case 'h': haddr = EARGF(usage()); break; case 'm': mempcnt = atoi(EARGF(usage())); if (mempcnt <= 0 || mempcnt >= 100) usage(); break; case 'I': icmem = unittoull(EARGF(usage())); break; case 'L': ventilogging = 1; break; case 'r': readonly = 1; break; case 's': nofork = 1; break; case 'w': /* compatibility with old venti */ queuewrites = 1; break; case 'W': webroot = EARGF(usage()); break; default: usage(); }ARGEND if(argc) usage(); if(!nofork) rfork(RFNOTEG); #ifdef PLAN9PORT { /* sigh - needed to avoid signals when writing to hungup networks */ struct sigaction sa; memset(&sa, 0, sizeof sa); sa.sa_handler = SIG_IGN; sigaction(SIGPIPE, &sa, nil); } #endif ventifmtinstall(); trace(TraceQuiet, "venti started"); fprint(2, "%T venti: "); if(configfile == nil) configfile = "venti.conf"; /* remember free memory before initventi & loadbloom, for auto-sizing */ stfree = freemem(); fprint(2, "conf..."); if(initventi(configfile, &config) < 0) sysfatal("can't init server: %r"); /* * load bloom filter */ if(mainindex->bloom && loadbloom(mainindex->bloom) < 0) sysfatal("can't load bloom filter: %r"); /* * size memory allocations; assumes bloom filter is loaded */ allocs = sizeallocs((Allocs){mem, bcmem, icmem, stfree, mempcnt}, &config); mem = allocs.mem; bcmem = allocs.bcmem; icmem = allocs.icmem; fprint(2, "%s: mem %,ud bcmem %,ud icmem %,ud...", argv0, mem, bcmem, icmem); /* * default other configuration-file parameters */ if(haddr == nil) haddr = config.haddr; if(vaddr == nil) vaddr = config.vaddr; if(vaddr == nil) vaddr = "tcp!*!venti"; if(webroot == nil) webroot = config.webroot; if(queuewrites == 0) queuewrites = config.queuewrites; if(haddr){ fprint(2, "httpd %s...", haddr); if(httpdinit(haddr, webroot) < 0) fprint(2, "warning: can't start http server: %r"); } fprint(2, "init..."); /* * lump cache */ if(0) fprint(2, "initialize %d bytes of lump cache for %d lumps\n", mem, mem / (8 * 1024)); initlumpcache(mem, mem / (8 * 1024)); /* * index cache */ initicache(icmem); initicachewrite(); /* * block cache: need a block for every arena and every process */ minbcmem = maxblocksize * (mainindex->narenas + mainindex->nsects*4 + 16); if(bcmem < minbcmem) bcmem = minbcmem; if(0) fprint(2, "initialize %d bytes of disk block cache\n", bcmem); initdcache(bcmem); if(mainindex->bloom) startbloomproc(mainindex->bloom); fprint(2, "sync..."); if(!readonly && syncindex(mainindex) < 0) sysfatal("can't sync server: %r"); if(!readonly && queuewrites){ fprint(2, "queue..."); if(initlumpqueues(mainindex->nsects) < 0){ fprint(2, "can't initialize lump queues," " disabling write queueing: %r"); queuewrites = 0; } } if(initarenasum() < 0) fprint(2, "warning: can't initialize arena summing process: %r"); fprint(2, "announce %s...", vaddr); ventisrv = vtlisten(vaddr); if(ventisrv == nil) sysfatal("can't announce %s: %r", vaddr); fprint(2, "serving.\n"); if(nofork) ventiserver(nil); else vtproc(ventiserver, nil); threadexits(nil); }