all repos — kuro @ 5040da40fc3dfc7f26527ba52a866e960eb5f83a

multiwindow text editor thing for plan9 with simple client VM and 9p interface

reality check from unix; simplify it!
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE-----

iHUEABYKAB0WIQR2zYvweXfSPsSU6pP1Tg1AaVJx1AUCZbSXGwAKCRD1Tg1AaVJx
1DJuAQD/U7qqVyvDcwEYFdkbaSYJHgWR89vEbMLVXtZnLq8zMQD/dQl9AGgrRybR
6IdY/wOte4qZyifYU1LQSYJNh1f0Mgc=
=pumw
-----END PGP SIGNATURE-----
commit

5040da40fc3dfc7f26527ba52a866e960eb5f83a

parent

6fa747864efcb84863d09a9a937315e748a9f040

7 files changed, 79 insertions(+), 78 deletions(-)

jump to
M .gitignore.gitignore

@@ -1,2 +1,5 @@

kuro kurosrvr +o.kuro +6.out +*.o
A 9port.mkfile

@@ -0,0 +1,22 @@

+<$PLAN9/src/mkhdr +<|sh $PLAN9/src/cmd/devdraw/mkwsysrules.sh # for X11 +TARG=kuro + +OFILES=\ + kuro.$O\ + srv.$O\ + client.$O\ + util.$O\ + node.$O\ + nodetable.$O\ + +HFILES=dat.h\ + fns.h\ + +UPDATE=\ + mkfile\ + $HFILES\ + ${OFILES:%.$O=%.c}\ + +<${PLAN9}/src/mkone +
M fns.hfns.h

@@ -1,8 +1,9 @@

int strequ(char* s1, char* s2); char* strcsw(char* s, char a, char b); char* uvlong_to_hex(uvlong input, char* buf); +int ensure(char* path); -void start_9p(char* mtpt); +void start_9p(); void kuro9p_set_mtpt(char* mtpt); void kuro9p_write(char* path, char* data, int len);

@@ -11,10 +12,10 @@

void nodetbl_add(NodeTable* self, NodeRef* node); void nodetbl_del(NodeTable* self, uvlong id); -void node_setup(Node* self, uvlong id, int fd, Handler* handlers, KuroMemory* memory); +void node_setup(Node* self, Handler* handlers, KuroMemory* memory); void node_execute(Node* self); void node_loop(void* data); -Node* create_node(uvlong id, int fd, int new, char* filename); +Node* create_node(char* filename); void supervise_node(Node* self); void node_cleanup(Node* self); void memory_cleanup(KuroMemory* self);
M kuro.ckuro.c

@@ -9,33 +9,6 @@ }

void threadmain(int argc, char **argv) { - /* we want to strip any path elements off the executable name */ - char exe_name[256] = {0}; - char* exe_base; - - uvlong node_id = 0; - int client_fd = -1; - int newwin = 0; - - char client_9p_str[256] = {0}; - - strcpy(exe_name, argv[0]); - exe_base = utfrrune(exe_name, '/'); - if (exe_base) { - exe_base++; - } else { - exe_base = exe_name; - } - - /* if we are the server, serve the filetree on 9p */ - - if (strequ(exe_base, "kurosrvr")) { - if (argc > 1) { - start_9p(argv[1]); - } else { - sysfatal("usage: kurosrvr mtpt"); - } - } else if (strequ(exe_base, "kuro")) { mtpt = getenv("KURO_MTPT"); if (mtpt == nil) { sysfatal("KURO_MTPT not set");

@@ -43,33 +16,12 @@ }

kuro9p_set_mtpt(mtpt); print("KURO_MTPT=%s\n", mtpt); - + ARGBEGIN{ - case 'n': - newwin=1; - break; - case 'i': - sscanf(ARGF(), "%d", &node_id); - break; - case 'p': - sscanf(ARGF(), "%d", &client_fd); - break; - }ARGEND - - strcpy(client_9p_str, "new"); - if (argv[0]) { - strcat(client_9p_str, " "); - strcat(client_9p_str, argv[0]); - } - if (node_id > 0 && client_fd >= 0) { - supervise_node(create_node(node_id, client_fd, newwin, argv[0])); - } else { - /* if node_id or client_id are missing, ask the server to fork us with them, and forward the filename */ - print("9pstr=%s\n", client_9p_str); - kuro9p_write("/ctl", client_9p_str, strlen(client_9p_str)); - } - } else { - sysfatal("invoke as kurosrvr to start the background service or kuro to start an application window"); - } + }ARGEND + + threadcreate(start_9p, nil, 4096); + supervise_node(create_node(argc > 1 ? argv[0] : nil)); + threadexitsall(0); }
M node.cnode.c

@@ -2,10 +2,8 @@ #include "dat.h"

#include "fns.h" -void node_setup(Node* self, uvlong id, int fd, Handler* handlers, KuroMemory* memory) { +void node_setup(Node* self, Handler* handlers, KuroMemory* memory) { if (self) { - self->id = id; - self->fd = fd; self->handlers = handlers; self->memory = memory; self->cpu = chancreate(sizeof(Instruction), 0);

@@ -36,23 +34,22 @@ void node_execute(Node* self) {

threadcreate(node_loop, self, 1024); } -Node* create_node(uvlong id, int fd, int new, char* filename) { +Node* create_node(char* filename) { - if (new) { - newwindow("-dx 600 -dy 600"); - } initdraw(nil, nil, "kuro"); + unlockdisplay(display); KuroMemory* self = (KuroMemory*)malloc(sizeof(KuroMemory)); Node* node = (Node*)malloc(sizeof(Node)); Handler* handlers = (Handler*)malloc(TOTAL_OPCODES * sizeof(Handler*)); - node_setup(node, id, fd, handlers, self); + node_setup(node, handlers, self); self->img = screen; self->screen = _screen; - - strcpy(self->filepath, filename); + if (filename) { + strcpy(self->filepath, filename); + } /* node_execute runs the node on a separate thread */ node_execute(node);

@@ -90,10 +87,8 @@ case PORT_MOUSE:

print("got a mouse event"); break; case PORT_RESIZE: - lockdisplay(display); - if (getwindow(display, Refnone) < 0) - sysfatal("couldn't resize"); - unlockdisplay(display); + /*if (getwindow(display, Refnone) < 0) + sysfatal("couldn't resize");*/ print("got a resize event"); break; case PORT_KBD:

@@ -129,4 +124,4 @@ void memory_cleanup(KuroMemory* self) {

if (self) { /* do we need to free the img and screen? */ } -}+}
M srv.csrv.c

@@ -41,6 +41,7 @@ break;

} } + void new_window(char* filename, int new) { int rw_fd[2]; char client_fd[32] = {0};

@@ -65,6 +66,11 @@ char* a[] = { "kuro", "-p", client_fd, "-i", client_id, new ? "-n" : filename, new ? filename : 0, 0 };

exec("./kuro", a); } +void newwindowthread(void* arg) { + char* filename = (char*)arg; + new_window(filename, 1); +} + void write_ctl(Req* r) { char cmd[16] = {0}; char* c = r->ifcall.data;

@@ -87,7 +93,7 @@ print("cmd: %s\n", cmd);

print("arg: %s\n", c); if (strequ(cmd, "new")) { - new_window(c, 1); + threadcreate(newwindowthread, c, 256); respond(r, nil); } else { print("unknown command...\n");

@@ -107,16 +113,28 @@ break;

} } -void start_9p(char* mtpt) { - if (mtpt) { - putenv("KURO_MTPT", mtpt); +char* mk_mtpt(char* parent, char* buf) { + int pid = getpid(); + sprintf(buf, "%s/%d", parent, pid); + return buf; +} + +void start_9p() { + char* mtpt_base = getenv("KURO_MTPT"); + if (mtpt_base) { + char mtpt[256] = "TESTING LIKE THIS SHOULD NOT BE NECESSARY; AYEYEYEYEYE"; + + mk_mtpt(mtpt_base, mtpt); + int i = ensure(mtpt); + print("%d result of ensure\n", i); + print("%s\n", mtpt); Srv srv = { .read = kuro_read, .write = kuro_write }; Tree* tree = alloctree(nil, nil, DMDIR | 0777, fs_destroy_file); srv.tree = tree; closefile(createfile(tree->root, "ctl", nil, DMAPPEND | 0600, create_aux(CTL))); - closefile(createfile(tree->root, "nodes", nil, DMDIR | 0600, nil)); closefile(tree->root); /* TODO: figure out how to kill the server cleanly so we don't need MREPL */ threadpostmountsrv(&srv, nil, mtpt, MREPL | MCREATE); + threadexits(0); } }
M util.cutil.c

@@ -15,6 +15,16 @@ return s;

} char* uvlong_to_hex(uvlong input, char* buf) { - sprintf(buf, "%08%x\0", input); + sprintf(buf, "%08x\0", input); return buf; +} + +int ensure(char* path) { + int f = create(path, OREAD, DMDIR | 0777); + if (f < 0) { + return 0; + } else { + close(f); + return 1; + } }