Commit Diff


commit - 756ef3a2426b7577a59442fc382a7abe7304a23c
commit + 6b5a3519bb4a483ad6f50fd767134409042c299d
blob - 4e22c18e7c28f702a2534c6385e05b549beae99d
blob + 7eb6b81a1694cb0c12f8012386851f6774ec5b87
--- client.c
+++ client.c
@@ -131,6 +131,7 @@ static void		np_create(uint16_t, struct qid *, uint32_
 static void		np_read(uint16_t, uint32_t, void *);
 static void		np_write(uint16_t, uint32_t);
 static void		np_stat(uint16_t, uint32_t, void *);
+static void		np_remove(uint16_t);
 static void		np_error(uint16_t, const char *);
 static void		np_errno(uint16_t);
 
@@ -165,6 +166,7 @@ static void	tcreate(struct np_msg_header *, const uint
 static void	tread(struct np_msg_header *, const uint8_t *, size_t);
 static void	twrite(struct np_msg_header *, const uint8_t *, size_t);
 static void	tstat(struct np_msg_header *, const uint8_t *, size_t);
+static void	tremove(struct np_msg_header *, const uint8_t *, size_t);
 static void	handle_message(struct imsg *, size_t);
 
 ATTR_DEAD void
@@ -699,6 +701,13 @@ np_stat(uint16_t tag, uint32_t count, void *data)
 {
 	np_header(count, Rstat, tag);
 	np_writebuf(evb, count, data);
+	do_send();
+}
+
+static void
+np_remove(uint16_t tag)
+{
+	np_header(0, Rremove, tag);
 	do_send();
 }
 
@@ -1508,6 +1517,38 @@ tstat(struct np_msg_header *hdr, const uint8_t *data, 
 	serialize_stat(fname, &sb, evb);
 	np_stat(hdr->tag, EVBUFFER_LENGTH(evb), EVBUFFER_DATA(evb));
 	evbuffer_free(evb);
+}
+
+static void
+tremove(struct np_msg_header *hdr, const uint8_t *data, size_t len)
+{
+	struct fid	*f;
+	uint32_t	 fid;
+	int		 r;
+
+	/* fid[4] */
+	if (!NPREAD32("fid", &fid, &data, &len)) {
+		client_send_listener(IMSG_CLOSE, NULL, 0);
+		client_shutdown();
+		return;
+	}
+
+	if ((f = fid_by_id(fid)) == NULL) {
+		np_error(hdr->tag, "invalid fid");
+		return;
+	}
+
+	if (f->fd == -1 || f->dir == NULL) /* unlink file */
+		r = unlinkat(f->qid->fd, f->qid->fpath, 0);
+	else /* directory */
+		r = unlinkat(f->qid->fd, f->qid->fpath, AT_REMOVEDIR);
+
+	if (r == -1)
+		np_errno(hdr->tag);
+	else
+		np_remove(hdr->tag);
+
+	free_fid(f);
 }
 
 static void
@@ -1527,6 +1568,7 @@ handle_message(struct imsg *imsg, size_t len)
 		{Tread,		tread},
 		{Twrite,	twrite},
 		{Tstat,		tstat},
+		{Tremove,	tremove},
 	};
 	struct np_msg_header	 hdr;
 	size_t			 i;