nfs-ganesha 1.4

idmapper.c

Go to the documentation of this file.
00001 /*
00002  * vim:expandtab:shiftwidth=8:tabstop=8:
00003  *
00004  * Copyright CEA/DAM/DIF  (2008)
00005  * contributeur : Philippe DENIEL   philippe.deniel@cea.fr
00006  *                Thomas LEIBOVICI  thomas.leibovici@cea.fr
00007  *
00008  *
00009  * This program is free software; you can redistribute it and/or
00010  * modify it under the terms of the GNU Lesser General Public
00011  * License as published by the Free Software Foundation; either
00012  * version 3 of the License, or (at your option) any later version.
00013  * 
00014  * This program is distributed in the hope that it will be useful,
00015  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017  * Lesser General Public License for more details.
00018  * 
00019  * You should have received a copy of the GNU Lesser General Public
00020  * License along with this library; if not, write to the Free Software
00021  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00022  * 
00023  * ---------------------------------------
00024  */
00025 
00036 #ifdef HAVE_CONFIG_H
00037 #include "config.h"
00038 #endif
00039 
00040 #ifdef _SOLARIS
00041 #include "solaris_port.h"
00042 #endif
00043 
00044 #include "ganesha_rpc.h"
00045 #include "nfs_core.h"
00046 #include "nfs_tools.h"
00047 #include <unistd.h>             /* for using gethostname */
00048 #include <stdlib.h>             /* for using exit */
00049 #include <strings.h>
00050 #include <string.h>
00051 #include <sys/types.h>
00052 #include <pwd.h>
00053 #include <grp.h>
00054 
00055 #ifdef _USE_NFSIDMAP
00056 
00057 #define _PATH_IDMAPDCONF     "/etc/idmapd.conf"
00058 
00059 typedef void (*nfs4_idmap_log_function_t) (const char *, ...);
00060 
00061 int nfs4_init_name_mapping(char *conffile);
00062 int nfs4_get_default_domain(char *server, char *domain, size_t len);
00063 int nfs4_uid_to_name(uid_t uid, char *domain, char *name, size_t len);
00064 int nfs4_gid_to_name(gid_t gid, char *domain, char *name, size_t len);
00065 int nfs4_name_to_uid(char *name, uid_t * uid);
00066 int nfs4_name_to_gid(char *name, gid_t * gid);
00067 int nfs4_gss_princ_to_ids(char *secname, char *princ, uid_t * uid, gid_t * gid);
00068 int nfs4_gss_princ_to_grouplist(char *secname, char *princ, gid_t * groups, int *ngroups);
00069 void nfs4_set_debug(int dbg_level, nfs4_idmap_log_function_t dbg_logfunc);
00070 
00071 char idmap_domain[NFS4_MAX_DOMAIN_LEN];
00072 static int nfsidmap_conf_read = FALSE;
00073 
00074 int nfsidmap_set_conf()
00075 {
00076   if(!nfsidmap_conf_read)
00077     {
00078       if(nfs4_init_name_mapping(_PATH_IDMAPDCONF))
00079         return 0;
00080 
00081       if(nfs4_get_default_domain(NULL, idmap_domain, sizeof(idmap_domain)))
00082         return 0;
00083 
00084       nfsidmap_conf_read = TRUE;
00085     }
00086   return 1;
00087 }
00088 #endif                          /* _USE_NFSIDMAP */
00089 
00102 int uid2name(char *name, uid_t * puid)
00103 {
00104 #ifdef _USE_NFSIDMAP
00105   char fqname[NFS4_MAX_DOMAIN_LEN];
00106 
00107   int rc;
00108 
00109   if(!nfsidmap_set_conf())
00110     {
00111       LogCrit(COMPONENT_IDMAPPER,
00112               "uid2name: nfsidmap_set_conf failed");
00113       return 0;
00114     }
00115 
00116   if(unamemap_get(*puid, name) == ID_MAPPER_SUCCESS)
00117     {
00118       LogFullDebug(COMPONENT_IDMAPPER,
00119                    "uid2name: unamemap_get uid %d returned %s",
00120                    *puid, name);
00121       return 1;
00122     }
00123   else
00124     {
00125       rc = nfs4_uid_to_name(*puid, idmap_domain, name, NFS4_MAX_DOMAIN_LEN);
00126       if(rc != 0)
00127         {
00128           LogDebug(COMPONENT_IDMAPPER,
00129                    "uid2name: nfs4_uid_to_name %d returned %d (%s)",
00130                    *puid, -rc, strerror(-rc));
00131           return 0;
00132         }
00133 
00134       strncpy(fqname, name, NFS4_MAX_DOMAIN_LEN);
00135       if(strchr(name, '@') == NULL)
00136         {
00137           LogFullDebug(COMPONENT_IDMAPPER,
00138                        "uid2name: adding domain %s",
00139                        idmap_domain);
00140           sprintf(fqname, "%s@%s", name, idmap_domain);
00141           strncpy(name, fqname, NFS4_MAX_DOMAIN_LEN);
00142         }
00143 
00144       LogFullDebug(COMPONENT_IDMAPPER,
00145                    "uid2name: nfs4_uid_to_name uid %d returned %s",
00146                    *puid, name);
00147 
00148       if(uidmap_add(fqname, *puid) != ID_MAPPER_SUCCESS)
00149         {
00150           LogCrit(COMPONENT_IDMAPPER,
00151                   "uid2name: uidmap_add %s %d failed",
00152                   fqname, *puid);
00153           return 0;
00154         }
00155     }
00156   return 1;
00157 
00158 #else
00159   struct passwd p;
00160   struct passwd *pp;
00161   char buff[NFS4_MAX_DOMAIN_LEN];
00162 
00163   if(unamemap_get(*puid, name) == ID_MAPPER_SUCCESS)
00164     {
00165       LogFullDebug(COMPONENT_IDMAPPER,
00166                    "uid2name: unamemap_get uid %d returned %s",
00167                    *puid, name);
00168       return 1;
00169     }
00170   else
00171     {
00172 #ifdef _SOLARIS
00173       if(getpwuid_r(*puid, &p, buff, MAXPATHLEN) != 0)
00174 #else
00175       if((getpwuid_r(*puid, &p, buff, MAXPATHLEN, &pp) != 0) ||
00176          (pp == NULL))
00177 #endif                          /* _SOLARIS */
00178         {
00179           LogFullDebug(COMPONENT_IDMAPPER,
00180                        "uid2name: getpwuid_r %d failed",
00181                        *puid);
00182           return 0;
00183         }
00184 
00185       strncpy(name, p.pw_name, NFS4_MAX_DOMAIN_LEN);
00186 
00187       LogFullDebug(COMPONENT_IDMAPPER,
00188                    "uid2name: getpwuid_r uid %d returned %s",
00189                    *puid, name);
00190 
00191       if(uidmap_add(name, *puid) != ID_MAPPER_SUCCESS)
00192         {
00193           LogCrit(COMPONENT_IDMAPPER,
00194                   "uid2name: uidmap_add %s %d failed",
00195                   name, *puid);
00196           return 0;
00197         }
00198     }
00199 
00200   return 1;
00201 #endif                          /* _USE_NFSIDMAP */
00202 }                               /* uid2name */
00203 
00216 int name2uid(char *name, uid_t * puid)
00217 {
00218   struct passwd passwd;
00219   struct passwd *res;
00220   char buff[NFS4_MAX_DOMAIN_LEN];
00221   uid_t uid;
00222 #ifdef _USE_NFSIDMAP
00223 #ifdef _HAVE_GSSAPI
00224   gid_t gss_gid;
00225   uid_t gss_uid;
00226 #endif
00227   char fqname[NFS4_MAX_DOMAIN_LEN];
00228   int rc;
00229 #endif
00230 
00231   /* NFsv4 specific features: RPCSEC_GSS will provide user like nfs/<host>
00232    * choice is made to map them to root */
00233   if(!strncmp(name, "nfs/", 4))
00234     {
00235       /* This is a "root" request made from the hostbased nfs principal, use root */
00236       LogFullDebug(COMPONENT_IDMAPPER,
00237                    "name2uid: mapping %s to root (uid = 0)",
00238                    name);
00239       *puid = 0;
00240 
00241       return 1;
00242     }
00243 
00244   if(uidmap_get(name, (unsigned long *)&uid) == ID_MAPPER_SUCCESS)
00245     {
00246       LogFullDebug(COMPONENT_IDMAPPER,
00247                    "name2uid: uidmap_get mapped %s to uid= %d",
00248                    name, uid);
00249       *puid = uid;
00250 
00251       return 1 ;
00252     }
00253   else
00254     {
00255 #ifdef _SOLARIS
00256       if((res = getpwnam_r(name, &passwd, buff, NFS4_MAX_DOMAIN_LEN)) == NULL)
00257 #else
00258       if(getpwnam_r(name, &passwd, buff, NFS4_MAX_DOMAIN_LEN, &res) != 0)
00259 #endif                          /* _SOLARIS */
00260         {
00261           LogFullDebug(COMPONENT_IDMAPPER,
00262                        "name2uid: getpwnam_r %s failed",
00263                        name);
00264           *puid = -1;
00265           return 0;
00266         }
00267       else if (res != NULL)
00268         {
00269           *puid = res->pw_uid;
00270 #ifdef _HAVE_GSSAPI
00271           if(uidgidmap_add(res->pw_uid, res->pw_gid) != ID_MAPPER_SUCCESS)
00272             {
00273               LogCrit(COMPONENT_IDMAPPER,
00274                       "name2uid: uidgidmap_add gss_uid %d gss_gid %d failed",
00275                       res->pw_uid, res->pw_gid);
00276               return 0;
00277             }
00278 #endif                          /* _HAVE_GSSAPI */
00279           if(uidmap_add(name, res->pw_uid) != ID_MAPPER_SUCCESS)
00280             {
00281               LogCrit(COMPONENT_IDMAPPER,
00282                       "name2uid: uidmap_add %s %d failed",
00283                       name, res->pw_uid);
00284               return 0;
00285             }
00286 
00287            return 1 ; /* Job is done */
00288         }
00289 
00290 #ifdef _USE_NFSIDMAP
00291       if(!nfsidmap_set_conf())
00292         {
00293           LogCrit(COMPONENT_IDMAPPER,
00294                   "name2uid: nfsidmap_set_conf failed");
00295           return 0;
00296         }
00297 
00298       /* obtain fully qualified name */
00299       if(strchr(name, '@') == NULL)
00300         sprintf(fqname, "%s@%s", name, idmap_domain);
00301       else
00302         strncpy(fqname, name, NFS4_MAX_DOMAIN_LEN - 1);
00303 
00304       rc = nfs4_name_to_uid(fqname, puid);
00305       if(rc)
00306         {
00307           LogFullDebug(COMPONENT_IDMAPPER,
00308                        "name2uid: nfs4_name_to_uid %s failed %d (%s)",
00309                        fqname, -rc, strerror(-rc));
00310           return 0;
00311         }
00312 
00313       LogFullDebug(COMPONENT_IDMAPPER,
00314                    "name2uid: nfs4_name_to_uid %s returned %d",
00315                    fqname, *puid);
00316 
00317       if(uidmap_add(fqname, *puid) != ID_MAPPER_SUCCESS)
00318         {
00319           LogCrit(COMPONENT_IDMAPPER,
00320                   "name2uid: uidmap_add %s %d failed",
00321                   fqname, *puid);
00322           return 0;
00323         }
00324 
00325 #ifdef _HAVE_GSSAPI
00326       /* nfs4_gss_princ_to_ids required to extract uid/gid from gss creds
00327        * XXX: currently uses unqualified name as per libnfsidmap comments */
00328       rc = nfs4_gss_princ_to_ids("krb5", name, &gss_uid, &gss_gid);
00329       if(rc)
00330         {
00331           LogFullDebug(COMPONENT_IDMAPPER,
00332                        "name2uid: nfs4_gss_princ_to_ids %s failed %d (%s)",
00333                        name, -rc, strerror(-rc));
00334           return 0;
00335         }
00336 
00337       if(uidgidmap_add(gss_uid, gss_gid) != ID_MAPPER_SUCCESS)
00338         {
00339           LogCrit(COMPONENT_IDMAPPER,
00340                   "name2uid: uidgidmap_add gss_uid %d gss_gid %d failed",
00341                   gss_uid, gss_gid);
00342           return 0;
00343         }
00344 #endif                          /* _HAVE_GSSAPI */
00345 
00346 #endif                           /* _USE_NFSIDMAP */
00347 
00348     }
00349 
00350   return 1;
00351 }                               /* name2uid */
00352 
00365 #ifdef _HAVE_GSSAPI
00366 int principal2uid(char *principal, uid_t * puid)
00367 {
00368 #ifdef _USE_NFSIDMAP
00369   gid_t gss_gid;
00370   uid_t gss_uid;
00371   int rc;
00372 
00373   if(uidmap_get(principal, (unsigned long *)&gss_uid) != ID_MAPPER_SUCCESS)
00374     {
00375       if(!nfsidmap_set_conf())
00376         {
00377           LogCrit(COMPONENT_IDMAPPER,
00378                   "principal2uid: nfsidmap_set_conf failed");
00379           return 0;
00380         }
00381 
00382       /* nfs4_gss_princ_to_ids required to extract uid/gid from gss creds */
00383       LogFullDebug(COMPONENT_IDMAPPER,
00384                    "calling nfs4_gss_princ_to_ids() to map principal to uid/gid");
00385       rc = nfs4_gss_princ_to_ids("krb5", principal, &gss_uid, &gss_gid);
00386       if(rc)
00387         {
00388           LogFullDebug(COMPONENT_IDMAPPER,
00389                        "principal2uid: nfs4_gss_princ_to_ids %s failed %d (%s)",
00390                        principal, -rc, strerror(-rc));
00391           return 0;
00392         }
00393       if(uidmap_add(principal, gss_uid) != ID_MAPPER_SUCCESS)
00394         {
00395           LogCrit(COMPONENT_IDMAPPER,
00396                   "principal2uid: uidmap_add %s %d failed",
00397                   principal, gss_uid);
00398           return 0;
00399         }
00400       if(uidgidmap_add(gss_uid, gss_gid) != ID_MAPPER_SUCCESS)
00401         {
00402           LogCrit(COMPONENT_IDMAPPER,
00403                   "principal2uid: uidgidmap_add gss_uid %d gss_gid %d failed",
00404                   gss_uid, gss_gid);
00405           return 0;
00406         }
00407     }
00408 
00409   LogFullDebug(COMPONENT_IDMAPPER,
00410                "principal2uid: uidmap_get mapped %s to uid= %d",
00411                principal, gss_uid);
00412   *puid = gss_uid;
00413 
00414   return 1;
00415 #else
00416   return 0 ;
00417 #endif /* _USE_NFSIDMAP */
00418 }                               /* principal2uid */
00419 #endif                          /* _HAVE_GSSAPI */
00420 
00433 int gid2name(char *name, gid_t * pgid)
00434 {
00435 #ifndef _USE_NFSIDMAP
00436   struct group g;
00437 #ifndef _SOLARIS
00438   struct group *pg = NULL;
00439 #endif
00440   static char buff[NFS4_MAX_DOMAIN_LEN]; /* Working area for getgrnam_r */
00441 #endif
00442 
00443 #ifdef _USE_NFSIDMAP
00444   int rc;
00445 
00446   if(gnamemap_get(*pgid, name) == ID_MAPPER_SUCCESS)
00447     {
00448       LogFullDebug(COMPONENT_IDMAPPER,
00449                    "gid2name: unamemap_get gid %d returned %s",
00450                    *pgid, name);
00451       return 1;
00452     }
00453   else
00454     {
00455       if(!nfsidmap_set_conf())
00456         {
00457           LogCrit(COMPONENT_IDMAPPER,
00458                   "gid2name: nfsidmap_set_conf failed");
00459           return 0;
00460         }
00461 
00462       rc = nfs4_gid_to_name(*pgid, idmap_domain, name, NFS4_MAX_DOMAIN_LEN);
00463       if(rc != 0)
00464         {
00465           LogDebug(COMPONENT_IDMAPPER,
00466                    "gid2name: nfs4_gid_to_name %d returned %d (%s)",
00467                    *pgid, -rc, strerror(-rc));
00468           return 0;
00469         }
00470 
00471       LogFullDebug(COMPONENT_IDMAPPER,
00472                    "gid2name: nfs4_gid_to_name gid %d returned %s",
00473                    *pgid, name);
00474 
00475       if(gidmap_add(name, *pgid) != ID_MAPPER_SUCCESS)
00476         {
00477           LogCrit(COMPONENT_IDMAPPER,
00478                   "gid2name: gidmap_add %s %d failed",
00479                   name, *pgid);
00480           return 0;
00481         }
00482     }
00483 
00484   return 1;
00485 
00486 #else
00487   if(gnamemap_get(*pgid, name) == ID_MAPPER_SUCCESS)
00488     {
00489       LogFullDebug(COMPONENT_IDMAPPER,
00490                    "gid2name: gnamemap_get gid %d returned %s",
00491                    *pgid, name);
00492       return 1;
00493     }
00494   else
00495     {
00496 #ifdef _SOLARIS
00497       if(getgrgid_r(*pgid, &g, buff, NFS4_MAX_DOMAIN_LEN) != 0)
00498 #else
00499       if((getgrgid_r(*pgid, &g, buff, NFS4_MAX_DOMAIN_LEN, &pg) != 0) ||
00500          (pg == NULL))
00501 #endif                          /* _SOLARIS */
00502         {
00503           LogFullDebug(COMPONENT_IDMAPPER,
00504                        "gid2name: getgrgid_r %d failed",
00505                        *pgid);
00506           return 0;
00507         }
00508 
00509       strncpy(name, g.gr_name, NFS4_MAX_DOMAIN_LEN);
00510 
00511       LogFullDebug(COMPONENT_IDMAPPER,
00512                    "gid2name: getgrgid_r gid %d returned %s",
00513                    *pgid, name);
00514 
00515       if(gidmap_add(name, *pgid) != ID_MAPPER_SUCCESS)
00516         {
00517           LogCrit(COMPONENT_IDMAPPER,
00518                   "gid2name: gidmap_add %s %d failed",
00519                   name, *pgid);
00520           return 0;
00521         }
00522     }
00523 
00524   return 1;
00525 #endif                          /* _USE_NFSIDMAP */
00526 }                               /* gid2name */
00527 
00540 int name2gid(char *name, gid_t * pgid)
00541 {
00542   gid_t gid;
00543 
00544   if(gidmap_get(name, (unsigned long *)&gid) == ID_MAPPER_SUCCESS)
00545     {
00546       LogFullDebug(COMPONENT_IDMAPPER,
00547                    "name2gid: gidmap_get mapped %s to gid= %d",
00548                    name, gid);
00549       *pgid = gid;
00550     }
00551   else
00552     {
00553 #ifdef _USE_NFSIDMAP
00554       int rc;
00555       if(!nfsidmap_set_conf())
00556         {
00557           LogCrit(COMPONENT_IDMAPPER,
00558                   "name2gid: nfsidmap_set_conf failed");
00559           return 0;
00560         }
00561 
00562       rc = nfs4_name_to_gid(name, pgid);
00563       if(rc)
00564         {
00565           LogFullDebug(COMPONENT_IDMAPPER,
00566                        "name2gid: nfs4_name_to_gid %s failed %d (%s)",
00567                        name, -rc, strerror(-rc));
00568           return 0;
00569         }
00570 
00571       LogFullDebug(COMPONENT_IDMAPPER,
00572                    "name2gid: nfs4_name_to_gid %s returned %d",
00573                    name, *pgid);
00574 
00575       if(gidmap_add(name, *pgid) != ID_MAPPER_SUCCESS)
00576         {
00577           LogCrit(COMPONENT_IDMAPPER,
00578                   "name2gid: gidmap_add %s %d failed",
00579                   name, *pgid);
00580           return 0;
00581         }
00582 
00583 #else
00584       struct group g;
00585       struct group *pg = NULL;
00586       static char buff[NFS4_MAX_DOMAIN_LEN]; /* Working area for getgrnam_r */
00587 
00588 #ifdef _SOLARIS
00589       if((pg = getgrnam_r(name, &g, buff, NFS4_MAX_DOMAIN_LEN)) == NULL)
00590 #else
00591       if(getgrnam_r(name, &g, buff, NFS4_MAX_DOMAIN_LEN, &pg) != 0)
00592 #endif
00593         {
00594           LogFullDebug(COMPONENT_IDMAPPER,
00595                        "name2gid: getgrnam_r %s failed",
00596                        name);
00597           *pgid = -1;
00598           return 0;
00599         }
00600       else if (pg != NULL)
00601         {
00602           *pgid = pg->gr_gid;
00603 
00604           if(gidmap_add(name, pg->gr_gid) != ID_MAPPER_SUCCESS)
00605             {
00606               LogCrit(COMPONENT_IDMAPPER,
00607                       "name2gid: gidmap_add %s %d failed",
00608                       name, pg->gr_gid);
00609               return 0;
00610             }
00611         }
00612       else
00613         {
00614           LogFullDebug(COMPONENT_IDMAPPER,
00615                        "name2gid: %s is unknown",
00616                        name);
00617           *pgid = -1;
00618           return 0;
00619         }
00620 #endif                          /* _USE_NFSIDMAP */
00621     }
00622   return 1;
00623 }                               /* name2gid */
00624 
00637 int uid2str(uid_t uid, char *str)
00638 {
00639   char buffer[NFS4_MAX_DOMAIN_LEN];
00640   uid_t local_uid = uid;
00641   int rc;
00642 
00643   if(uid2name(buffer, &local_uid) == 0)
00644     return -1;
00645 
00646 #ifndef _USE_NFSIDMAP
00647   rc = sprintf(str, "%s@%s", buffer, nfs_param.nfsv4_param.domainname);
00648 #else
00649   rc = sprintf(str, "%s", buffer);
00650 #endif
00651 
00652   LogDebug(COMPONENT_IDMAPPER,
00653            "uid2str %d returning %s",
00654            uid, str);
00655 
00656   return rc;
00657 }                               /* uid2utf8 */
00658 
00671 int gid2str(gid_t gid, char *str)
00672 {
00673   char buffer[NFS4_MAX_DOMAIN_LEN];
00674   gid_t local_gid = gid;
00675   int rc;
00676 
00677   if(gid2name(buffer, &local_gid) == 0)
00678     return -1;
00679 
00680 #ifndef _USE_NFSIDMAP
00681   rc = sprintf(str, "%s@%s", buffer, nfs_param.nfsv4_param.domainname);
00682 #else
00683   rc = sprintf(str, "%s", buffer);
00684 #endif
00685 
00686   LogDebug(COMPONENT_IDMAPPER,
00687            "gid2str %d returning %s",
00688            gid, str);
00689 
00690   return rc;
00691 }                               /* gid2str */
00692 
00705 int uid2utf8(uid_t uid, utf8string * utf8str)
00706 {
00707   char buff[NFS4_MAX_DOMAIN_LEN];
00708   unsigned int len = 0;
00709 
00710   if(uid2str(uid, buff) == -1)
00711     return -1;
00712 
00713   len = strlen(buff);
00714 
00715   /* A matching uid was found, now do the conversion to utf8 */
00716   if((utf8str->utf8string_val = gsh_malloc(len)) == NULL)
00717     return -1;
00718   else
00719     utf8str->utf8string_len = len;
00720 
00721   return str2utf8(buff, utf8str);
00722 
00723 }                               /* uid2utf8 */
00724 
00737 int gid2utf8(gid_t gid, utf8string * utf8str)
00738 {
00739   char buff[NFS4_MAX_DOMAIN_LEN];
00740   unsigned int len = 0;
00741 
00742   if(gid2str(gid, buff) == -1)
00743     return -1;
00744 
00745   len = strlen(buff);
00746 
00747   /* A matching gid was found */
00748   /* Do the conversion to uft8 format */
00749   if((utf8str->utf8string_val = gsh_malloc(len)) == NULL)
00750     return -1;
00751   else
00752     utf8str->utf8string_len = len;
00753 
00754   return str2utf8(buff, utf8str);
00755 }                               /* gid2utf8 */
00756 
00768 int utf82uid(utf8string * utf8str, uid_t * Uid)
00769 {
00770   char buff[2 * NFS4_MAX_DOMAIN_LEN];
00771   char uidname[NFS4_MAX_DOMAIN_LEN];
00772 #ifndef _USE_NFSIDMAP
00773   char domainname[NFS4_MAX_DOMAIN_LEN];
00774 #endif
00775   int  rc;
00776 
00777   if(utf8str->utf8string_len == 0)
00778     {
00779       *Uid = -1;                /* Nobody */
00780       LogCrit(COMPONENT_IDMAPPER,
00781               "utf82uid: empty user name");
00782       return -1;
00783     }
00784 
00785   utf82str(buff, sizeof(buff), utf8str);
00786 
00787 #ifndef _USE_NFSIDMAP
00788   /* User is shown as a string 'user@domain', remove it if libnfsidmap is not used */
00789   nfs4_stringid_split(buff, uidname, domainname);
00790 #else
00791   strncpy(uidname, buff, NFS4_MAX_DOMAIN_LEN);
00792 #endif
00793 
00794   rc = name2uid(uidname, Uid);
00795 
00796   if(rc == 0)
00797     {
00798       *Uid = -1;                /* Nobody */
00799       return -1;
00800     }
00801 
00802   LogDebug(COMPONENT_IDMAPPER,
00803            "utf82uid: Mapped %s to uid = %d",
00804            buff, *Uid);
00805 
00806   return 0;
00807 }                               /* utf82uid */
00808 
00820 int utf82gid(utf8string * utf8str, gid_t * Gid)
00821 {
00822   char buff[2 * NFS4_MAX_DOMAIN_LEN];
00823   char gidname[NFS4_MAX_DOMAIN_LEN];
00824 #ifndef _USE_NFSIDMAP
00825   char domainname[NFS4_MAX_DOMAIN_LEN];
00826 #endif
00827   int  rc;
00828 
00829   if(utf8str->utf8string_len == 0)
00830     {
00831       *Gid = -1;                /* Nobody */
00832       LogCrit(COMPONENT_IDMAPPER,
00833               "utf82gid: empty group name");
00834       return 0;
00835     }
00836 
00837   utf82str(buff, sizeof(buff), utf8str);
00838 
00839 #ifndef _USE_NFSIDMAP
00840   /* Group is shown as a string 'group@domain' , remove it if libnfsidmap is not used */
00841   nfs4_stringid_split(buff, gidname, domainname);
00842 #else
00843   strncpy(gidname, buff, NFS4_MAX_DOMAIN_LEN);
00844 #endif
00845 
00846   rc = name2gid(gidname, Gid);
00847 
00848   if(rc == 0)
00849     {
00850       *Gid = -1;                /* Nobody */
00851       return 0;
00852     }
00853 
00854   LogDebug(COMPONENT_IDMAPPER,
00855            "utf82gid: Mapped %s to gid = %d",
00856            buff, *Gid);
00857 
00858   return 0;
00859 }                               /* utf82gid */