main(void) { char *re; char *line; Reprog *prog; char *cp; Biobuf in; Binit(&in, 0, OREAD); print("re> "); while(re = Brdline(&in, '\n')){ re[Blinelen(&in)-1] = 0; if(*re == 0) break; prog = regcomp(re); print("> "); while(line = Brdline(&in, '\n')){ line[Blinelen(&in)-1] = 0; if(cp = strchr(line, '\n')) *cp = 0; if(*line == 0) break; if(regexec(prog, line, 0)) print("yes\n"); else print("no\n"); print("> "); } print("re> "); } }
void replywindow(Article *m) { Biobuf *b; char *p, *ep, *q, tmp[40]; int fd, copy; Article *reply; sprint(tmp, "%d/article", m->n); p = estrstrdup(dir, tmp); if((fd = open(p, OREAD)) < 0){ free(p); return; } free(p); reply = newpost(); winopenbody(reply->w, OWRITE); b = emalloc(sizeof(*b)); Binit(b, fd, OREAD); copy = 0; while(p = Brdline(b, '\n')){ if(Blinelen(b)==1) break; ep = p+Blinelen(b); if(!isspace(*p)){ copy = 0; if(cistrncmp(p, "newsgroups:", 11)==0){ for(q=p+11; *q!='\n'; q++) if(*q==',') *q = ' '; copy = 1; }else if(cistrncmp(p, "subject:", 8)==0){ if(!strstr(p, " Re:") && !strstr(p, " RE:") && !strstr(p, " re:")){ p = skip(p, "subject:"); ep[-1] = '\0'; Bprint(reply->w->body, "Subject: Re: %s\n", p); }else copy = 1; }else if(cistrncmp(p, "message-id:", 11)==0){ Bprint(reply->w->body, "References: "); p += 11; copy = 1; } } if(copy) Bwrite(reply->w->body, p, ep-p); } Bterm(b); close(fd); free(b); Bprint(reply->w->body, "\n"); winclean(reply->w); winselect(reply->w, "$", 0); }
void cat(int f, char *s) { Biobuf b; char *p; Binit(&b, f, OREAD); while((p = Brdline(&b, '\n')) != nil) if(write(1, p, Blinelen(&b)) != Blinelen(&b)) sysfatal("write error copying %s: %r", s); Bterm(&b); }
int menu(Biobuf *bp, int net) { char *cp; int done; comm->stopped = 1; rawoff(); fprint(2, ">>> "); for(done = 0; !done; ){ cp = Brdline(bp, '\n'); if(cp == 0){ comm->stopped = 0; return -1; } cp[Blinelen(bp)-1] = 0; switch(*cp){ case '!': system(Bfildes(bp), cp+1); done = 1; break; case '.': done = 1; break; case 'q': comm->stopped = 0; return -1; case 'o': switch(*(cp+1)){ case 'd': send3(net, Iac, Do, atoi(cp+2)); break; case 'w': send3(net, Iac, Will, atoi(cp+2)); break; } break; case 'r': comm->returns = !comm->returns; done = 1; break; case 'i': send2(net, Iac, Interrupt); break; case 'b': send2(net, Iac, Break); break; default: fprint(2, STDHELP); break; } if(!done) fprint(2, ">>> "); } rawon(); comm->stopped = 0; return 0; }
void threadmain(int argc, char *argv[]) { char *errmsg; int ac; char *ap, *av[256]; Cmd *cp; int32_t status; if (argc > 3) { print("usage: cifscmd [to [share]]\n"); exits("args"); } smbglobalsguess(1); errmsg = nil; if (Binit(&bin, 0, OREAD) == Beof || Binit(&bout, 1, OWRITE) == Beof) { fprint(2, "%s: can't init bio: %r\n", argv0); threadexits("Binit"); } if (argc > 1) { c = smbconnect(argv[1], argc == 3 ? argv[2] : nil, &errmsg); if (c == nil) fprint(2, "failed to connect: %s\n", errmsg); } while (ap = Brdline(&bin, '\n')) { ap[Blinelen(&bin) - 1] = 0; switch (ac = parse(ap, av, nelem(av))) { default: for (cp = cmd; cp->name; cp++) { if (strcmp(cp->name, av[0]) == 0) break; } if (cp->name == 0) { Bprint(&bout, "eh?\n"); break; } if (c == 0 && cp->connected) { Bprint(&bout, "not currently connected\n"); break; } if ((status = (*cp->f)(c, ac - 1, &av[1])) != -1) { if(verbose) Bprint(&bout, "ok %ld/%ld\n", status >> 16, status & 0xffff); break; } break; case -1: Bprint(&bout, "eh?\n"); break; case 0: break; } Bflush(&bout); } threadexits(0); }
/* * Get font names from load file so we don't load fonts we won't use */ void rowloadfonts(char *file) { int i; Biobuf *b; char *l; b = Bopen(file, OREAD); if(b == nil) return; /* current directory */ l = Brdline(b, '\n'); if(l == nil) goto Return; /* global fonts */ for(i=0; i<2; i++){ l = Brdline(b, '\n'); if(l == nil) goto Return; l[Blinelen(b)-1] = 0; if(*l && strcmp(l, fontnames[i])!=0){ free(fontnames[i]); fontnames[i] = estrdup(l); } } Return: Bterm(b); }
int awk(Biobuf *b, char **field, int n) { char *line; int i; while(line = Brdline(b, '\n')){ line[Blinelen(b)-1] = 0; while(*line == ' ' || *line == '\t') *line++ = 0; for(i = 0; i < n; i++){ if(*line == 0 || *line == '#') break; field[i] = line; while(*line && *line != ' ' && *line != '\t') line++; while(*line == ' ' || *line == '\t') *line++ = 0; } if(i) return i; } return 0; }
void readroutes(void) { int n; char *p; Biobuf *b; char *f[6]; Route route; b = Bopen(routefile, OREAD); if(b == 0) return; while(p = Brdline(b, '\n')){ p[Blinelen(b)-1] = 0; n = getfields(p, f, 6, 1, " \t"); if(n < 5) continue; v4parseip(route.dest, f[0]); v4parseipmask(route.mask, f[1]); v4parseip(route.gate, f[2]); route.metric = Infinity; if(equivip(route.dest, ralloc.def.dest) && equivip(route.mask, ralloc.def.mask)) memmove(ralloc.def.gate, route.gate, Pasize); else if(!equivip(route.dest, route.gate) && strchr(f[3], 'i') == 0) considerroute(&route); } Bterm(b); }
int main(void) { Rune r; char *s; int n = 0; Biobuf *i = Bfdopen(0,O_RDONLY); print("enum codepoints {"); while((r=Bgetrune(i))>0 && r != '\n') { s = Brdline(i,'\n'); if(!Blinelen(i)) break; s[Blinelen(i)-1] = '\0'; *s = 'U'; print("%s\n\t%-8s = 0x%X",n?",":"", s,r); n = 1; } print("\n};\n"); Bterm(i); return 0; }
int conslock(void) { char *ln; char nkey1[DESKEYLEN]; static char zeroes[DESKEYLEN]; if(memcmp(nvr.machkey, zeroes, DESKEYLEN) == 0) { print("no password set\n"); return 0; } for(;;) { print("%s password:"******"Bad password\n"); delay(1000); } return 1; }
Devsize inqsize(char *file) { int nf; char *ln, *end, *data = malloc(strlen(file) + 5 + 1); char *fields[4]; Devsize rv = -1; Biobuf *bp; strcpy(data, file); end = strstr(data, "/data"); if (end == nil) strcat(data, "/ctl"); else strcpy(end, "/ctl"); bp = Bopen(data, OREAD); if (bp) { while (rv < 0 && (ln = Brdline(bp, '\n')) != nil) { ln[Blinelen(bp)-1] = '\0'; nf = tokenize(ln, fields, nelem(fields)); if (nf == 3 && strcmp(fields[0], "geometry") == 0) rv = atoi(fields[2]); } Bterm(bp); } free(data); return rv; }
static int okfile(char *cp, Biobuf *fp) { char *buf; int len; char *bp, *ep; int c; len = strlen(cp); Bseek(fp, 0, 0); /* one iteration per system name in the file */ while(buf = Brdline(fp, '\n')) { ep = &buf[Blinelen(fp)]; for(bp=buf; bp < ep;){ while(isspace(*bp) || *bp==',') bp++; if(strncmp(bp, cp, len) == 0) { c = *(bp+len); if(isspace(c) || c==',') return 1; } while(bp < ep && (!isspace(*bp)) && *bp!=',') bp++; } } /* didn't find it, prohibit forwarding */ return 0; }
void contentinit(void) { static Biobuf *b = nil; static Qid qid; char *file, *s; Suffix *this; file = "/sys/lib/mimetype"; if(b == nil){ /* first time */ b = Bopen(file, OREAD); if(b == nil) sysfatal("can't read from %s", file); } if(updateQid(Bfildes(b), &qid) == 0) return; Bseek(b, 0, 0); while(suffixes!=nil){ this = suffixes; suffixes = suffixes->next; free(this->suffix); free(this->generic); free(this->specific); free(this->encoding); free(this); } while((s = Brdline(b, '\n')) != nil){ s[Blinelen(b) - 1] = 0; suffixes = parsesuffix(s, suffixes); } }
void rdbio(char *file, char *user, Acctbio *a) { int i,n; Biobuf *b; char *p; char *field[20]; memset(a, 0, sizeof(Acctbio)); b = Bopen(file, OREAD); if(b != 0){ while(p = Brdline(b, '\n')){ p[Blinelen(b)-1] = 0; n = getfields(p, field, nelem(field), 0, "|"); if(n < 4) continue; if(strcmp(field[0], user) != 0) continue; clrbio(a); a->postid = strdup(field[1]); a->name = strdup(field[2]); a->dept = strdup(field[3]); if(n-4 >= Nemail) n = Nemail-4; for(i = 4; i < n; i++) a->email[i-4] = strdup(field[i]); } Bterm(b); } a->user = strdup(user); }
static void buildmap(Biobuf *fp) /* map goes from char name to value to print via *string() */ { uchar *p, *line, ch[100]; int val; Rune r; curmap++; if(curmap >= NMAP) { fprint(2, "proof: out of char maps; recompile\n"); exits("charmap"); } while ((line = Brdline(fp, '\n'))!= 0) { if (line[0] == '\n') return; line[Blinelen(fp)-1] = 0; scanstr((char *) line, (char *) ch, (char **) &p); if (ch[0] == '\0') { fprint(2, "bad map file line '%s'\n", (char*)line); continue; } val = strtol((char *) p, 0, 10); dprint(2, "buildmap %s (%x %x) %s %d\n", (char*)ch, ch[0], ch[1], (char*)p, val); chartorune(&r, (char*)ch); if(utflen((char*)ch)==1 && r<QUICK) charmap[curmap].quick[r] = val; else addmap(curmap, strdup((char *) ch), val); /* put somewhere else */ } }
/* * see if user is in the group noworld, i.e., has all file * priviledges masked with 770, and all directories with * 771, before checking access rights */ int noworld(char *user) { Biobuf *b; char *p; int n; b = Bopen("/adm/users", OREAD); if(b == nil) return 0; while((p = Brdline(b, '\n')) != nil){ p[Blinelen(b)-1] = 0; p = strchr(p, ':'); if(p == nil) continue; if(strncmp(p, ":noworld:", 9) == 0){ p += 9; break; } } n = strlen(user); while(p != nil && *p != 0){ p = strstr(p, user); if(p == nil) break; if(*(p-1) == ':' || *(p-1) == ',') if(*(p+n) == ':' || *(p+n) == ',' || *(p+n) == 0){ Bterm(b); return 1; } p++; } Bterm(b); return 0; }
/* * look for the next file in an archive. * adapted from libmach. */ static vlong nextar(Biobuf *bp, vlong off, struct ar_hdr *a) { int r; int32 arsize; char *buf; if (off&01) off++; Bseek(bp, off, 0); buf = Brdline(bp, '\n'); r = Blinelen(bp); if(buf == nil) { if(r == 0) return 0; return -1; } if(r != SAR_HDR) return -1; memmove(a, buf, SAR_HDR); if(strncmp(a->fmag, ARFMAG, sizeof a->fmag)) return -1; arsize = strtol(a->size, 0, 0); if (arsize&1) arsize++; return arsize + r; }
void msgheadline(Biobuf *bin, int n, Biobuf *bout) { char *p, *q; char *date; char *from; char *subject; date = nil; from = nil; subject = nil; while(p = Brdline(bin, '\n')){ p[Blinelen(bin)-1] = '\0'; if((q = strchr(p, ':')) == nil) continue; *q++ = '\0'; if(cistrcmp(p, "from")==0) from = fixfrom(skipwhite(q)); else if(cistrcmp(p, "subject")==0) subject = estrdup(skipwhite(q)); else if(cistrcmp(p, "date")==0) date = fixdate(skipwhite(q)); } Bprint(bout, "%d/\t%s", n, from ? from : ""); if(date) Bprint(bout, "\t%s", date); if(subject) Bprint(bout, "\n\t%s", subject); Bprint(bout, "\n"); free(date); free(from); free(subject); }
void exclusions(void) { Biobuf *f; int ni, nmaxi, ne, nmaxe; char *line; if(patternfile == nil) return; f = Bopen(patternfile, OREAD); if(f == nil) fatal("cannot open patternfile"); ni = 0; nmaxi = 100; include = malloc(nmaxi*sizeof(*include)); if(include == nil) fatal("out of memory"); include[0] = nil; ne = 0; nmaxe = 100; exclude = malloc(nmaxe*sizeof(*exclude)); if(exclude == nil) fatal("out of memory"); exclude[0] = nil; while(line = Brdline(f, '\n')){ line[Blinelen(f) - 1] = 0; if(strlen(line) < 2 || line[1] != ' ') continue; switch(line[0]){ case '+': if(ni+1 >= nmaxi){ nmaxi = 2*nmaxi; include = realloc(include, nmaxi*sizeof(*include)); if(include == nil) fatal("out of memory"); } DEBUG(DFD, "\tinclude %s\n", line+2); include[ni] = regcomp(line+2); include[++ni] = nil; break; case '-': if(ne+1 >= nmaxe){ nmaxe = 2*nmaxe; exclude = realloc(exclude, nmaxe*sizeof(*exclude)); if(exclude == nil) fatal("out of memory"); } DEBUG(DFD, "\texclude %s\n", line+2); exclude[ne] = regcomp(line+2); exclude[++ne] = nil; break; default: DEBUG(DFD, "ignoring pattern %s\n", line); break; } } Bterm(f); }
void waitgs(GSInfo *gs) { /* we figure out that gs is done by telling it to * print something and waiting until it does. */ char *p; Biobuf *b = &gs->gsrd; uchar buf[1024]; int n; // gscmd(gs, "(\\n**bstack\\n) print flush\n"); // gscmd(gs, "stack flush\n"); // gscmd(gs, "(**estack\\n) print flush\n"); gscmd(gs, "(\\n//GO.SYSIN DD\\n) PAGE==\n"); alarm(300*1000); for(;;) { p = Brdline(b, '\n'); if(p == nil) { n = Bbuffered(b); if(n <= 0) break; if(n > sizeof buf) n = sizeof buf; Bread(b, buf, n); continue; } p[Blinelen(b)-1] = 0; if(chatty) fprint(2, "p: "); if(chatty) write(2, p, Blinelen(b)-1); if(chatty) fprint(2, "\n"); if(strstr(p, "Error:")) { alarm(0); fprint(2, "ghostscript error: %s\n", p); wexits("gs error"); } if(strstr(p, "//GO.SYSIN DD")) { break; } } alarm(0); }
void main(int argc, char *argv[]) { int n; Biobuf in; char *p; char *f[4]; strcpy(mntpt, "/net"); cfg.inside = 1; ARGBEGIN{ case 'f': dbfile = EARGF(usage()); break; case 'r': cfg.resolver = 1; break; case 'x': dbfile = "/lib/ndb/external"; strcpy(mntpt, "/net.alt"); break; default: usage(); }ARGEND now = time(nil); nowns = nsec(); dninit(); fmtinstall('R', prettyrrfmt); if(myipaddr(ipaddr, mntpt) < 0) sysfatal("can't read my ip address"); opendatabase(); if(cfg.resolver) squirrelserveraddrs(); debug = 1; if(argc > 0){ docmd(argc, argv); exits(0); } Binit(&in, 0, OREAD); for(print("> "); p = Brdline(&in, '\n'); print("> ")){ p[Blinelen(&in)-1] = 0; n = tokenize(p, f, 3); if(n>=1) { dnpurge(); /* flush the cache */ docmd(n, f); } } exits(0); }
/* * login to remote system */ void rlogin(char *rsys, char *keyspec) { char *line; char pass[128]; UserPasswd *up; up = nil; for(;;){ if(up == nil && os != Plan9) up = auth_getuserpasswd(auth_getkey, "proto=pass server=%s service=ftp %s", rsys, keyspec); if(up != nil){ sendrequest("USER", up->user); } else { print("User[default = %s]: ", user); line = Brdline(&stdin, '\n'); if(line == 0) exits(0); line[Blinelen(&stdin)-1] = 0; if(*line){ free(user); user = strdup(line); } sendrequest("USER", user); } switch(getreply(&ctlin, msg, sizeof(msg), 1)){ case Success: goto out; case Incomplete: break; case TempFail: case PermFail: continue; } if(up != nil){ sendrequest("PASS", up->passwd); } else { if(getpassword(pass, pass+sizeof(pass)) < 0) exits(0); sendrequest("PASS", pass); } if(getreply(&ctlin, msg, sizeof(msg), 1) == Success){ if(strstr(msg, "Sess#")) defos = MVS; break; } } out: if(up != nil){ memset(up, 0, sizeof(*up)); free(up); } }
void main(int argc, char **argv) { Biobuf in; int fd; char *p, *t; char buf[8192]; argv0 = argv[0]; if(argc < 3){ fprint(2, "usage: %s console logfile \n", argv0); exits("usage"); } fd = open(argv[1], OREAD); if(fd < 0){ fprint(2, "%s: can't open %s: %r\n", argv0, argv[1]); exits("open"); } Binit(&in, fd, OREAD); fd = openlog(argv[2]); for(;;){ if(p = Brdline(&in, '\n')){ p[Blinelen(&in)-1] = 0; t = ctime(time(0)); t[19] = 0; if(fprint(fd, "%s: %s\n", t, p) < 0){ close(fd); fd = openlog(argv[2]); fprint(fd, "%s: %s\n", t, p); } } else if(Blinelen(&in) == 0) // true eof break; else { Bread(&in, buf, sizeof buf); } } exits(0); }
char* findfrom(void) { char *p, *u; Biobuf *b; u = getuser(); if(u==nil) return "glenda"; p = estrstrstrdup("/usr/", u, "/lib/newsfrom"); b = Bopen(p, OREAD); free(p); if(b){ p = Brdline(b, '\n'); if(p){ p[Blinelen(b)-1] = '\0'; p = estrdup(p); Bterm(b); return p; } Bterm(b); } p = estrstrstrdup("/mail/box/", u, "/headers"); b = Bopen(p, OREAD); free(p); if(b){ while(p = Brdline(b, '\n')){ p[Blinelen(b)-1] = '\0'; if(cistrncmp(p, "from:", 5)==0){ p = estrdup(skip(p, "from:")); Bterm(b); return p; } } Bterm(b); } return u; }
/* * Translate Unicode to HTML by asking tcs(1). * This way we don't have yet another table. */ Rune* rune2html(Rune r) { static Biobuf b; static int fd = -1; static Rune **tcscache[256]; int p[2]; char *q; if(r == '\n') return L("\n"); if(((uint)r&~0xFFFF) != 0){ /* The cache must grow a lot to handle them */ fprint(2, "%s: can't handle rune '%C'\n", argv0, r); return L("?"); } if(tcscache[r>>8] && tcscache[r>>8][r&0xFF]) return tcscache[r>>8][r&0xFF]; if(fd < 0){ if(pipe(p) < 0) sysfatal("pipe: %r"); switch(fork()){ case -1: sysfatal("fork: %r"); case 0: dup2(p[0], 0); dup2(p[1], 1); close(p[0]); close(p[1]); execl(BINDIR "/tcs", "tcs", "-t", "html", nil); _exits(0); default: fd = p[1]; Binit(&b, p[0], OREAD); break; } } /* HACK: extra newlines force rune+\n through tcs now */ fprint(fd, "%C\n\n\n\n", r); q = Brdline(&(b.Biobufhdr), '\n'); while (q != nil && *q == '\n') q = Brdline(&(b.Biobufhdr), '\n'); if(q == nil) sysfatal("tcs: early eof"); q[Blinelen(&(b.Biobufhdr))-1] = 0; if(tcscache[r>>8] == nil) tcscache[r>>8] = emalloc(256*sizeof tcscache[0][0]); tcscache[r>>8][r&0xFF] = erunesmprint("%s", q); return tcscache[r>>8][r&0xFF]; }
void threadmain(int argc, char *argv[]) { int n; Biobuf in; char *p; char *f[4]; strcpy(mntpt, "/net"); ARGBEGIN{ case 'r': resolver = 1; break; case 'f': dbfile = EARGF(usage()); break; default: usage(); }ARGEND now = time(0); dninit(); fmtinstall('R', prettyrrfmt); if(myipaddr(ipaddr, mntpt) < 0) sysfatal("can't read my ip address"); opendatabase(); if(resolver) squirrelserveraddrs(); debug = 1; if(argc > 0){ docmd(argc, argv); threadexitsall(0); } Binit(&in, 0, OREAD); for(print("> "); p = Brdline(&in, '\n'); print("> ")){ p[Blinelen(&in)-1] = 0; n = tokenize(p, f, 3); if(n<1) continue; /* flush the cache */ dnpurge(); docmd(n, f); } threadexitsall(0); }
int okay(char *quest) { char *ln; print("okay to %s? ", quest); if ((ln = Brdline(&bin, '\n')) == nil) return 0; ln[Blinelen(&bin)-1] = '\0'; if (isascii(*ln) && isupper(*ln)) *ln = tolower(*ln); return *ln == 'y'; }
static int rdsenders(void) { int lnlen, nf, ok = 1; char *line, *senderfile; char *toks[Ntoks]; Biobuf *sf; Sender *snd; static int beenhere = 0; if (beenhere) return 1; beenhere = 1; /* * we're sticking with a system-wide sender list because * per-user lists would require fully resolving recipient * addresses to determine which users they correspond to * (barring exploiting syntactic conventions). */ senderfile = smprint("%s/senders", UPASLIB); sf = Bopen(senderfile, OREAD); free(senderfile); if (sf == nil) return 1; while ((line = Brdline(sf, '\n')) != nil) { if (line[0] == '#' || line[0] == '\n') continue; lnlen = Blinelen(sf); line[lnlen-1] = '\0'; /* clobber newline */ nf = tokenize(line, toks, nelem(toks)); if (nf != nelem(toks)) continue; /* malformed line */ snd = malloc(sizeof *snd); if (snd == nil) sysfatal("out of memory: %r"); memset(snd, 0, sizeof *snd); snd->next = nil; if (sendlast == nil) sendlist = snd; else sendlast->next = snd; sendlast = snd; snd->rcpt = strdup(toks[Rcpt]); snd->domain = strdup(toks[Domain]); } Bterm(sf); return ok; }
Proc* readsnap(Biobuf *b) { char *q; char buf[12]; int32_t pid; Proc *p, *plist; int i, n; if((q = Brdline(b, '\n')) == nil) panic("error reading snapshot file"); if(strncmp(q, "process snapshot", strlen("process snapshot")) != 0) panic("bad snapshot file format"); plist = nil; while(q = Brdline(b, '\n')) { q[Blinelen(b)-1] = 0; pid = atol(q); q += 12; p = findpid(plist, pid); if(p == nil) { p = emalloc(sizeof(*p)); p->link = plist; p->pid = pid; plist = p; } for(i=0; i<Npfile; i++) { if(strcmp(pfile[i], q) == 0) { p->d[i] = readdata(b); break; } } if(i != Npfile) continue; if(strcmp(q, "mem") == 0) { if(Bread(b, buf, 12) != 12) panic("can't read memory section"); n = atoi(buf); p->nseg = n; p->seg = emalloc(n*sizeof(*p->seg)); for(i=0; i<n; i++) readseg(&p->seg[i], b, plist); } else if(strcmp(q, "text") == 0) readseg(&p->text, b, plist); else panic("unknown section"); } return plist; }
/* * parse user's cron file * other lines: minute hour monthday month weekday host command */ Job * readjobs(char *file, User *user) { Biobuf *b; Job *j, *jobs; Dir *d; int line; d = dirstat(file); if(!d) return nil; b = Bopen(file, OREAD); if(!b){ free(d); return nil; } jobs = nil; user->lastqid = d->qid; free(d); for(line = 1; savec = Brdline(b, '\n'); line++){ savec[Blinelen(b) - 1] = '\0'; while(*savec == ' ' || *savec == '\t') savec++; if(*savec == '#' || *savec == '\0') continue; if(strlen(savec) > 1024){ clog("%s: line %d: line too long", user->name, line); continue; } j = emalloc(sizeof *j); j->time.min = gettime(0, 59); if(j->time.min && (j->time.hour = gettime(0, 23)) && (j->time.mday = gettime(1, 31)) && (j->time.mon = gettime(1, 12)) && (j->time.wday = gettime(0, 6)) && getname(&j->host)){ j->cmd = emalloc(strlen(savec) + 1); strcpy(j->cmd, savec); j->next = jobs; jobs = j; }else{ clog("%s: line %d: syntax error", user->name, line); free(j); } } Bterm(b); return jobs; }