All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bryan Schumaker <bjschuma@netapp.com>
To: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: Chuck Lever <chuck.lever@oracle.com>,
	Schumaker Bryan <Bryan.Schumaker@netapp.com>,
	steved@redhat.com, linux-nfs@vger.kernel.org
Subject: Re: [PATCH] nfs-utils: add nfs.upcall
Date: Tue, 26 Oct 2010 08:46:55 -0400	[thread overview]
Message-ID: <4CC6CDBF.1020703@netapp.com> (raw)
In-Reply-To: <1288096967.3123.11.camel@heimdal.trondhjem.org>

Ok.  While I am fixing things up, I will also take this chance to change the key type to nfs_idmap instead of id_resolver.  I'll send the utils patch in a separate email, and I'll have the kernel patch out as soon as I can make it.

Bryan


On 10/26/2010 08:42 AM, Trond Myklebust wrote:
> On Tue, 2010-10-26 at 08:41 -0400, Bryan Schumaker wrote:
>> Sure.  Do you want a patch that renames it in the kernel documentation file too?
> 
> Yes. The documentation definitely needs to be consistent with the
> implementation.
> 
>> Bryan
>>
>> On 10/25/2010 07:46 PM, Myklebust, Trond wrote:
>>> Ah, fsck... You're right.
>>>
>>> Bryan, can you instead resend your latest patch for nfs-utils? I've asked Linus to merge the kernel part, so it is time to get the userspace stuff in order too!
>>>
>>> Sent from my iPhone
>>>
>>> On Oct 25, 2010, at 19:21, "Chuck Lever" <chuck.lever@oracle.com> wrote:
>>>
>>>> I thought we were going to call this nfs.idmap ... ?
>>>>
>>>> On Oct 25, 2010, at 6:40 PM, Trond Myklebust wrote:
>>>>
>>>>> From: Bryan Schumaker <bjschuma@netapp.com>
>>>>>
>>>>> Add nfs.upcall
>>>>>
>>>>> This patch adds the nfs.upcall program to nfs-utils.  This program is called by
>>>>> the nfs idmapper through request-keys to map between uid / user name and
>>>>> gid / group name.
>>>>>
>>>>> Signed-off-by: Bryan Schumaker <bjschuma@netapp.com>
>>>>> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
>>>>> ---
>>>>> aclocal/keyutils.m4           |   11 ++++
>>>>> configure.ac                  |    4 ++
>>>>> utils/Makefile.am             |    1 +
>>>>> utils/nfs.upcall/Makefile.am  |    7 +++
>>>>> utils/nfs.upcall/nfs.upcall.c |  120 +++++++++++++++++++++++++++++++++++++++++
>>>>> 5 files changed, 143 insertions(+), 0 deletions(-)
>>>>> create mode 100644 aclocal/keyutils.m4
>>>>> create mode 100644 utils/nfs.upcall/Makefile.am
>>>>> create mode 100644 utils/nfs.upcall/nfs.upcall.c
>>>>>
>>>>> diff --git a/aclocal/keyutils.m4 b/aclocal/keyutils.m4
>>>>> new file mode 100644
>>>>> index 0000000..8aea646
>>>>> --- /dev/null
>>>>> +++ b/aclocal/keyutils.m4
>>>>> @@ -0,0 +1,11 @@
>>>>> +dnl Checks for keyutils library and headers
>>>>> +dnl
>>>>> +AC_DEFUN([AC_KEYUTILS], [
>>>>> +
>>>>> +  dnl Check for libkeyutils; do not add to LIBS if found
>>>>> +  AC_CHECK_LIB([keyutils], [keyctl_instantiate], [LIBKEYUTILS=-lkeyutils], ,)
>>>>> +  AC_SUBST(LIBKEYUTILS)
>>>>> +
>>>>> +  AC_CHECK_HEADERS([keyutils.h], ,
>>>>> +           [AC_MSG_ERROR([keyutils.h header not found.])])
>>>>> +])dnl
>>>>> diff --git a/configure.ac b/configure.ac
>>>>> index 3058be6..a5e8620 100644
>>>>> --- a/configure.ac
>>>>> +++ b/configure.ac
>>>>> @@ -247,6 +247,9 @@ if test "$enable_nfsv4" = yes; then
>>>>>  dnl check for nfsidmap libraries and headers
>>>>>  AC_LIBNFSIDMAP
>>>>>
>>>>> +  dnl check for the keyutils libraries and headers
>>>>> +  AC_KEYUTILS
>>>>> +
>>>>>  dnl librpcsecgss already has a dependency on libgssapi,
>>>>>  dnl but we need to make sure we get the right version
>>>>>  if test "$enable_gss" = yes; then
>>>>> @@ -435,6 +438,7 @@ AC_CONFIG_FILES([
>>>>>    utils/mountd/Makefile
>>>>>    utils/nfsd/Makefile
>>>>>    utils/nfsstat/Makefile
>>>>> +    utils/nfs.upcall/Makefile
>>>>>    utils/showmount/Makefile
>>>>>    utils/statd/Makefile
>>>>>    tests/Makefile
>>>>> diff --git a/utils/Makefile.am b/utils/Makefile.am
>>>>> index 8665183..0104a6c 100644
>>>>> --- a/utils/Makefile.am
>>>>> +++ b/utils/Makefile.am
>>>>> @@ -4,6 +4,7 @@ OPTDIRS =
>>>>>
>>>>> if CONFIG_NFSV4
>>>>> OPTDIRS += idmapd
>>>>> +OPTDIRS += nfs.upcall
>>>>> endif
>>>>>
>>>>> if CONFIG_GSS
>>>>> diff --git a/utils/nfs.upcall/Makefile.am b/utils/nfs.upcall/Makefile.am
>>>>> new file mode 100644
>>>>> index 0000000..52afd3d
>>>>> --- /dev/null
>>>>> +++ b/utils/nfs.upcall/Makefile.am
>>>>> @@ -0,0 +1,7 @@
>>>>> +## Process this file with automake to produce Makefile.in
>>>>> +
>>>>> +sbin_PROGRAMS    = nfs.upcall
>>>>> +nfs_upcall_SOURCES = nfs.upcall.c
>>>>> +nfs_upcall_LDADD = -lnfsidmap -lkeyutils
>>>>> +
>>>>> +MAINTAINERCLEANFILES = Makefile.in
>>>>> diff --git a/utils/nfs.upcall/nfs.upcall.c b/utils/nfs.upcall/nfs.upcall.c
>>>>> new file mode 100644
>>>>> index 0000000..11b9a01
>>>>> --- /dev/null
>>>>> +++ b/utils/nfs.upcall/nfs.upcall.c
>>>>> @@ -0,0 +1,120 @@
>>>>> +
>>>>> +#include <stdarg.h>
>>>>> +#include <stdio.h>
>>>>> +#include <stdlib.h>
>>>>> +#include <string.h>
>>>>> +
>>>>> +#include <pwd.h>
>>>>> +#include <grp.h>
>>>>> +#include <keyutils.h>
>>>>> +#include <nfsidmap.h>
>>>>> +
>>>>> +#include <syslog.h>
>>>>> +
>>>>> +/* gcc nfs.upcall.c -o nfs.upcall -l nfsidmap -l keyutils */
>>>>> +
>>>>> +#define MAX_ID_LEN   11
>>>>> +#define IDMAP_NAMESZ 128
>>>>> +#define USER  1
>>>>> +#define GROUP 0
>>>>> +
>>>>> +
>>>>> +/*
>>>>> + * Find either a user or group id based on the name@domain string
>>>>> + */
>>>>> +int id_lookup(char *name_at_domain, key_serial_t key, int type)
>>>>> +{
>>>>> +    char id[MAX_ID_LEN];
>>>>> +    uid_t uid = 0;
>>>>> +    gid_t gid = 0;
>>>>> +
>>>>> +    if (type == USER) {
>>>>> +        nfs4_owner_to_uid(name_at_domain, &uid);
>>>>> +        sprintf(id, "%u", uid);
>>>>> +    } else {
>>>>> +        nfs4_group_owner_to_gid(name_at_domain, &gid);
>>>>> +        sprintf(id, "%u", gid);
>>>>> +    }
>>>>> +
>>>>> +    return keyctl_instantiate(key, id, strlen(id) + 1, 0);
>>>>> +}
>>>>> +
>>>>> +/*
>>>>> + * Find the name@domain string from either a user or group id
>>>>> + */
>>>>> +int name_lookup(char *id, key_serial_t key, int type)
>>>>> +{
>>>>> +    char name[IDMAP_NAMESZ];
>>>>> +    char domain[NFS4_MAX_DOMAIN_LEN];
>>>>> +    uid_t uid;
>>>>> +    gid_t gid;
>>>>> +    int rc = 0;
>>>>> +
>>>>> +    rc = nfs4_get_default_domain(NULL, domain, NFS4_MAX_DOMAIN_LEN);
>>>>> +    if (rc != 0) {
>>>>> +        rc = -1;
>>>>> +        goto out;
>>>>> +    }
>>>>> +
>>>>> +    if (type == USER) {
>>>>> +        uid = atoi(id);
>>>>> +        rc = nfs4_uid_to_name(uid, domain, name, IDMAP_NAMESZ);
>>>>> +    } else {
>>>>> +        gid = atoi(id);
>>>>> +        rc = nfs4_gid_to_name(gid, domain, name, IDMAP_NAMESZ);
>>>>> +    }
>>>>> +
>>>>> +    if (rc == 0)
>>>>> +        rc = keyctl_instantiate(key, &name, strlen(name), 0);
>>>>> +
>>>>> +out:
>>>>> +    return rc;
>>>>> +}
>>>>> +
>>>>> +int main(int argc, char **argv)
>>>>> +{
>>>>> +    char *arg;
>>>>> +    char *value;
>>>>> +    char *type;
>>>>> +    int rc = 1;
>>>>> +    int timeout = 600;
>>>>> +    key_serial_t key;
>>>>> +
>>>>> +    /*openlog("nfs.upcall", 0, LOG_DAEMON);*/
>>>>> +
>>>>> +    if (argc < 3)
>>>>> +        return 1;
>>>>> +
>>>>> +    arg = malloc(sizeof(char) * strlen(argv[2]) + 1);
>>>>> +    strcpy(arg, argv[2]);
>>>>> +    type = strtok(arg, ":");
>>>>> +    value = strtok(NULL, ":");
>>>>> +
>>>>> +    if (argc == 4) {
>>>>> +        timeout = atoi(argv[3]);
>>>>> +        if (timeout < 0)
>>>>> +            timeout = 0;
>>>>> +    }
>>>>> +
>>>>> +    /*syslog(LOG_ERR, "type: %s", type);
>>>>> +    syslog(LOG_ERR, "value: %s", value);
>>>>> +    syslog(LOG_ERR, "timeout: %d", timeout);*/
>>>>> +
>>>>> +    key = strtol(argv[1], NULL, 10);
>>>>> +
>>>>> +    if (strcmp(type, "uid") == 0)
>>>>> +        rc = id_lookup(value, key, USER);
>>>>> +    else if (strcmp(type, "gid") == 0)
>>>>> +        rc = id_lookup(value, key, GROUP);
>>>>> +    else if (strcmp(type, "user") == 0)
>>>>> +        rc = name_lookup(value, key, USER);
>>>>> +    else if (strcmp(type, "group") == 0)
>>>>> +        rc = name_lookup(value, key, GROUP);
>>>>> +
>>>>> +    /* Set timeout to 5 (600 seconds) minutes */
>>>>> +    keyctl_set_timeout(key, timeout);
>>>>> +
>>>>> +    free(arg);
>>>>> +    /*closelog();*/
>>>>> +    return rc;
>>>>> +}
>>>>> -- 
>>>>> 1.7.2.3
>>>>>
>>>>> --
>>>>> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
>>>>> the body of a message to majordomo@vger.kernel.org
>>>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>>>
>>>> -- 
>>>> Chuck Lever
>>>> chuck[dot]lever[at]oracle[dot]com
>>>>
>>>>
>>>>
>>>>
>>
> 
> 


      reply	other threads:[~2010-10-26 12:46 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-25 22:40 [PATCH] nfs-utils: add nfs.upcall Trond Myklebust
2010-10-25 23:20 ` Chuck Lever
2010-10-25 23:46   ` Myklebust, Trond
2010-10-26 12:41     ` Bryan Schumaker
2010-10-26 12:42       ` Trond Myklebust
2010-10-26 12:46         ` Bryan Schumaker [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4CC6CDBF.1020703@netapp.com \
    --to=bjschuma@netapp.com \
    --cc=Bryan.Schumaker@netapp.com \
    --cc=Trond.Myklebust@netapp.com \
    --cc=chuck.lever@oracle.com \
    --cc=linux-nfs@vger.kernel.org \
    --cc=steved@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.