15 /* gcc nfsidmap.c -o nfsidmap -l nfsidmap -l keyutils */
18 #define IDMAP_NAMESZ 128
24 * Find either a user or group id based on the name@domain string
26 int id_lookup(char *name_at_domain, key_serial_t key, int type)
34 rc = nfs4_owner_to_uid(name_at_domain, &uid);
35 sprintf(id, "%u", uid);
37 rc = nfs4_group_owner_to_gid(name_at_domain, &gid);
38 sprintf(id, "%u", gid);
41 xlog_err("id_lookup: %s: failed: %m",
42 (type == USER ? "nfs4_owner_to_uid" : "nfs4_group_owner_to_gid"));
45 rc = keyctl_instantiate(key, id, strlen(id) + 1, 0);
47 xlog_err("id_lookup: keyctl_instantiate failed: %m");
54 * Find the name@domain string from either a user or group id
56 int name_lookup(char *id, key_serial_t key, int type)
58 char name[IDMAP_NAMESZ];
59 char domain[NFS4_MAX_DOMAIN_LEN];
64 rc = nfs4_get_default_domain(NULL, domain, NFS4_MAX_DOMAIN_LEN);
67 xlog_err("name_lookup: nfs4_get_default_domain failed: %m");
73 rc = nfs4_uid_to_name(uid, domain, name, IDMAP_NAMESZ);
76 rc = nfs4_gid_to_name(gid, domain, name, IDMAP_NAMESZ);
79 xlog_err("name_lookup: %s: failed: %m",
80 (type == USER ? "nfs4_uid_to_name" : "nfs4_gid_to_name"));
83 rc = keyctl_instantiate(key, &name, strlen(name), 0);
85 xlog_err("name_lookup: keyctl_instantiate failed: %m");
91 int main(int argc, char **argv)
101 /* Set the basename */
102 if ((progname = strrchr(argv[0], '/')) != NULL)
112 xlog_err("Bad arg count. Check /etc/request-key.conf");
116 arg = malloc(sizeof(char) * strlen(argv[2]) + 1);
117 strcpy(arg, argv[2]);
118 type = strtok(arg, ":");
119 value = strtok(NULL, ":");
122 timeout = atoi(argv[3]);
127 key = strtol(argv[1], NULL, 10);
129 if (strcmp(type, "uid") == 0)
130 rc = id_lookup(value, key, USER);
131 else if (strcmp(type, "gid") == 0)
132 rc = id_lookup(value, key, GROUP);
133 else if (strcmp(type, "user") == 0)
134 rc = name_lookup(value, key, USER);
135 else if (strcmp(type, "group") == 0)
136 rc = name_lookup(value, key, GROUP);
138 /* Set timeout to 5 (600 seconds) minutes */
140 keyctl_set_timeout(key, timeout);