X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=utils%2Fnfsdcld%2Fnfsdcld.c;h=a6c5239976d43e49e02baa4e23e58558591810af;hb=53f6dbee36fb72acb9a88413fc35c4e71200d3b8;hp=9fab2c301ade880896ca1cca9817cc1a9c9e700c;hpb=aff33d2e1fd7b4c8d91ff0cc5ea6ec4da125e1e0;p=nfs-utils.git diff --git a/utils/nfsdcld/nfsdcld.c b/utils/nfsdcld/nfsdcld.c index 9fab2c3..a6c5239 100644 --- a/utils/nfsdcld/nfsdcld.c +++ b/utils/nfsdcld/nfsdcld.c @@ -61,6 +61,7 @@ static struct option longopts[] = { "foreground", 0, NULL, 'F' }, { "debug", 0, NULL, 'd' }, { "pipe", 1, NULL, 'p' }, + { "storagedir", 1, NULL, 's' }, { NULL, 0, 0, 0 }, }; @@ -70,7 +71,7 @@ static void cldcb(int UNUSED(fd), short which, void *data); static void usage(char *progname) { - printf("Usage: %s [ -hFd ] [ -p pipe ]\n", progname); + printf("%s [ -hFd ] [ -p pipe ] [ -s dir ]\n", progname); } static int @@ -144,15 +145,47 @@ cld_create(struct cld_client *clnt) ssize_t bsize, wsize; struct cld_msg *cmsg = &clnt->cl_msg; - xlog(D_GENERAL, "%s: create client record", __func__); + xlog(D_GENERAL, "%s: create client record.", __func__); - /* FIXME: create client record on storage here */ + ret = sqlite_insert_client(cmsg->cm_u.cm_name.cn_id, + cmsg->cm_u.cm_name.cn_len); - /* set up reply */ - cmsg->cm_status = 0; + cmsg->cm_status = ret ? -EREMOTEIO : ret; bsize = sizeof(*cmsg); + xlog(D_GENERAL, "Doing downcall with status %d", cmsg->cm_status); + wsize = atomicio((void *)write, clnt->cl_fd, cmsg, bsize); + if (wsize != bsize) { + xlog(L_ERROR, "%s: problem writing to cld pipe (%ld): %m", + __func__, wsize); + ret = cld_pipe_open(clnt); + if (ret) { + xlog(L_FATAL, "%s: unable to reopen pipe: %d", + __func__, ret); + exit(ret); + } + } +} + +static void +cld_remove(struct cld_client *clnt) +{ + int ret; + ssize_t bsize, wsize; + struct cld_msg *cmsg = &clnt->cl_msg; + + xlog(D_GENERAL, "%s: remove client record.", __func__); + + ret = sqlite_remove_client(cmsg->cm_u.cm_name.cn_id, + cmsg->cm_u.cm_name.cn_len); + + cmsg->cm_status = ret ? -EREMOTEIO : ret; + + bsize = sizeof(*cmsg); + + xlog(D_GENERAL, "%s: downcall with status %d", __func__, + cmsg->cm_status); wsize = atomicio((void *)write, clnt->cl_fd, cmsg, bsize); if (wsize != bsize) { xlog(L_ERROR, "%s: problem writing to cld pipe (%ld): %m", @@ -194,6 +227,9 @@ cldcb(int UNUSED(fd), short which, void *data) case Cld_Create: cld_create(clnt); break; + case Cld_Remove: + cld_remove(clnt); + break; default: xlog(L_WARNING, "%s: command %u is not yet implemented", __func__, cmsg->cm_cmd); @@ -210,6 +246,7 @@ main(int argc, char **argv) int rc = 0; bool foreground = false; char *progname; + char *storagedir = NULL; struct cld_client clnt; memset(&clnt, 0, sizeof(clnt)); @@ -225,7 +262,7 @@ main(int argc, char **argv) xlog_stderr(1); /* process command-line options */ - while ((arg = getopt_long(argc, argv, "hdFp:", longopts, + while ((arg = getopt_long(argc, argv, "hdFp:s:", longopts, NULL)) != EOF) { switch (arg) { case 'd': @@ -237,6 +274,9 @@ main(int argc, char **argv) case 'p': pipepath = optarg; break; + case 's': + storagedir = optarg; + break; default: usage(progname); return 0; @@ -256,6 +296,11 @@ main(int argc, char **argv) } /* set up storage db */ + rc = sqlite_maindb_init(storagedir); + if (rc) { + xlog(L_ERROR, "Failed to open main database: %d", rc); + goto out; + } /* set up event handler */ rc = cld_pipe_init(&clnt);