diff options
author | Jeff Layton <jlayton@redhat.com> | 2012-04-26 11:46:14 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2012-04-26 13:25:04 -0400 |
commit | 53f6dbee36fb72acb9a88413fc35c4e71200d3b8 (patch) | |
tree | 8b81ef4dc4c6068e7163221abbccbb54c6d39d50 /utils/nfsdcld | |
parent | 3e859abefffafd8718b5f1f76da7b129fc18e281 (diff) | |
download | nfs-utils-53f6dbee36fb72acb9a88413fc35c4e71200d3b8.tar.gz nfs-utils-53f6dbee36fb72acb9a88413fc35c4e71200d3b8.tar.xz nfs-utils-53f6dbee36fb72acb9a88413fc35c4e71200d3b8.zip |
nfsdcld: add remove functionality
Allow the kernel to ask for removal of a client record.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/nfsdcld')
-rw-r--r-- | utils/nfsdcld/nfsdcld.c | 34 | ||||
-rw-r--r-- | utils/nfsdcld/sqlite.c | 36 | ||||
-rw-r--r-- | utils/nfsdcld/sqlite.h | 1 |
3 files changed, 71 insertions, 0 deletions
diff --git a/utils/nfsdcld/nfsdcld.c b/utils/nfsdcld/nfsdcld.c index c58801c..a6c5239 100644 --- a/utils/nfsdcld/nfsdcld.c +++ b/utils/nfsdcld/nfsdcld.c @@ -169,6 +169,37 @@ cld_create(struct cld_client *clnt) } 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", + __func__, wsize); + ret = cld_pipe_open(clnt); + if (ret) { + xlog(L_FATAL, "%s: unable to reopen pipe: %d", + __func__, ret); + exit(ret); + } + } +} + +static void cldcb(int UNUSED(fd), short which, void *data) { ssize_t len; @@ -196,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); diff --git a/utils/nfsdcld/sqlite.c b/utils/nfsdcld/sqlite.c index f70568e..a198c34 100644 --- a/utils/nfsdcld/sqlite.c +++ b/utils/nfsdcld/sqlite.c @@ -251,3 +251,39 @@ out_err: sqlite3_finalize(stmt); return ret; } + +/* Remove a client record */ +int +sqlite_remove_client(const unsigned char *clname, const size_t namelen) +{ + int ret; + sqlite3_stmt *stmt = NULL; + + ret = sqlite3_prepare_v2(dbh, "DELETE FROM clients WHERE id==?", -1, + &stmt, NULL); + if (ret != SQLITE_OK) { + xlog(L_ERROR, "%s: statement prepare failed: %s", + __func__, sqlite3_errmsg(dbh)); + goto out_err; + } + + ret = sqlite3_bind_blob(stmt, 1, (const void *)clname, namelen, + SQLITE_STATIC); + if (ret != SQLITE_OK) { + xlog(L_ERROR, "%s: bind blob failed: %s", __func__, + sqlite3_errmsg(dbh)); + goto out_err; + } + + ret = sqlite3_step(stmt); + if (ret == SQLITE_DONE) + ret = SQLITE_OK; + else + xlog(L_ERROR, "%s: unexpected return code from delete: %d", + __func__, ret); + +out_err: + xlog(D_GENERAL, "%s: returning %d", __func__, ret); + sqlite3_finalize(stmt); + return ret; +} diff --git a/utils/nfsdcld/sqlite.h b/utils/nfsdcld/sqlite.h index ba4c213..425f5ba 100644 --- a/utils/nfsdcld/sqlite.h +++ b/utils/nfsdcld/sqlite.h @@ -22,5 +22,6 @@ int sqlite_maindb_init(char *topdir); int sqlite_insert_client(const unsigned char *clname, const size_t namelen); +int sqlite_remove_client(const unsigned char *clname, const size_t namelen); #endif /* _SQLITE_H */ |