6 files changed, 466 insertions(+), 329 deletions(-)
include/libxcpu.h | 19 +-
libxcpu/group.c | 213 +++++++++++------------
libxcpu/node.c | 13 -
libxcpu/user.c | 470 +++++++++++++++++++++++++++++-----------------------
libxcpu/util.c | 69 +++++++
libxcpu/xcpuimpl.h | 11 +
# HG changeset patch
# User Abhishek Kulkarni <[EMAIL PROTECTED]>
# Date 1226340180 25200
# Node ID a68b59fb85899367fd3d712749cc305c592af10b
# Parent a955190ac5b2ea7266ffc275212423a9205e46c3
added new functions to libxcpu
xp_user_add_group : add a user to a group
xp_user_del_group : delete a user from a group
xp_getpwent : fetch the user list from the user pool
xp_getgrent : fetch list of groups from the pool
the xp_group_* and xp_user_* functions have been changed to remove a lot of redundant code.
a new structure
Xcmd {
Spstr *cmd;
Spuser *adminuser;
Xkey *adminkey;
}
has been added which defines an internal xcpu command (cmd) to be executed on the server (xcpufs) by the user (adminuser, adminkey).
the libxcpu user and group functions now populate this structure and use the
xp_ctl_cmd() function to execute this command on a remote xcpufs server.
also added the xp_getpwent() and xp_getgrent() functions which return the user/group list as an array of strings.
Signed-off-by: Abhishek Kulkarni <[EMAIL PROTECTED]>
diff --git a/include/libxcpu.h b/include/libxcpu.h
--- a/include/libxcpu.h
+++ b/include/libxcpu.h
@@ -177,11 +177,16 @@
int xp_proc_list(Xpnodeset *, Spuser *, Xkey *, Xpproc **);
int xp_proc_kill(Xpproc *, Spuser *, Xkey *, int);
-int xp_defaultuser(Spuser **puser, Spgroup **group);
-int xp_user_add(Xpnodeset *nds, Xkey *adminkey, char *uname, uid_t uid,
+int xp_defaultuser(Spuser **puser, Xkey **pkey);
+int xp_user_add(Xpnodeset *nds, char *adminkey, char *uname, uid_t uid,
char *gname, char *ukey);
-int xp_user_del(Xpnodeset *nds, Xkey *adminkey, char *uname);
-int xp_user_flush(Xpnodeset *nds, Xkey *adminkey);
-int xp_group_add(Xpnodeset *nds, Xkey *adminkey, char *gname, gid_t gid);
-int xp_group_del(Xpnodeset *nds, Xkey *adminkey, char *gname);
-int xp_group_flush(Xpnodeset *nds, Xkey *adminkey);
+int xp_user_del(Xpnodeset *nds, char *adminkey, char *uname);
+int xp_user_flush(Xpnodeset *nds, char *adminkey);
+int xp_user_add_group(Xpnodeset *nds, char *adminkey, char *uname, char *gname);
+int xp_user_del_group(Xpnodeset *nds, char *adminkey, char *uname, char *gname);
+int xp_getpwent(Xpnode *nd, char *adminkey, char ***pwent);
+int xp_group_add(Xpnodeset *nds, char *adminkey, char *gname, gid_t gid);
+int xp_group_del(Xpnodeset *nds, char *adminkey, char *gname);
+int xp_group_flush(Xpnodeset *nds, char *adminkey);
+int xp_getgrent(Xpnode *nd, char *adminkey, char ***grent);
+
diff --git a/libxcpu/group.c b/libxcpu/group.c
--- a/libxcpu/group.c
+++ b/libxcpu/group.c
@@ -23,165 +23,152 @@
#include "strutil.h"
#include "libxauth.h"
#include "libxcpu.h"
-
-typedef struct Gbuf Gbuf;
-struct Gbuf {
- int size;
- char *buf;
- Xkey *adminkey;
- Spuser *adminuser;
-};
-
-static int
-group_cmd(Xpnode *nd, void *cba)
-{
- Gbuf *cmdbuf = cba;
- Spcfsys *fs;
- Spcfid *fid;
-
- fs = xp_node_mount(nd, cmdbuf->adminuser, cmdbuf->adminkey);
- if (!fs)
- goto error;
-
- fid = spc_open(fs, "ctl", Owrite);
- if (!fid)
- goto error;
-
- if (spc_write(fid, (u8 *) cmdbuf->buf, cmdbuf->size, 0) < 0)
- goto error;
-
- spc_close(fid);
- spc_umount(fs);
- return 0;
-
-error:
- if (fs)
- spc_umount(fs);
- return -1;
-}
-
-static inline Gbuf *
-gbuf_init(char *buf, int size, Xkey *adminkey)
-{
- struct passwd *xcpu_admin;
- Gbuf *gpbuf = sp_malloc(sizeof(*gpbuf));
- if (!gpbuf)
- return NULL;
-
- gpbuf->buf = buf;
- gpbuf->size = size;
- gpbuf->adminkey = adminkey;
-
- gpbuf->adminuser = sp_malloc(sizeof(*gpbuf->adminuser));
- gpbuf->adminuser->uname = strdup("xcpu-admin");
- gpbuf->adminuser->uid = 65530;
- xcpu_admin = getpwnam(gpbuf->adminuser->uname);
- if (xcpu_admin)
- gpbuf->adminuser->uid = xcpu_admin->pw_uid;
-
- return gpbuf;
-}
-
-static inline void
-gbuf_destroy(Gbuf *buf)
-{
- if(buf->adminuser)
- free(buf->adminuser);
-
- free(buf);
-}
+#include "xcpuimpl.h"
int
-xp_group_add(Xpnodeset *nds, Xkey *adminkey, char *gname, gid_t gid)
+xp_group_add(Xpnodeset *nds, char *adminkey, char *gname, gid_t gid)
{
- int bufsize = 4096, buflen;
- char *buf;
- Gbuf *addbuf;
+ Xcmd *addcmd;
+ Spstr *cmd;
if (!nds)
return -1;
- buf = sp_malloc(sizeof(*buf) * bufsize);
- snprintf(buf, bufsize, "group-add %s %d\n", gname, gid);
- buflen = strlen(buf);
- addbuf = gbuf_init(buf, buflen, adminkey);
- if (!addbuf)
+ cmd = sp_malloc(sizeof(*cmd));
+ cmd->len = 512;
+ cmd->str = sp_malloc(cmd->len);
+ snprintf(cmd->str, cmd->len, "group-add %s %d\n", gname, gid);
+ addcmd = xcmd_init(cmd, adminkey);
+ if (!addcmd)
goto error;
- if (xp_nodeset_iterate(nds, group_cmd, addbuf) > 0)
+ if (xp_nodeset_iterate(nds, xp_ctl_cmd, addcmd) > 0)
goto error;
- free(buf);
- gbuf_destroy(addbuf);
+ xcmd_destroy(addcmd);
return 0;
error:
- free(buf);
- if (addbuf)
- gbuf_destroy(addbuf);
+ if (addcmd)
+ xcmd_destroy(addcmd);
xp_nodeerror_print("xp_group_add");
return -1;
}
int
-xp_group_del(Xpnodeset *nds, Xkey *adminkey, char *gname)
+xp_group_del(Xpnodeset *nds, char *adminkey, char *gname)
{
- int bufsize = 1024, buflen;
- char *buf;
- Gbuf *delbuf;
+ Xcmd *delcmd;
+ Spstr *cmd;
if (!nds)
return -1;
- buf = sp_malloc(sizeof(*buf) * bufsize);
- snprintf(buf, bufsize, "group-del %s\n", gname);
- buflen = strlen(buf);
- delbuf = gbuf_init(buf, buflen, adminkey);
- if (!delbuf)
+ cmd = sp_malloc(sizeof(*cmd));
+ cmd->len = 512;
+ cmd->str = sp_malloc(cmd->len);
+ snprintf(cmd->str, cmd->len, "group-del %s\n", gname);
+ delcmd = xcmd_init(cmd, adminkey);
+ if (!delcmd)
goto error;
- if (xp_nodeset_iterate(nds, group_cmd, delbuf) > 0)
+ if (xp_nodeset_iterate(nds, xp_ctl_cmd, delcmd) > 0)
goto error;
-
- free(buf);
- gbuf_destroy(delbuf);
+
+ xcmd_destroy(delcmd);
return 0;
error:
- free(buf);
- if (delbuf)
- gbuf_destroy(delbuf);
+ if (delcmd)
+ xcmd_destroy(delcmd);
xp_nodeerror_print("xp_group_del");
return -1;
}
int
-xp_group_flush(Xpnodeset *nds, Xkey *adminkey)
+xp_group_flush(Xpnodeset *nds, char *adminkey)
{
- int buflen;
- char *buf;
- Gbuf *flbuf;
+ Xcmd *flcmd;
+ Spstr *cmd;
if (!nds)
return -1;
-
- buf = strdup("group-flush\n");
- buflen = strlen(buf);
- flbuf = gbuf_init(buf, buflen, adminkey);
- if (!flbuf)
+
+ cmd = sp_malloc(sizeof(*cmd));
+ cmd->str = strdup("group-flush\n");
+ cmd->len = strlen(cmd->str);
+ flcmd = xcmd_init(cmd, adminkey);
+ if (!flcmd)
goto error;
- if (xp_nodeset_iterate(nds, group_cmd, flbuf) > 0)
+ if (xp_nodeset_iterate(nds, xp_ctl_cmd, flcmd) > 0)
goto error;
- free(buf);
- gbuf_destroy(flbuf);
+ xcmd_destroy(flcmd);
return 0;
error:
- free(buf);
- if (flbuf)
- gbuf_destroy(flbuf);
+ if (flcmd)
+ xcmd_destroy(flcmd);
xp_nodeerror_print("xp_group_flush");
return -1;
}
+
+int
+xp_getgrent(Xpnode *nd, char *adminkey, char ***grent)
+{
+ char *buf = NULL, **toks;
+ int n, bufsize = 8192;
+ Xkey *akey = NULL;
+ Spuser *auser = NULL;
+ Spcfsys *fs;
+ Spcfid *fid;
+
+ if (adminkey) {
+ akey = xauth_privkey_create(adminkey);
+ if (!akey)
+ goto error;
+ }
+
+ if (xp_defaultuser(&auser, &akey) < 0)
+ goto error;
+
+ fs = xp_node_mount(nd, auser, akey);
+ if (!fs) {
+ fs = xp_node_mount(nd, NULL, akey);
+ if (!fs)
+ goto error;
+ }
+
+ fid = spc_open(fs, "grent", Oread);
+ if (!fid) {
+ sp_werror("error opening file grent", EIO);
+ goto error;
+ }
+ buf = sp_malloc(sizeof(*buf) * bufsize);
+ if (!buf)
+ goto error;
+
+ n = spc_read(fid, (u8 *) buf, bufsize-1, 0);
+ if (n < 0)
+ goto error;
+ buf[bufsize] = '\0';
+ spc_close(fid);
+ spc_umount(fs);
+
+ n = tokenize(buf, &toks);
+ if (n < 0)
+ goto error;
+ free(buf);
+ *grent = toks;
+ return n;
+error:
+ if (fid)
+ spc_close(fid);
+ if (fs)
+ spc_umount(fs);
+ if (buf)
+ free(buf);
+
+ return -1;
+}
diff --git a/libxcpu/node.c b/libxcpu/node.c
--- a/libxcpu/node.c
+++ b/libxcpu/node.c
@@ -161,11 +161,15 @@
prog, ne->node->name, ne->ecode, ne->ename);
errorpool = ne->next;
- if (pe)
- free(pe);
+ if (pe) {
+ free(pe->ename);
+ free(pe);
+ }
}
- if (pe)
- free(pe);
+ if (pe) {
+ free(pe->ename);
+ free(pe);
+ }
}
/*
@@ -324,6 +328,7 @@
if ((s = strchr(name, '!')) != NULL)
*s = '\0';
+ free(name);
hostinfo = gethostbyname(nd->name);
if (!hostinfo)
return;
diff --git a/libxcpu/user.c b/libxcpu/user.c
--- a/libxcpu/user.c
+++ b/libxcpu/user.c
@@ -23,95 +23,283 @@
#include "strutil.h"
#include "libxauth.h"
#include "libxcpu.h"
-
-typedef struct Ubuf Ubuf;
-struct Ubuf {
- int size;
- char *buf;
- char *uname;
- u32 uid;
- char *gname;
- Xkey *adminkey;
- Spuser *adminuser;
-};
+#include "xcpuimpl.h"
int
-xp_defaultuser(Spuser **puser, Spgroup **pgroup)
+xp_defaultuser(Spuser **puser, Xkey **pkey)
{
- static Spuserpool *upool = NULL;
- static struct passwd *xcpu_admin = NULL;
- static struct Spuser *adminuser = NULL;
- static struct Spgroup *admingroup = NULL;
- static Xkey *adminkey = NULL;
- gid_t xcpu_gid;
+ Spuser *adminuser = NULL;
+ struct passwd *xcpu_admin;
+ Xkey *adminkey = NULL;
if (puser)
*puser = NULL;
- if (pgroup)
- *pgroup = NULL;
- if (! upool) {
- upool = sp_priv_userpool_create();
+ if (*pkey)
+ adminkey = *pkey;
+ else
+ adminkey = xauth_privkey_create("/etc/xcpu/admin_key");
+
+ if (adminkey) {
+ adminuser = sp_malloc(sizeof(*adminuser));
+ if (!adminuser)
+ goto error;
+ adminuser->uname = strdup("xcpu-admin");
+ xcpu_admin = getpwnam("xcpu-admin");
+ if (xcpu_admin)
+ adminuser->uid = xcpu_admin->pw_uid;
+ else
+ adminuser->uid = 65530;
+ } else {
+ adminuser = sp_unix_users->uid2user(sp_unix_users,
+ geteuid());
+ if (!adminuser)
+ goto error;
+
+ adminkey = xauth_user_privkey();
+ if (!adminkey)
+ goto error;
+ }
+
+ if (puser)
+ *puser = adminuser;
+ if (pkey)
+ *pkey = adminkey;
+ return 0;
+error:
+ if (adminuser)
+ free(adminuser);
+
+ if (adminkey)
+ xauth_destroy(adminkey);
+ return -1;
+}
+
+int
+xp_user_add(Xpnodeset *nds, char *adminkey, char *uname, uid_t uid, char *gname, char *ukey)
+{
+ Xcmd *addcmd;
+ Spstr *cmd;
+ char *qkey;
+
+ if (!nds)
+ return -1;
+
+ cmd = sp_malloc(sizeof(*cmd));
+ cmd->len = 4096;
+ cmd->str = sp_malloc(cmd->len);
+ qkey = quotestrdup(ukey);
+ snprintf(cmd->str, cmd->len, "user-add %s %d %s %s\n", uname, uid,
+ gname, qkey);
+ free(qkey);
+ addcmd = xcmd_init(cmd, adminkey);
+ if (!addcmd)
+ goto error;
+
+ if (xp_nodeset_iterate(nds, xp_ctl_cmd, addcmd) > 0)
+ goto error;
+
+ xcmd_destroy(addcmd);
+ return 0;
+error:
+ if (addcmd)
+ xcmd_destroy(addcmd);
+
+ xp_nodeerror_print("xp_user_add");
+ return -1;
+}
+
+int
+xp_user_del(Xpnodeset *nds, char *adminkey, char *uname)
+{
+ Xcmd *delcmd;
+ Spstr *cmd;
+
+ if (!nds)
+ return -1;
+
+ cmd = sp_malloc(sizeof(*cmd));
+ cmd->len = 512;
+ cmd->str = sp_malloc(cmd->len);
+ snprintf(cmd->str, cmd->len, "user-del %s\n", uname);
+ delcmd = xcmd_init(cmd, adminkey);
+ if (!delcmd)
+ goto error;
+
+ if (xp_nodeset_iterate(nds, xp_ctl_cmd, delcmd) > 0)
+ goto error;
+
+ xcmd_destroy(delcmd);
+ return 0;
+error:
+ if (delcmd)
+ xcmd_destroy(delcmd);
+
+ xp_nodeerror_print("xp_user_del");
+ return -1;
+}
+
+int
+xp_user_flush(Xpnodeset *nds, char *adminkey)
+{
+ Xcmd *flcmd;
+ Spstr *cmd;
+
+ if (!nds)
+ return -1;
+
+ cmd = sp_malloc(sizeof(*cmd));
+ cmd->str = strdup("user-flush\n");
+ cmd->len = strlen(cmd->str);
+ flcmd = xcmd_init(cmd, adminkey);
+ if (!flcmd)
+ goto error;
+
+ if (xp_nodeset_iterate(nds, xp_ctl_cmd, flcmd) > 0)
+ goto error;
+
+ xcmd_destroy(flcmd);
+ return 0;
+error:
+ if (flcmd)
+ xcmd_destroy(flcmd);
+
+ xp_nodeerror_print("xp_user_flush");
+ return -1;
+}
+
+int
+xp_user_add_group(Xpnodeset *nds, char *adminkey, char *uname, char *gname)
+{
+ Xcmd *grpcmd;
+ Spstr *cmd;
+
+ if (!nds)
+ return -1;
+
+ cmd = sp_malloc(sizeof(*cmd));
+ cmd->len = 1024;
+ cmd->str = sp_malloc(cmd->len);
+ snprintf(cmd->str, cmd->len, "user-add-group %s %s\n", uname, gname);
+ grpcmd = xcmd_init(cmd, adminkey);
+ if (!grpcmd)
+ goto error;
+
+ if (xp_nodeset_iterate(nds, xp_ctl_cmd, grpcmd) > 0)
+ goto error;
+
+ xcmd_destroy(grpcmd);
+ return 0;
+error:
+ if (grpcmd)
+ xcmd_destroy(grpcmd);
+
+ xp_nodeerror_print("xp_user_add_group");
+ return -1;
+}
+
+int
+xp_user_del_group(Xpnodeset *nds, char *adminkey, char *uname, char *gname)
+{
+ Xcmd *grpcmd;
+ Spstr *cmd;
+
+ if (!nds)
+ return -1;
+
+ cmd = sp_malloc(sizeof(*cmd));
+ cmd->len = 1024;
+ cmd->str = sp_malloc(cmd->len);
+ snprintf(cmd->str, cmd->len, "user-del-group %s %s\n", uname, gname);
+ grpcmd = xcmd_init(cmd, adminkey);
+ if (!grpcmd)
+ goto error;
+
+ if (xp_nodeset_iterate(nds, xp_ctl_cmd, grpcmd) > 0)
+ goto error;
+
+ xcmd_destroy(grpcmd);
+ return 0;
+error:
+ if (grpcmd)
+ xcmd_destroy(grpcmd);
+
+ xp_nodeerror_print("xp_user_del_group");
+ return -1;
+}
+
+int
+xp_getpwent(Xpnode *nd, char *adminkey, char ***pwent)
+{
+ char *buf = NULL, **toks;
+ int n, bufsize = 8192;
+ Xkey *akey = NULL;
+ Spuser *auser = NULL;
+ Spcfsys *fs;
+ Spcfid *fid;
+
+ if (adminkey) {
+ akey = xauth_privkey_create(adminkey);
+ if (!akey)
+ goto error;
}
- if (!upool) {
- fprintf(stderr, "can not create user pool\n");
- exit(1);
+ if (xp_defaultuser(&auser, &akey) < 0)
+ goto error;
+
+ fs = xp_node_mount(nd, auser, akey);
+ if (!fs) {
+ fs = xp_node_mount(nd, NULL, akey);
+ if (!fs)
+ goto error;
}
- if (! adminkey)
- adminkey = xauth_privkey_create( "/etc/xcpu/admin_key");
- if (!adminkey) {
- adminkey = (Xkey *) ~0;
- sp_werror(NULL, 0);
- }
+ fid = spc_open(fs, "pwent", Oread);
+ if (!fid)
+ goto error;
- if (! xcpu_admin)
- xcpu_admin = getpwnam("xcpu-admin");
- if (xcpu_admin)
- xcpu_gid = xcpu_admin->pw_gid;
- else
- xcpu_gid = 65530;
- if (! adminuser)
- adminuser = sp_priv_user_add(upool, "xcpu-admin", xcpu_gid, adminkey);
- if (!adminuser)
+ buf = sp_malloc(sizeof(*buf) * bufsize);
+ if (!buf)
+ goto error;
+
+ n = spc_read(fid, (u8 *) buf, bufsize-1, 0);
+ if (n < 0)
+ goto error;
+ buf[bufsize] = '\0';
+ spc_close(fid);
+ spc_umount(fs);
+
+ n = tokenize(buf, &toks);
+ if (n < 0)
+ goto error;
+ free(buf);
+ *pwent = toks;
+ return n;
+error:
+ if (fid)
+ spc_close(fid);
+ if (fs)
+ spc_umount(fs);
+ if (buf)
+ free(buf);
+
+ return -1;
+}
+
+#if 0
+int
+xp_user_chown(Xpnode *nd, char *adminkey, char *path)
+{
+ Spwstat wst;
+ Xcmd *ucmd;
+
+ if (!path)
goto error;
- if (! admingroup)
- admingroup = sp_priv_group_add(upool, "xcpu-admin", -3);
- if (!admingroup)
- goto error;
-
- if (puser)
- *puser = adminuser;
- if (pgroup)
- *pgroup = admingroup;
- return 0;
-error:
- return -1;
-
-}
-
-static int
-user_cmd(Xpnode *nd, void *cba)
-{
- Ubuf *cmdbuf = cba;
- Spcfsys *fs;
- Spcfid *fid;
- Spwstat wst;
-
- fs = xp_node_mount(nd, cmdbuf->adminuser, cmdbuf->adminkey);
+ fs = xp_node_mount(nd, ucmd->adminuser, ucmd->adminkey);
if (!fs)
goto error;
- fid = spc_open(fs, "ctl", Owrite);
- if (!fid)
- goto error;
-
- if (spc_write(fid, (u8 *) cmdbuf->buf, cmdbuf->size, 0) < 0)
- goto error;
-
- spc_close(fid);
wst.type = ~0;
wst.dev = ~0;
wst.qid.type = ~0;
@@ -122,147 +310,21 @@
wst.mtime = ~0;
wst.name = NULL;
wst.length = ~0;
- wst.uid = (cmdbuf->uname) ? cmdbuf->uname : cmdbuf->adminuser->uname;
- wst.gid = (cmdbuf->gname) ? cmdbuf->gname : cmdbuf->adminuser->uname;
+ wst.uid = (ucmd->uname) ? ucmd->uname : ucmd->adminuser->uname;
+ wst.gid = (ucmd->gname) ? ucmd->gname : ucmd->adminuser->uname;
wst.muid = NULL;
wst.extension = NULL;
- wst.n_uid = (cmdbuf->uid) ? cmdbuf->uid : cmdbuf->adminuser->uid;
+ wst.n_uid = (ucmd->uid) ? ucmd->uid : ucmd->adminuser->uid;
wst.n_gid = ~0;
wst.n_muid = ~0;
- if (spc_wstat(fs, "clone", &wst) < 0)
+ if (spc_wstat(fs, path, &wst) < 0)
goto error;
+
spc_umount(fs);
- return 0;
error:
if (fs)
spc_umount(fs);
return -1;
}
-
-static inline Ubuf *
-ubuf_init(char *buf, int size, char *uname, u32 uid, char *gname, Xkey *adminkey)
-{
- Ubuf *upbuf = sp_malloc(sizeof(*upbuf));
- if (!upbuf)
- return NULL;
-
- upbuf->buf = buf;
- upbuf->size = size;
- upbuf->uname = uname;
- upbuf->uid = uid;
- upbuf->gname = gname;
- upbuf->adminkey = adminkey;
-
- upbuf->adminuser = sp_malloc(sizeof(*upbuf->adminuser));
- upbuf->adminuser->uname = strdup("xcpu-admin");
- upbuf->adminuser->uid = 65530;
- return upbuf;
-}
-
-static inline void
-ubuf_destroy(Ubuf *buf)
-{
- if (buf->adminuser)
- free(buf->adminuser);
-
- free(buf);
-}
-
-int
-xp_user_add(Xpnodeset *nds, Xkey *adminkey, char *uname, uid_t uid, char *gname, char *ukey)
-{
- int bufsize = 4096, buflen;
- char *buf, *qkey;
- Ubuf *addbuf;
-
- if (!nds)
- return -1;
-
- buf = sp_malloc(sizeof(*buf) * bufsize);
- qkey = quotestrdup(ukey);
- snprintf(buf, bufsize, "user-add %s %d %s %s\n", uname, uid, gname, qkey);
- free(qkey);
- buflen = strlen(buf);
- addbuf = ubuf_init(buf, buflen, uname, uid, gname, adminkey);
- if (!addbuf)
- goto error;
-
- if (xp_nodeset_iterate(nds, user_cmd, addbuf) > 0)
- goto error;
-
- free(buf);
- ubuf_destroy(addbuf);
-
- return 0;
-error:
- free(buf);
- if (addbuf)
- ubuf_destroy(addbuf);
-
- xp_nodeerror_print("xp_user_add");
- return -1;
-}
-
-int
-xp_user_del(Xpnodeset *nds, Xkey *adminkey, char *uname)
-{
- int bufsize = 1024, buflen;
- char *buf;
- Ubuf *delbuf;
-
- if (!nds)
- return -1;
-
- buf = sp_malloc(sizeof(*buf) * bufsize);
- snprintf(buf, bufsize, "user-del %s\n", uname);
- buflen = strlen(buf);
- delbuf = ubuf_init(buf, buflen, NULL, 0, NULL, adminkey);
- if (!delbuf)
- goto error;
-
- if (xp_nodeset_iterate(nds, user_cmd, delbuf) > 0)
- goto error;
-
- free(buf);
- ubuf_destroy(delbuf);
- return 0;
-error:
- free(buf);
- if (delbuf)
- ubuf_destroy(delbuf);
-
- xp_nodeerror_print("xp_user_del");
- return -1;
-}
-
-int
-xp_user_flush(Xpnodeset *nds, Xkey *adminkey)
-{
- int buflen;
- char *buf;
- Ubuf *flbuf;
-
- if (!nds)
- return -1;
-
- buf = strdup("user-flush\n");
- buflen = strlen(buf);
- flbuf = ubuf_init(buf, buflen, NULL, 0, NULL, adminkey);
- if (!flbuf)
- goto error;
-
- if (xp_nodeset_iterate(nds, user_cmd, flbuf) > 0)
- goto error;
-
- free(buf);
- ubuf_destroy(flbuf);
- return 0;
-error:
- free(buf);
- if (flbuf)
- ubuf_destroy(flbuf);
-
- xp_nodeerror_print("xp_user_flush");
- return -1;
-}
+#endif
diff --git a/libxcpu/util.c b/libxcpu/util.c
--- a/libxcpu/util.c
+++ b/libxcpu/util.c
@@ -88,3 +88,72 @@
return 0;
}
+
+int
+xp_ctl_cmd(Xpnode *nd, void *xcmd)
+{
+ Spcfsys *fs;
+ Spcfid *fid;
+ Xcmd *ctlcmd = xcmd;
+ fs = xp_node_mount(nd, ctlcmd->adminuser, ctlcmd->adminkey);
+ if (!fs) {
+ fs = xp_node_mount(nd, NULL, ctlcmd->adminkey);
+ if (!fs)
+ goto error;
+ }
+
+ fid = spc_open(fs, "ctl", Owrite);
+ if (!fid)
+ goto error;
+
+ if (spc_write(fid, (u8 *) ctlcmd->cmd->str, ctlcmd->cmd->len, 0) < 0)
+ goto error;
+
+ spc_close(fid);
+ spc_umount(fs);
+ return 0;
+
+error:
+ if (fs)
+ spc_umount(fs);
+ return -1;
+}
+
+Xcmd *
+xcmd_init(Spstr *cmd, char *adminkey)
+{
+ Xcmd *xcmd = sp_malloc(sizeof(*xcmd));
+ if (!xcmd)
+ return NULL;
+
+ xcmd->cmd = cmd;
+ if (adminkey) {
+ xcmd->adminkey = xauth_privkey_create(adminkey);
+ if (!xcmd->adminkey)
+ goto error;
+ } else
+ xcmd->adminkey = NULL;
+
+ if (xp_defaultuser(&xcmd->adminuser,
+ &xcmd->adminkey) < 0)
+ goto error;
+
+ return xcmd;
+error:
+ xcmd_destroy(xcmd);
+ return NULL;
+}
+
+void
+xcmd_destroy(Xcmd *xcmd)
+{
+ if (xcmd->adminuser)
+ free(xcmd->adminuser);
+
+ if (xcmd->adminkey)
+ xauth_destroy(xcmd->adminkey);
+
+ free(xcmd->cmd->str);
+ free(xcmd->cmd);
+ free(xcmd);
+}
diff --git a/libxcpu/xcpuimpl.h b/libxcpu/xcpuimpl.h
--- a/libxcpu/xcpuimpl.h
+++ b/libxcpu/xcpuimpl.h
@@ -94,6 +94,13 @@
Xpcopy* copyf;
};
+typedef struct Xcmd Xcmd;
+struct Xcmd {
+ Spstr *cmd;
+ Spuser *adminuser;
+ Xkey *adminkey;
+};
+
extern int xp_ldd_support;
int xp_file_create_from_file(Xpfile **xpf, Spcfsys *fs, char *name, char *path);
@@ -118,5 +125,7 @@
void xp_sessionset_destroy(Xpsessionset *);
int xp_ldd(char *binary, char *sysroot, char ***deps);
-int defaultuser(Spuser **puser, Spgroup **pgroup);
+int xp_ctl_cmd(Xpnode *nd, void *xcmd);
+Xcmd *xcmd_init(Spstr *cmd, char *adminkey);
+void xcmd_destroy(Xcmd *xcmd);