Shouldn't xgetent authenticate with "xcpu-admin" a la xgroupset and
xuserset?

I am a little confused but I didn't find it right that you cannot view
the users/groups in the pool after you flush them.

Signed-off-by: Abhishek Kulkarni <[EMAIL PROTECTED]>

Index: utils/xgetent.c
===================================================================
--- utils/xgetent.c     (revision 715)
+++ utils/xgetent.c     (working copy)
@@ -37,6 +37,7 @@
 #include <signal.h>
 #include <regex.h>
 #include <math.h>
+#include <pwd.h>
 
 #include "spfs.h"
 #include "spclient.h"
@@ -46,29 +47,14 @@
 #include "xcpu.h"
 
 extern int spc_chatty;
-static Spuser *user;
-static Xkey *ukey;
+static Xkey *adminkey;
+static Spuser adminuser = {
+       .uname = "xcpu-admin",
+       .uid = 65530,
+};
 
-static int
-init_user(void)
-{
-       char *homepath, keypath[128];
-
-       user = sp_unix_users->uid2user(sp_unix_users, geteuid());
-       if (!user)
-               return -1;
-
-       homepath = getenv("HOME");
-       snprintf(keypath, sizeof(keypath), "%s/.ssh/id_rsa", homepath);
-       ukey = xauth_privkey_create(keypath);
-       if (!ukey)
-               return -1;
-
-       return 0;
-}
-
-void usage() {
-       fprintf(stderr, "usage: xgetent [-dap] <passwd|group>
host,...\n");
+void usage(char *name) {
+       fprintf(stderr, "usage: %s [-h] [-A admin_keyfile] [-d] [-p
port] <passwd|group> {-a | nodeset} \n", name);
        exit(1);
 }
 
@@ -79,11 +65,11 @@
        int n, off, ret, bufsize = 8192;
 
        ret = 0;
-       buf = malloc(sizeof(*buf) * bufsize);
-       fs = xp_node_mount(node, user, ukey);
+       fs = xp_node_mount(node, &adminuser, adminkey);
        if (!fs)
                return -1;
 
+       buf = malloc(sizeof(*buf) * bufsize);
        fid = spc_open(fs, "pwent", Oread);
        if (!fid) {
                free(buf);
@@ -100,7 +86,7 @@
        
        if (n < 0)
                ret = -1;
-       
+
        spc_close(fid);
        spc_umount(fs);
        free(buf);
@@ -113,11 +99,11 @@
        int n, off, ret, bufsize = 8192;
 
        ret = 0;
-       buf = malloc(sizeof(*buf) * bufsize);
-       fs = xp_node_mount(node, user, ukey);
+       fs = xp_node_mount(node, &adminuser, adminkey);
        if (!fs)
                return -1;
 
+       buf = malloc(sizeof(*buf) * bufsize);
        fid = spc_open(fs, "grent", Oread);
        if (!fid) {
                free(buf);
@@ -134,7 +120,7 @@
 
        if (n < 0)
                ret = -1;
-       
+
        spc_close(fid);
        spc_umount(fs);
        free(buf);
@@ -146,17 +132,22 @@
 {
        int c, ecode;
        int allflag = 0;
-       char *ename, db[7];
+       char *ename, db[7], *end;
        Xpnodeset *nds, *nds2;
-       int port = STAT_PORT;
-       char *end;
+       int port = STAT_PORT;   
+       struct passwd *pw;
+       char *adminkeyfile = "/etc/xcpu/admin_key";
 
-       while ((c = getopt(argc, argv, "+dap:")) != -1) {
+       while ((c = getopt(argc, argv, "+dA:ap:h")) != -1) {
                switch (c) {
                case 'd':
                        spc_chatty = 1;
                        break;
 
+               case 'A':
+                       adminkeyfile = strdup(optarg);
+                       break;
+
                case 'a':
                        allflag++;
                        break;
@@ -164,21 +155,34 @@
                case 'p':
                        port = strtol(optarg, &end, 10);
                        if (*end != '\0')
-                               usage();
+                               usage(argv[0]);
                        break;
+               case 'h':
                default:
-                       usage();
+                       usage(argv[0]);
                }
        }
 
        if ((!allflag && argc - optind != 2 ) || (allflag && argc - optind !=
1)) 
-               usage();
+               usage(argv[0]);
 
-
        snprintf(db, 7, "%s", argv[optind++]);
        if (strcmp("passwd", db) && strcmp("group", db))
-               usage();
+               usage(argv[0]);
 
+       adminkey = xauth_privkey_create(adminkeyfile);
+       if (!adminkey)
+               goto lerror;
+
+       setpwent();
+       while ((pw = getpwent()) != NULL) {
+               if(!strcmp(pw->pw_name, adminuser.uname)) {
+                       adminuser.uid = pw->pw_uid;
+                       break;
+               }
+       }
+       endpwent();
+
        if (allflag) {
                char statserver[32];
                sprintf(statserver, "localhost!%d", port);
@@ -203,9 +207,6 @@
        if (!nds)
                goto lerror;
 
-       if (init_user() < 0)
-               goto lerror;
-       
        if (!strcmp("passwd", db)) {
                if (xp_nodeset_iterate(nds, read_pwent, NULL) > 0)
                        goto rerror;


Reply via email to