int main(int argc, char *argv[]) { struct filesystem *f; char path[1024]; char *image = getsetting("imagefile"); if (!image) { printf("Have you run ulogin?\n"); return 10; } char *cwd = getsetting("cwd"); if (argc == 2) { if (argv[1][0] == '/') { sprintf(path, "%s", argv[1]); } else { sprintf(path, "%s/%s", cwd, argv[1]); } } else { sprintf(path, "%s", cwd); } free(cwd); f = fsopen(image); if (!f) { printf("Unable to open %s\n", image); } else { if (!uls(f, path)) { printf("%s not found\n", path); } } fsclose(f); free(image); return 0; }
void threadmain(int argc, char *argv[]) { char *dev; char *args[Nels]; int i, j, nargs; dev = "disk"; ARGBEGIN{ case 'v': verb++; break; case 'f': dev = EARGF(usage()); break; default: if(ARGC() >= 'A' && ARGC() <= 'Z'){ dbg['d'] = 1; dbg[ARGC()] = 1; }else usage(); }ARGEND; if(argc == 0) usage(); fatalaborts = 1; fmtinstall('H', mbfmt); fmtinstall('M', dirmodefmt); errinit(Errstack); if(catcherror()){ fprint(2, "cmd failed: %r\n"); threadexitsall("failed"); } fsopen(dev); for(i = 0; i < argc; i++){ if(verb>1) fsdump(0, Mem); print("%% %s\n", argv[i]); nargs = gettokens(argv[i], args, Nels, "!"); for(j = 0; j < nelem(cmds); j++){ if(strcmp(cmds[j].name, argv[i]) != 0) continue; if(cmds[j].nargs != 0 && cmds[j].nargs != nargs) fprint(2, "usage: %s\n", cmds[j].usage); else cmds[j].f(nargs, args); break; } if(j == nelem(cmds)){ fprint(2, "no such command\n"); for(j = 0; j < nelem(cmds); j++) fprint(2, "\t%s\n", cmds[j].usage); break; } } if(verb>1) fsdump(0, Mem); noerror(); threadexitsall(nil); }
CFid* xopen(char *name, int mode) { CFid *fid; CFsys *fs; fs = xparse(name, &name); fid = fsopen(fs, name, mode); if(fid == nil) sysfatal("fsopen %s: %r", name); return fid; }
//------------------------------------------------------------------------- static void thread_state_snapshot(uint8_t index, uint8_t * filename) { MYFILE *fp; uint8_t threadsize; uint16_t threadramsize; uint8_t *internal_ram_start; threadsize = sizeof(struct thread); threadramsize = (uint16_t) ((uint8_t *) thread_table[index].ramend - (uint8_t *) thread_table[index].ramstart + 1); internal_ram_start = (uint8_t *) thread_table[index].ramstart; fp = fsopen((char *)filename, "w"); fwrite2(fp, &thread_table[index], threadsize); fseek2(fp, threadsize, 1); fwrite2(fp, internal_ram_start, threadramsize); fclose2(fp); }
int main(int argc, char *argv[]) { struct filesystem *f; int i; int mode; char temp[1024]; char *cwd; char *fsname = getsetting("imagefile");; if (!fsname) { printf("Have you run ulogin?\n"); return 10; } if (argc < 3) { printf("Usage: %s <uid> <file> ...\n", argv[0]); return 10; } sscanf(argv[1], "%o", &mode); f = fsopen(fsname); if (!f) { printf("Unable to open %s\n", fsname); return 10; } cwd = getsetting("cwd"); for (i = 2; i < argc; i++) { if (argv[i][0] == '/') { uchown(f, argv[i], mode); } else { if (!cwd) { sprintf(temp, "/%s", argv[i]); } else { sprintf(temp, "%s/%s", cwd, argv[i]); } compresspath(temp); uchown(f, temp, mode); } } fsclose(f); if (cwd) free(cwd); free(fsname); return 0; }
void loadmboxfaces(char *maildir) { CFid *dirfd; Dir *d; int i, n; dirfd = fsopen(mailfs, maildir, OREAD); if(dirfd != nil){ while((n = fsdirread(dirfd, &d)) > 0){ for(i=0; i<n; i++) addface(dirface(maildir, d[i].name)); free(d); } fsclose(dirfd); }else sysfatal("open %s: %r", maildir); }
Face* dirface(char *dir, char *num) { Face *f; char buf[1024], *info, *p, *t, *s; int n; ulong len; CFid *fid; sprint(buf, "%s/%s/info", dir, num); len = fsdirlen(mailfs, buf); if(len <= 0) return nil; fid = fsopen(mailfs, buf, OREAD); if(fid == nil) return nil; info = emalloc(len+1); n = fsreadn(fid, info, len); fsclose(fid); if(n < 0){ free(info); return nil; } info[n] = '\0'; f = emalloc(sizeof(Face)); for(p=info; (s=iline(p, &p)) != nil; ){ t = strchr(s, ' '); if(t == nil) continue; *t++ = 0; if(strcmp(s, "unixdate") == 0){ f->time = atoi(t); f->tm = *localtime(f->time); } else if(strcmp(s, "from") == 0) setname(f, t); else if(strcmp(s, "digest") == 0) f->str[Sdigest] = estrdup(t); } sprint(buf, "%s/%s", dir, num); f->str[Sshow] = estrdup(buf); free(info); return f; }
void threadmain(int argc, char *argv[]) { char *s, *name; char err[ERRMAX], *cmd; int i, newdir; Fmt fmt; doquote = needsrcquote; quotefmtinstall(); /* open these early so we won't miss notification of new mail messages while we read mbox */ if((plumbsendfd = plumbopenfid("send", OWRITE|OCEXEC)) == nil) fprint(2, "warning: open plumb/send: %r\n"); if((plumbseemailfd = plumbopenfid("seemail", OREAD|OCEXEC)) == nil) fprint(2, "warning: open plumb/seemail: %r\n"); if((plumbshowmailfd = plumbopenfid("showmail", OREAD|OCEXEC)) == nil) fprint(2, "warning: open plumb/showmail: %r\n"); shortmenu = 0; srvname = "mail"; ARGBEGIN{ case 's': shortmenu = 1; break; case 'S': shortmenu = 2; break; case 'o': outgoing = EARGF(usage()); break; case 'm': smprint(maildir, "%s/", EARGF(usage())); break; case 'n': srvname = EARGF(usage()); break; default: usage(); }ARGEND acmefs = nsmount("acme",nil); if(acmefs == nil) error("cannot mount acme: %r"); mailfs = nsmount(srvname, nil); if(mailfs == nil) error("cannot mount %s: %r", srvname); name = "mbox"; newdir = 1; if(argc > 0){ i = strlen(argv[0]); if(argc>2 || i==0) usage(); /* see if the name is that of an existing /mail/fs directory */ if(argc==1 && argv[0][0] != '/' && ismaildir(argv[0])){ name = argv[0]; mboxname = estrdup(name); newdir = 0; }else{ if(argv[0][i-1] == '/') argv[0][i-1] = '\0'; s = strrchr(argv[0], '/'); if(s == nil) mboxname = estrdup(argv[0]); else{ *s++ = '\0'; if(*s == '\0') usage(); mailboxdir = argv[0]; mboxname = estrdup(s); } if(argc > 1) name = argv[1]; else name = mboxname; } } user = getenv("user"); if(user == nil) user = "******"; home = getenv("home"); if(home == nil) home = getenv("HOME"); if(home == nil) error("can't find $home"); if(mailboxdir == nil) mailboxdir = estrstrdup(home, "/mail"); if(outgoing == nil) outgoing = estrstrdup(mailboxdir, "/outgoing"); mbox.ctlfd = fsopen(mailfs, estrstrdup(mboxname, "/ctl"), OWRITE); if(mbox.ctlfd == nil) error("can't open %s: %r", estrstrdup(mboxname, "/ctl")); fsname = estrdup(name); if(newdir && argc > 0){ s = emalloc(5+strlen(mailboxdir)+strlen(mboxname)+strlen(name)+10+1); for(i=0; i<10; i++){ sprint(s, "open %s/%s %s", mailboxdir, mboxname, fsname); if(fswrite(mbox.ctlfd, s, strlen(s)) >= 0) break; err[0] = '\0'; errstr(err, sizeof err); if(strstr(err, "mbox name in use") == nil) error("can't create directory %s for mail: %s", name, err); free(fsname); fsname = emalloc(strlen(name)+10); sprint(fsname, "%s-%d", name, i); } if(i == 10) error("can't open %s/%s: %r", mailboxdir, mboxname); free(s); } s = estrstrdup(fsname, "/"); mbox.name = estrstrdup(maildir, s); mbox.level= 0; readmbox(&mbox, maildir, s); home = getenv("home"); if(home == nil) home = "/"; wbox = newwindow(); winname(wbox, mbox.name); wintagwrite(wbox, "Put Mail Delmesg ", 3+1+4+1+7+1); threadcreate(mainctl, wbox, STACK); fmtstrinit(&fmt); fmtprint(&fmt, "Mail"); if(shortmenu) fmtprint(&fmt, " -%c", "sS"[shortmenu-1]); if(outgoing) fmtprint(&fmt, " -o %s", outgoing); fmtprint(&fmt, " %s", name); cmd = fmtstrflush(&fmt); if(cmd == nil) sysfatal("out of memory"); winsetdump(wbox, "/acme/mail", cmd); mbox.w = wbox; mesgmenu(wbox, &mbox); winclean(wbox); /* wctlfd = open("/dev/wctl", OWRITE|OCEXEC); /* for acme window */ wctlfd = -1; cplumb = chancreate(sizeof(Plumbmsg*), 0); cplumbshow = chancreate(sizeof(Plumbmsg*), 0); if(strcmp(name, "mbox") == 0){ /* * Avoid creating multiple windows to send mail by only accepting * sendmail plumb messages if we're reading the main mailbox. */ plumbsendmailfd = plumbopenfid("sendmail", OREAD|OCEXEC); cplumbsend = chancreate(sizeof(Plumbmsg*), 0); proccreate(plumbsendproc, nil, STACK); threadcreate(plumbsendthread, nil, STACK); } /* start plumb reader as separate proc ... */ proccreate(plumbproc, nil, STACK); proccreate(plumbshowproc, nil, STACK); threadcreate(plumbshowthread, nil, STACK); fswrite(mbox.ctlfd, "refresh", 7); /* ... and use this thread to read the messages */ plumbthread(); }
int mboxcommand(Window *w, char *s) { char *args[10], **targs, *save; Window *sbox; Message *m, *next; int ok, nargs, i, j; CFid *searchfd; char buf[128], *res; nargs = tokenize(s, args, nelem(args)); if(nargs == 0) return 0; if(strcmp(args[0], "Mail") == 0){ if(nargs == 1) mkreply(nil, "Mail", "", nil, nil); else mkreply(nil, "Mail", args[1], nil, nil); return 1; } if(strcmp(s, "Del") == 0){ if(mbox.dirty){ mbox.dirty = 0; fprint(2, "mail: mailbox not written\n"); return 1; } if(w != mbox.w){ windel(w, 1); return 1; } ok = 1; for(m=mbox.head; m!=nil; m=next){ next = m->next; if(m->w){ if(windel(m->w, 0)) m->w = nil; else ok = 0; } } for(m=replies.head; m!=nil; m=next){ next = m->next; if(m->w){ if(windel(m->w, 0)) m->w = nil; else ok = 0; } } if(ok){ windel(w, 1); removeupasfs(); threadexitsall(nil); } return 1; } if(strcmp(s, "Put") == 0){ rewritembox(wbox, &mbox); return 1; } if(strcmp(s, "Get") == 0){ fswrite(mbox.ctlfd, "refresh", 7); return 1; } if(strcmp(s, "Delmesg") == 0){ save = nil; if(nargs > 1) save = args[1]; s = winselection(w); if(s == nil) return 1; nargs = 1; for(i=0; s[i]; i++) if(s[i] == '\n') nargs++; targs = emalloc(nargs*sizeof(char*)); /* could be too many for a local array */ nargs = getfields(s, targs, nargs, 1, "\n"); for(i=0; i<nargs; i++){ if(!isdigit(targs[i][0])) continue; j = atoi(targs[i]); /* easy way to parse the number! */ if(j == 0) continue; snprint(buf, sizeof buf, "%s%d", mbox.name, j); delmesg(buf, nil, 1, save); } free(s); free(targs); return 1; } if(strcmp(s, "Search") == 0){ if(nargs <= 1) return 1; s = estrstrdup(mboxname, "/search"); searchfd = fsopen(mailfs, s, ORDWR); if(searchfd == nil) return 1; save = estrdup(args[1]); for(i=2; i<nargs; i++) save = eappend(save, " ", args[i]); fswrite(searchfd, save, strlen(save)); fsseek(searchfd, 0, 0); j = fsread(searchfd, buf, sizeof buf - 1); if(j == 0){ fprint(2, "[%s] search %s: no results found\n", mboxname, save); fsclose(searchfd); free(save); return 1; } free(save); buf[j] = '\0'; res = estrdup(buf); j = fsread(searchfd, buf, sizeof buf - 1); for(; j != 0; j = fsread(searchfd, buf, sizeof buf - 1), buf[j] = '\0') res = eappend(res, "", buf); fsclose(searchfd); sbox = newwindow(); winname(sbox, s); free(s); threadcreate(mainctl, sbox, STACK); winopenbody(sbox, OWRITE); /* show results in reverse order */ m = mbox.tail; save = nil; for(s=strrchr(res, ' '); s!=nil || save!=res; s=strrchr(res, ' ')){ if(s != nil){ save = s+1; *s = '\0'; } else save = res; save = estrstrdup(save, "/"); for(; m && strcmp(save, m->name) != 0; m=m->prev); free(save); if(m == nil) break; fsprint(sbox->body, "%s%s\n", m->name, info(m, 0, 0)); m = m->prev; } free(res); winclean(sbox); winclosebody(sbox); return 1; } return 0; }
void xls(int argc, char **argv) { char *err, *name, *xname, *f[4], buf[4096]; int i, j, l, sort; int lflag, dflag, tflag, n, len[4]; Dir *d; CFid *fid; CFsys *fs; err = nil; sort = 1; lflag = dflag = tflag = 0; ARGBEGIN{ case 'n': sort = 0; break; case 'l': lflag = 1; break; case 'd': dflag = 1; break; case 't': tflag = 1; break; }ARGEND fmtinstall('D', dirfmt); fmtinstall('M', dirmodefmt); quotefmtinstall(); fmtinstall('T', timefmt); if(argc == 0){ argv = dot; argc = 1; } for(i=0; i<argc; i++){ name = argv[i]; fs = xparse(name, &xname); if((d = fsdirstat(fs, xname)) == nil){ fprint(2, "dirstat %s: %r\n", name); fsunmount(fs); err = "errors"; continue; } if((d->mode&DMDIR) && !dflag){ if((fid = fsopen(fs, xname, OREAD)) == nil){ fprint(2, "open %s: %r\n", name); fsunmount(fs); free(d); err = "errors"; continue; } free(d); n = fsdirreadall(fid, &d); fsclose(fid); if(n < 0){ fprint(2, "dirreadall %s: %r\n", name); fsunmount(fs); err = "errors"; continue; } if(sort){ if(tflag) qsort(d, n, sizeof d[0], timecmp); else qsort(d, n, sizeof d[0], dircmp); } for(j=0; j<4; j++) len[j] = 0; for(i=0; i<n; i++){ d[i].type = 'M'; d[i].dev = 0; snprint(buf, sizeof buf, "%d %s %s %lld", d[i].dev, d[i].uid, d[i].gid, d[i].length); getfields(buf, f, 4, 0, " "); for(j=0; j<4; j++){ l = strlen(f[j]); if(l > len[j]) len[j] = l; } } for(i=0; i<n; i++){ if(!lflag){ print("%q\n", d[i].name); continue; } print("%M %C %*d %*s %*s %*lld %T %q\n", d[i].mode, d[i].type, len[0], d[i].dev, -len[1], d[i].uid, -len[2], d[i].gid, len[3], d[i].length, d[i].mtime, d[i].name); } }else{ d->type = 'M'; d->dev = 0; if(lflag) print("%M %C %d %s %s %lld %T %q\n", d->mode, d->type, d->dev, d->uid, d->gid, d->length, d->mtime, d->name); else print("%q\n", d->name); } free(d); } threadexitsall(err); }
void mkreply(Message *m, char *label, char *to, Plumbattr *attr, char *quotetext) { char buf[100]; CFid *fd; Message *r; char *dir, *t; int quotereply; Plumbattr *a; quotereply = (label[0] == 'Q'); if(quotereply && m && m->replywinid > 0){ snprint(buf, sizeof buf, "%d/body", m->replywinid); if((fd = fsopen(acmefs, buf, OWRITE)) != nil){ dir = estrstrdup(mbox.name, m->name); quote(m, fd, dir, quotetext); free(dir); return; } } r = emalloc(sizeof(Message)); r->isreply = 1; if(m != nil) r->replyname = estrdup(m->name); r->next = replies.head; r->prev = nil; if(replies.head != nil) replies.head->prev = r; replies.head = r; if(replies.tail == nil) replies.tail = r; r->name = emalloc(strlen(mbox.name)+strlen(label)+10); sprint(r->name, "%s%s%d", mbox.name, label, ++replyid); r->w = newwindow(); if(m) m->replywinid = r->w->id; winname(r->w, r->name); ctlprint(r->w->ctl, "cleartag"); wintagwrite(r->w, "fmt Look Post Undo", 4+5+5+4); r->tagposted = 1; threadcreate(mesgctl, r, STACK); winopenbody(r->w, OWRITE); if(to!=nil && to[0]!='\0') fsprint(r->w->body, "%s\n", to); for(a=attr; a; a=a->next) fsprint(r->w->body, "%s: %s\n", a->name, a->value); dir = nil; if(m != nil){ dir = estrstrdup(mbox.name, m->name); if(to == nil && attr == nil){ /* Reply goes to replyto; Reply all goes to From and To and CC */ if(strstr(label, "all") == nil) fsprint(r->w->body, "To: %s\n", m->replyto); else{ /* Replyall */ if(strlen(m->from) > 0) fsprint(r->w->body, "To: %s\n", m->from); if(strlen(m->to) > 0) fsprint(r->w->body, "To: %s\n", m->to); if(strlen(m->cc) > 0) fsprint(r->w->body, "CC: %s\n", m->cc); } } if(strlen(m->subject) > 0){ t = "Subject: Re: "; if(strlen(m->subject) >= 3) if(tolower(m->subject[0])=='r' && tolower(m->subject[1])=='e' && m->subject[2]==':') t = "Subject: "; fsprint(r->w->body, "%s%s\n", t, m->subject); } if(!quotereply){ fsprint(r->w->body, "Include: %sraw\n", dir); free(dir); } } fsprint(r->w->body, "\n"); if(m == nil) fsprint(r->w->body, "\n"); else if(quotereply){ quote(m, r->w->body, dir, quotetext); free(dir); } winclosebody(r->w); if(m==nil && (to==nil || to[0]=='\0')) winselect(r->w, "0", 0); else winselect(r->w, "$", 0); winclean(r->w); windormant(r->w); }