nfs-ganesha 1.4
|
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 */