extern int winsetaddr(Window*, char*, int);
extern void windormant(Window*);
extern void winsetdump(Window*, char*, char*);
+extern void winsetdir(Window*, char*, char*);
extern void ctlprint(int, char*, ...);
extern void* emalloc(uint);
#pragma varargck argpos error 1
#pragma varargck argpos ctlprint 2
+extern char *wname;
+extern char *wdir;
extern Window *win;
extern Channel *fschan, *writechan;
Channel *fschan;
Channel *writechan;
-static File *devcons, *devnew;
+static File *devcons, *devnew, *devwdir;
static void
fsread(Req *r)
return;
}
- assert(r->fid->file == devcons);
+ if(r->fid->file == devwdir){
+ readstr(r, wdir);
+ respond(r, nil);
+ return;
+ }
+
e.type = 'r';
e.r = r;
send(fschan, &e);
return;
}
+ if(r->fid->file == devwdir){
+ s = emalloc(r->ifcall.count+1);
+ memmove(s, r->ifcall.data, r->ifcall.count);
+ s[r->ifcall.count] = 0;
+ if(s[0] == '#' || s[0] == '/'){
+ free(wdir);
+ wdir = s;
+ } else {
+ wdir = eappend(wdir, "/", s);
+ free(s);
+ }
+ cleanname(wdir);
+ winsetdir(win, wdir, wname);
+ respond(r, nil);
+ return;
+ }
+
if(r->fid->file != devcons){
respond(r, "bug in fswrite");
return;
devnew = createfile(fs.tree->root, "wnew", "win", 0666, nil);
if(devnew == nil)
sysfatal("creating /dev/wnew: %r");
+ devwdir = createfile(fs.tree->root, "wdir", "win", 0666, nil);
+ if(devwdir == nil)
+ sysfatal("creating /dev/wdir: %r");
threadpostmountsrv(&fs, nil, "/dev", MBEFORE);
}
int eraseinput;
int dirty = 0;
+char *wname;
+char *wdir;
Window *win; /* the main window */
void
threadmain(int argc, char *argv[])
{
int i, j;
- char *dir, *tag, *name;
char buf[1024], **av;
quotefmtinstall();
av = emalloc(3*sizeof(char*));
av[0] = "rc";
av[1] = "-i";
- name = getenv("sysname");
}else{
av = argv;
- name = utfrrune(av[0], '/');
- if(name)
- name++;
- else
- name = av[0];
}
-
+ wname = utfrrune(av[0], '/');
+ if(wname)
+ wname++;
+ else
+ wname = av[0];
if(getwd(buf, sizeof buf) == 0)
- dir = "/";
+ wdir = "/";
else
- dir = buf;
- dir = estrdup(dir);
- tag = estrdup(dir);
- tag = eappend(estrdup(tag), "/-", name);
+ wdir = buf;
+ wdir = estrdup(wdir);
win = newwindow();
snprint(buf, sizeof buf, "%d", win->id);
putenv("winid", buf);
- winname(win, tag);
+ winsetdir(win, wdir, wname);
wintagwrite(win, "Send Noscroll", 5+8);
threadcreate(mainctl, win, STACK);
mountcons();
}
ctlprint(win->ctl, "scroll");
- winsetdump(win, dir, buf);
+ winsetdump(win, wdir, buf);
}
int
ctlprint(w->ctl, "dump %s\n", cmd);
}
+void
+winsetdir(Window *w, char *dir, char *name)
+{
+ ctlprint(w->ctl, "dumpdir %s\n", dir);
+ if(strcmp(dir, "/")==0)
+ dir++;
+ ctlprint(w->ctl, "name %s/-%s\n", dir, name);
+}
+
void
wineventproc(void *v)
{
+++ /dev/null
-#include <u.h>
-#include <libc.h>
-
-/*
- * like fprint but be sure to deliver as a single write.
- * (fprint uses a small write buffer.)
- */
-void
-xfprint(int fd, char *fmt, ...)
-{
- char *s;
- va_list arg;
-
- va_start(arg, fmt);
- s = vsmprint(fmt, arg);
- va_end(arg);
- if(s == nil)
- sysfatal("smprint: %r");
- write(fd, s, strlen(s));
- free(s);
-}
-
-void
-main(int argc, char **argv)
-{
- int fd;
- char dir[512];
-
- fd = open("/dev/acme/ctl", OWRITE);
- if(fd < 0)
- exits(0);
- getwd(dir, 512);
- if(dir[0]!=0 && dir[strlen(dir)-1]=='/')
- dir[strlen(dir)-1] = 0;
- xfprint(fd, "name %s/-%s\n", dir, argc > 1 ? argv[1] : "rc");
- xfprint(fd, "dumpdir %s\n", dir);
- exits(0);
-}