shithub: lola

Download patch

ref: dafdfcb12496bfc27cdc863996172a7409dffd11
parent: f09a60d8cd60d2ec193b0315bfe0d7fd74b23406
author: aap <aap@papnet.eu>
date: Mon Jan 30 09:17:03 EST 2023

write text; file permissions

--- a/TODO
+++ b/TODO
@@ -1,8 +1,8 @@
 rethink resizing and repainting
 rethink hiding/unhiding
-file permissions
+snarfversion
+check for bad rects
 border resize/move
-write text
 top/bottom/current seems to work a bit different in rio
 release keys and buttons when unfocused
 ...
--- a/fs.c
+++ b/fs.c
@@ -31,32 +31,33 @@
 	int path;
 	int type;
 	char *name;
+	uint mode;
 };
 
 Dirent dirents[] = {
-	Qroot,	QTDIR,	".",
-	Qwsys,	QTDIR,	"wsys",
-	Qwinid,	QTFILE,	"winid",
-	Qwinname,	QTFILE,	"winname",
-	Qwdir,	QTFILE,	"wdir",
-	Qlabel,	QTFILE,	"label",
-	Qsnarf,	QTFILE,	"snarf",
-	Qtext,	QTFILE,	"text",
-	Qcons,	QTFILE, "cons",
-	Qconsctl,	QTFILE, "consctl",
-	Qkbd,	QTFILE, "kbd",
-	Qmouse,	QTFILE, "mouse",
-	Qcursor,	QTFILE, "cursor",
-	Qscreen,	QTFILE, "screen",
-	Qwindow,	QTFILE, "window",
-	Qwctl,	QTFILE, "wctl",
-	Qtap,	QTFILE, "kbdtap",
+	{ Qroot,	QTDIR,	".",	0500|DMDIR },
+	{ Qwsys,	QTDIR,	"wsys",	0500|DMDIR },
+	{ Qwinid,	QTFILE,	"winid",	0400 },
+	{ Qwinname,	QTFILE,	"winname",	0400 },
+	{ Qwdir,	QTFILE,	"wdir",	0600 },
+	{ Qlabel,	QTFILE,	"label",	0600 },
+	{ Qsnarf,	QTFILE,	"snarf",	0600 },
+	{ Qtext,	QTFILE,	"text",	0600 },
+	{ Qcons,	QTFILE, "cons",	0600 },
+	{ Qconsctl,	QTFILE, "consctl",	0200 },
+	{ Qkbd,	QTFILE, "kbd",	0600 },
+	{ Qmouse,	QTFILE, "mouse",	0600 },
+	{ Qcursor,	QTFILE, "cursor",	0600 },
+	{ Qscreen,	QTFILE, "screen",	0400 },
+	{ Qwindow,	QTFILE, "window",	0400 },
+	{ Qwctl,	QTFILE, "wctl",	0600 },
+	{ Qtap,	QTFILE, "kbdtap",	0660 }
 };
 
 char Eperm[] = "permission denied";
-char Eexist[] = "file does not exist";
-char Enotdir[] = "not a directory";
-char Ebadfcall[] = "bad fcall type";
+char Eexist[] = "file does not exist";		// XXX
+char Enotdir[] = "not a directory";		// XXX
+char Ebadfcall[] = "bad fcall type";		// XXX
 char Eoffset[] = "illegal offset";
 char Enomem[] = "out of memory";
 
@@ -67,11 +68,15 @@
 char Eshort[] =		"short i/o request";
 char Elong[] = 		"snarf buffer too long";
 char Eunkid[] = 	"unknown id in attach";
-char Ebadrect[] = 	"bad rectangle in attach";
+char Ebadrect[] = 	"bad rectangle in attach";		// XXX
 char Ewindow[] = 	"cannot make window";
-char Enowindow[] = 	"window has no image";
+char Enowindow[] = 	"window has no image";			// XXX
 char Ebadmouse[] = 	"bad format on /dev/mouse";
 
+int fsysfd;
+char srvpipe[64];
+char *user;
+
 /* Extension of a Req, req->aux. also has a thread. */
 typedef struct Xreq Xreq;
 struct Xreq
@@ -173,6 +178,11 @@
 	int id;
 	Wctlcmd cmd;
 
+	if(strcmp(r->ifcall.uname, user) != 0){
+		respond(r, Eperm);
+		return;
+	}
+
 	if(strncmp(r->ifcall.aname, "new", 3) == 0){
 		cmd = parsewctl(r->ifcall.aname, ZR);
 		if(cmd.error){
@@ -181,7 +191,7 @@
 		}
 		w = wcreate(cmd.r, cmd.hidden, cmd.scrolling);
 		if(w == nil){
-			respond(r, "window creation failed");
+			respond(r, Ewindow);
 			return;
 		}
 		wincmd(w, cmd.pid, cmd.dir, nil);
@@ -192,11 +202,11 @@
 	}else if(id = strtol(r->ifcall.aname, &end, 10), *end == '\0'){
 		w = wfind(id);
 		if(w == nil){
-			respond(r, "bad attach name");
+			respond(r, Eunkid);
 			return;
 		}
 	}else{
-		respond(r, "bad attach name");
+		respond(r, Eunkid);
 		return;
 	}
 
@@ -222,7 +232,6 @@
 	   !servekbd && strcmp(name, "kbd") == 0;
 }
 
-
 static char*
 fswalk1(Fid *fid, char *name, Qid *qid)
 {
@@ -293,13 +302,11 @@
 
 	d->atime = time(nil);
 	d->mtime = d->atime;
-	d->uid = estrdup9p(getuser());
+	d->uid = estrdup9p(user);
 	d->gid = estrdup9p(d->uid);
 	d->muid = estrdup9p(d->uid);
 	d->qid = (Qid){QID(ID(w),dirents[i].path), 0, dirents[i].type};
-	d->mode = 0664;
-	if(dirents[i].type & QTDIR)
-		d->mode |= 0111;
+	d->mode = dirents[i].mode;
 	d->name = estrdup9p(dirents[i].name);
 	d->length = 0;
 	return 0;
@@ -308,28 +315,21 @@
 static int
 genwsysdir(int n, Dir *d, void*)
 {
-	d->atime = time(nil);
-	d->mtime = d->atime;
-	d->uid = estrdup9p(getuser());
-	d->gid = estrdup9p(d->uid);
-	d->muid = estrdup9p(d->uid);
+	Window *w;
 
 	if(n == -1){
-		d->qid = (Qid){Qwsys, 0, QTDIR};
-		d->mode = 0775;
+		genrootdir(0, d, nil);
+		free(d->name);
 		d->name = estrdup9p("wsys");
-		d->length = 0;
 		return 0;
 	}
 	if(n < nwindows){
-		int id = windows[n]->id;
-		d->qid = (Qid){QID(id,Qroot), 0, QTDIR};
-		d->mode = 0775;
-		d->name = smprint("%d", id);
-		d->length = 0;
+		w = windows[n];
+		genrootdir(-1, d, w);
+		free(d->name);
+		d->name = smprint("%d", w->id);
 		return 0;
 	}
-
 	return -1;
 }
 
@@ -355,6 +355,11 @@
 		r->ifcall.mode &= (OREAD|OWRITE|ORDWR);		
 
 	switch(QFILE(r->fid->qid.path)){
+	case Qtext:
+		if(r->ifcall.mode & OTRUNC)
+			xdelete(&w->text, 0, w->text.nr);
+		break;
+
 	case Qsnarf:
 		if(r->ifcall.mode==ORDWR || r->ifcall.mode==OWRITE)
 			ntsnarf = 0;
@@ -381,7 +386,6 @@
 			respond(r, Einuse);
 			return;
 		}
-// TODO: copy comment from rio
 		w->resized = FALSE;
 		w->mouseopen = TRUE;
 		break;
@@ -679,6 +683,7 @@
 	}
 	int f = QFILE(r->fid->qid.path);
 	switch(f){
+	case Qtext:
 	case Qcons:
 		alts[Adata] = ALT(w->conswrite, &kbd, CHANRCV);
 		alts[Agone] = ALT(w->gone, nil, CHANRCV);
@@ -966,9 +971,6 @@
 	return 0;
 }
 
-int fsysfd;
-char srvpipe[64];
-
 void
 fs(void)
 {
@@ -977,7 +979,8 @@
 	if(cexecpipe(&fsysfd, &fsys.infd) < 0)
 		panic("pipe");
 	fsys.outfd = fsys.infd;
-	snprint(srvpipe, sizeof(srvpipe), "lola.%s.%lud", getuser(), (ulong)getpid());
+	user = getuser();
+	snprint(srvpipe, sizeof(srvpipe), "lola.%s.%lud", user, (ulong)getpid());
 	post(srvpipe, fsysfd);
 //	chatty9p++;
 	srv(&fsys);