commit - 756ef3a2426b7577a59442fc382a7abe7304a23c
commit + 6b5a3519bb4a483ad6f50fd767134409042c299d
blob - 4e22c18e7c28f702a2534c6385e05b549beae99d
blob + 7eb6b81a1694cb0c12f8012386851f6774ec5b87
--- client.c
+++ client.c
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);
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
{
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();
}
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
{Tread, tread},
{Twrite, twrite},
{Tstat, tstat},
+ {Tremove, tremove},
};
struct np_msg_header hdr;
size_t i;