sss_nfs_client.c revision e9553c2961fa4f25b9d004a6a65b90837a13d8e1
842ae4bd224140319ae7feec1872b93dfd491143fielding/*
842ae4bd224140319ae7feec1872b93dfd491143fielding SSSD
842ae4bd224140319ae7feec1872b93dfd491143fielding
842ae4bd224140319ae7feec1872b93dfd491143fielding NFS Client
842ae4bd224140319ae7feec1872b93dfd491143fielding
842ae4bd224140319ae7feec1872b93dfd491143fielding Copyright (C) Noam Meltzer <noam@primarydata.com> 2013-2014
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse Copyright (C) Noam Meltzer <tsnoam@gmail.com> 2014-
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse This program is free software; you can redistribute it and/or modify
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd it under the terms of the GNU General Public License as published by
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd the Free Software Foundation; either version 3 of the License, or
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd (at your option) any later version.
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd This program is distributed in the hope that it will be useful,
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd but WITHOUT ANY WARRANTY; without even the implied warranty of
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd GNU General Public License for more details.
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd You should have received a copy of the GNU General Public License
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd along with this program. If not, see <http://www.gnu.org/licenses/>.
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd*/
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd#define _GNU_SOURCE
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse#include <stddef.h>
6ace32dacb8313226eb9019275d0e4fa45a15148rse#include <stdlib.h>
70535d6421eb979ac79d8f49d31cd94d75dd8b2fjorton#include <sys/types.h>
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse#include <errno.h>
a943533fd4d91d114af622731a405407990c4fb1rse#include <string.h>
67139e2d50d1e11558d87f7042f61cb04bb0d1d2jim
1660a5facf5797acb7aa1300f5ef86756a0bf493jorton#include <nfsidmap.h>
1660a5facf5797acb7aa1300f5ef86756a0bf493jorton#include "nfsidmap_internal.h"
a943533fd4d91d114af622731a405407990c4fb1rse
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse#include "sss_client/sss_cli.h"
c12917da693bae4028a1d5a5e8224bceed8c739dsf#include "sss_client/nss_mc.h"
c12917da693bae4028a1d5a5e8224bceed8c739dsf
c12917da693bae4028a1d5a5e8224bceed8c739dsf
c12917da693bae4028a1d5a5e8224bceed8c739dsf/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
c12917da693bae4028a1d5a5e8224bceed8c739dsf#define PLUGIN_NAME "sss_nfs"
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse#define CONF_SECTION "sss_nfs"
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse#define CONF_USE_MC "memcache"
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse#define REPLY_ID_OFFSET (8)
7933d4a963def02417113b6798d87a36395053b0rse#define REPLY_NAME_OFFSET (REPLY_ID_OFFSET + 8)
7933d4a963def02417113b6798d87a36395053b0rse#define BUF_LEN (4096)
71c00f988beb28388702e14cb7fe06f08bd792bbdougm#define USE_MC_DEFAULT true
71c00f988beb28388702e14cb7fe06f08bd792bbdougm
71c00f988beb28388702e14cb7fe06f08bd792bbdougm
7933d4a963def02417113b6798d87a36395053b0rse/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
71c00f988beb28388702e14cb7fe06f08bd792bbdougmstatic char sss_nfs_plugin_name[] = PLUGIN_NAME;
71c00f988beb28388702e14cb7fe06f08bd792bbdougmstatic char nfs_conf_sect[] = CONF_SECTION;
71c00f988beb28388702e14cb7fe06f08bd792bbdougmstatic char nfs_conf_use_mc[] = CONF_USE_MC;
7933d4a963def02417113b6798d87a36395053b0rse
71c00f988beb28388702e14cb7fe06f08bd792bbdougmstatic bool nfs_use_mc = USE_MC_DEFAULT;
71c00f988beb28388702e14cb7fe06f08bd792bbdougm
71c00f988beb28388702e14cb7fe06f08bd792bbdougm
7933d4a963def02417113b6798d87a36395053b0rse/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
7933d4a963def02417113b6798d87a36395053b0rse/* Forward declarations */
d1bb6e2664788e0437acc18e877562c9a796d7cersestatic int send_recv(uint8_t **repp, size_t *rep_lenp, enum sss_cli_command cmd,
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse const void *req, size_t req_len);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrsestatic int reply_to_id(id_t *idp, uint8_t *rep, size_t rep_len);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrsestatic int reply_to_name(char *name, size_t len, uint8_t *rep, size_t rep_len);
7933d4a963def02417113b6798d87a36395053b0rse
7933d4a963def02417113b6798d87a36395053b0rse
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg/* get from memcache functions */
7933d4a963def02417113b6798d87a36395053b0rsestatic int get_uid_from_mc(id_t *uid, const char *name)
7933d4a963def02417113b6798d87a36395053b0rse{
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg int rc = 0;
53c239bee62c6d55b5ddfba5d99376d4c8de924ejwoolley struct passwd pwd;
7933d4a963def02417113b6798d87a36395053b0rse char *buf = NULL;
7933d4a963def02417113b6798d87a36395053b0rse char *p = NULL;
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg size_t buflen = 0;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse size_t len = 0;
7933d4a963def02417113b6798d87a36395053b0rse
7933d4a963def02417113b6798d87a36395053b0rse if (!nfs_use_mc) {
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg return -1;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse }
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse sss_strnlen(name, SSS_NAME_MAX, &len);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse
e726f34f8da08c01ee8bc90904b26196b69c8587wrowe do {
7933d4a963def02417113b6798d87a36395053b0rse buflen += BUF_LEN;
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg if ((p = realloc(buf, buflen)) == NULL) {
e9eabac76b50e8f00d0c391f6070d0f42db77aa2wrowe rc = ENOMEM;
e9eabac76b50e8f00d0c391f6070d0f42db77aa2wrowe goto done;
e9eabac76b50e8f00d0c391f6070d0f42db77aa2wrowe }
7933d4a963def02417113b6798d87a36395053b0rse buf = p;
7933d4a963def02417113b6798d87a36395053b0rse rc = sss_nss_mc_getpwnam(name, len, &pwd, buf, buflen);
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg } while (rc == ERANGE);
7933d4a963def02417113b6798d87a36395053b0rse
7933d4a963def02417113b6798d87a36395053b0rse if (rc == 0) {
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg IDMAP_LOG(1, ("found user %s in memcache", name));
7933d4a963def02417113b6798d87a36395053b0rse *uid = pwd.pw_uid;
7933d4a963def02417113b6798d87a36395053b0rse } else {
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg IDMAP_LOG(1, ("user %s not in memcache", name));
7933d4a963def02417113b6798d87a36395053b0rse }
7933d4a963def02417113b6798d87a36395053b0rse
7988a91d9a1c6413f2c1a2138847f513d20de856fuankgdone:
176c2742db03fcb7b7d13e6408dd967d87e542e9ben free(buf);
e0c3fda9f782aee1140d83fbce32672ac299f2a4ben return rc;
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg}
7a4e3510f3516132ff057ac986fd6350164b7950kbrand
7a4e3510f3516132ff057ac986fd6350164b7950kbrandstatic int get_gid_from_mc(id_t *gid, const char *name)
7a4e3510f3516132ff057ac986fd6350164b7950kbrand{
7a4e3510f3516132ff057ac986fd6350164b7950kbrand int rc = 0;
7a4e3510f3516132ff057ac986fd6350164b7950kbrand struct group grp;
7933d4a963def02417113b6798d87a36395053b0rse char *buf = NULL;
7933d4a963def02417113b6798d87a36395053b0rse char *p = NULL;
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg size_t buflen = 0;
7933d4a963def02417113b6798d87a36395053b0rse size_t len;
7933d4a963def02417113b6798d87a36395053b0rse
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg if (!nfs_use_mc) {
e335319a08e12eb7daff9afa80e985dc53f652b8jorton return -1;
e335319a08e12eb7daff9afa80e985dc53f652b8jorton }
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg
e335319a08e12eb7daff9afa80e985dc53f652b8jorton sss_strnlen(name, SSS_NAME_MAX, &len);
e335319a08e12eb7daff9afa80e985dc53f652b8jorton
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg do {
7933d4a963def02417113b6798d87a36395053b0rse buflen += BUF_LEN;
7933d4a963def02417113b6798d87a36395053b0rse if ((p = realloc(buf, buflen)) == NULL) {
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg rc = ENOMEM;
7933d4a963def02417113b6798d87a36395053b0rse goto done;
7933d4a963def02417113b6798d87a36395053b0rse }
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg buf = p;
77504f17963a8dd941a921d9ddfa25ddb0f348d6kbrand rc = sss_nss_mc_getgrnam(name, len, &grp, buf, buflen);
77504f17963a8dd941a921d9ddfa25ddb0f348d6kbrand } while (rc == ERANGE);
7933d4a963def02417113b6798d87a36395053b0rse
7933d4a963def02417113b6798d87a36395053b0rse if (rc == 0) {
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg IDMAP_LOG(1, ("found group %s in memcache", name));
7933d4a963def02417113b6798d87a36395053b0rse *gid = grp.gr_gid;
7933d4a963def02417113b6798d87a36395053b0rse } else {
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg IDMAP_LOG(1, ("group %s not in memcache", name));
7933d4a963def02417113b6798d87a36395053b0rse }
7933d4a963def02417113b6798d87a36395053b0rse
7988a91d9a1c6413f2c1a2138847f513d20de856fuankgdone:
a1de5cf47c9ccfbf493264e8a3fa7ddd5a9c80d1kbrand free(buf);
1fd6337111a9607570691e38857dcece7fb84abekbrand return rc;
a1de5cf47c9ccfbf493264e8a3fa7ddd5a9c80d1kbrand}
1fd6337111a9607570691e38857dcece7fb84abekbrand
a1de5cf47c9ccfbf493264e8a3fa7ddd5a9c80d1kbrandstatic int get_user_from_mc(char *name, size_t len, uid_t uid)
1fd6337111a9607570691e38857dcece7fb84abekbrand{
1fd6337111a9607570691e38857dcece7fb84abekbrand int rc;
1fd6337111a9607570691e38857dcece7fb84abekbrand struct passwd pwd;
7efe7de73c89c26518714a504359244d03cfbbc5jorton char *buf = NULL;
7efe7de73c89c26518714a504359244d03cfbbc5jorton char *p = NULL;
d9b079a6dd66d36313be56f859c8c61153146527sf size_t buflen = 0;
807c436563a054c3513648163fd2e36612b68c9atrawick size_t pw_name_len;
d9b079a6dd66d36313be56f859c8c61153146527sf
2b4e45d87889ab2f6b432690cc993a42bc607fafjorton if (!nfs_use_mc) {
2b4e45d87889ab2f6b432690cc993a42bc607fafjorton return -1;
f84d3d83a741c21154d42e0ebdec9b9b37efeedcjorton }
43c3e6a4b559b76b750c245ee95e2782c15b4296jim
e3715027f352040ef98da03359b00f13ddb506cbrpluem do {
e3715027f352040ef98da03359b00f13ddb506cbrpluem buflen += BUF_LEN;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse if ((p = realloc(buf, buflen)) == NULL) {
ac0c8366f49659958162b4bfb3d625a77343eda3kbrand rc = ENOMEM;
099c357f282d4aebf2b32264f7dce6ffc0497c37sf goto done;
099c357f282d4aebf2b32264f7dce6ffc0497c37sf }
099c357f282d4aebf2b32264f7dce6ffc0497c37sf buf = p;
099c357f282d4aebf2b32264f7dce6ffc0497c37sf rc = sss_nss_mc_getpwuid(uid, &pwd, buf, BUF_LEN);
099c357f282d4aebf2b32264f7dce6ffc0497c37sf } while (rc == ERANGE);
099c357f282d4aebf2b32264f7dce6ffc0497c37sf
099c357f282d4aebf2b32264f7dce6ffc0497c37sf if (rc == 0) {
099c357f282d4aebf2b32264f7dce6ffc0497c37sf pw_name_len = strlen(pwd.pw_name) + 1;
e8f95a682820a599fe41b22977010636be5c2717jim if (pw_name_len > len) {
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse IDMAP_LOG(0, ("%s: reply too long; pw_name_len=%lu, len=%lu",
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse __func__, pw_name_len, len));
cde1010d880fb6230f80c9d697842ea0b1cb79c7dougm rc = ENOBUFS;
cde1010d880fb6230f80c9d697842ea0b1cb79c7dougm }
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg IDMAP_LOG(1, ("found uid %i in memcache", uid));
7933d4a963def02417113b6798d87a36395053b0rse memcpy(name, pwd.pw_name, pw_name_len);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse } else {
1fd6337111a9607570691e38857dcece7fb84abekbrand IDMAP_LOG(1, ("uid %i not in memcache", uid));
7933d4a963def02417113b6798d87a36395053b0rse }
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse
7988a91d9a1c6413f2c1a2138847f513d20de856fuankgdone:
8fdc55d1624c714391fe1f93ebafe98ace427f4adougm free(buf);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse return rc;
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg}
7933d4a963def02417113b6798d87a36395053b0rse
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrsestatic int get_group_from_mc(char *name, size_t len, id_t gid)
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg{
7933d4a963def02417113b6798d87a36395053b0rse int rc;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse struct group grp;
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg char *buf = NULL;
7933d4a963def02417113b6798d87a36395053b0rse char *p = NULL;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse size_t buflen = 0;
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg size_t gr_name_len;
a72de14bfdbf0be9d935be9bdc2df631ca5e032bdougm
a72de14bfdbf0be9d935be9bdc2df631ca5e032bdougm if (!nfs_use_mc) {
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg return -1;
a72de14bfdbf0be9d935be9bdc2df631ca5e032bdougm }
a72de14bfdbf0be9d935be9bdc2df631ca5e032bdougm
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg do {
77504f17963a8dd941a921d9ddfa25ddb0f348d6kbrand buflen += BUF_LEN;
77504f17963a8dd941a921d9ddfa25ddb0f348d6kbrand if ((p = realloc(buf, buflen)) == NULL) {
7933d4a963def02417113b6798d87a36395053b0rse rc = ENOMEM;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse goto done;
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg }
7933d4a963def02417113b6798d87a36395053b0rse buf = p;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse rc = sss_nss_mc_getgrgid(gid, &grp, buf, BUF_LEN);
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg } while (rc == ERANGE);
44985e4f931d3a75a7e5108705010cc21605ee34druggeri
44985e4f931d3a75a7e5108705010cc21605ee34druggeri if (rc == 0) {
44985e4f931d3a75a7e5108705010cc21605ee34druggeri gr_name_len = strlen(grp.gr_name) + 1;
44985e4f931d3a75a7e5108705010cc21605ee34druggeri if (gr_name_len > len) {
8f2700898323915da289644dc1f3ee11a5e5b4earpluem IDMAP_LOG(0, ("%s: reply too long; gr_name_len=%lu, len=%lu",
d58a822aff1dfda25384d3d009f88f1883c95436kbrand __func__, gr_name_len, len));
8f2700898323915da289644dc1f3ee11a5e5b4earpluem rc = ENOBUFS;
d58a822aff1dfda25384d3d009f88f1883c95436kbrand }
d58a822aff1dfda25384d3d009f88f1883c95436kbrand IDMAP_LOG(1, ("found gid %i in memcache", gid));
d58a822aff1dfda25384d3d009f88f1883c95436kbrand memcpy(name, grp.gr_name, gr_name_len);
d58a822aff1dfda25384d3d009f88f1883c95436kbrand } else {
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse IDMAP_LOG(1, ("gid %i not in memcache", gid));
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse }
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrsedone:
7933d4a963def02417113b6798d87a36395053b0rse free(buf);
0839d91ee551a0e19ea9577bb00976b97308dfddmartin return rc;
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg}
7933d4a963def02417113b6798d87a36395053b0rse
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrsestatic int name_to_id(const char *name, id_t *id, enum sss_cli_command cmd)
7933d4a963def02417113b6798d87a36395053b0rse{
0839d91ee551a0e19ea9577bb00976b97308dfddmartin int rc;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse uint8_t *rep = NULL;
509111f5f58a9effd4c832f6a0cbd6ad9d549188jorton size_t rep_len = 0;
509111f5f58a9effd4c832f6a0cbd6ad9d549188jorton size_t name_len;
509111f5f58a9effd4c832f6a0cbd6ad9d549188jorton
509111f5f58a9effd4c832f6a0cbd6ad9d549188jorton sss_strnlen(name, SSS_NAME_MAX, &name_len);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse
39c7699ec0799d394d3f67145d4a12ed82f587b8jorton rc = send_recv(&rep, &rep_len, cmd, name, name_len + 1);
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg if (rc == 0) {
39c7699ec0799d394d3f67145d4a12ed82f587b8jorton rc = reply_to_id(id, rep, rep_len);
39c7699ec0799d394d3f67145d4a12ed82f587b8jorton }
39c7699ec0799d394d3f67145d4a12ed82f587b8jorton
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg free(rep);
a2558ec3af4391b7da7fe61e1e53383bbd0174b9jorton
a2558ec3af4391b7da7fe61e1e53383bbd0174b9jorton return rc;
a2558ec3af4391b7da7fe61e1e53383bbd0174b9jorton}
a2558ec3af4391b7da7fe61e1e53383bbd0174b9jorton
a2558ec3af4391b7da7fe61e1e53383bbd0174b9jortonstatic int id_to_name(char *name, size_t len, id_t id,
a2558ec3af4391b7da7fe61e1e53383bbd0174b9jorton enum sss_cli_command cmd)
39c7699ec0799d394d3f67145d4a12ed82f587b8jorton{
89b8bbc89404e7071e573c4f0a17f528996e855djorton int rc;
89b8bbc89404e7071e573c4f0a17f528996e855djorton size_t rep_len = 0;
89b8bbc89404e7071e573c4f0a17f528996e855djorton size_t req_len = sizeof(id_t);
89b8bbc89404e7071e573c4f0a17f528996e855djorton uint8_t *rep = NULL;
89b8bbc89404e7071e573c4f0a17f528996e855djorton uint8_t req[req_len];
89b8bbc89404e7071e573c4f0a17f528996e855djorton
89b8bbc89404e7071e573c4f0a17f528996e855djorton memcpy(req, &id, req_len);
89b8bbc89404e7071e573c4f0a17f528996e855djorton rc = send_recv(&rep, &rep_len, cmd, &req, req_len);
89b8bbc89404e7071e573c4f0a17f528996e855djorton if (rc == 0) {
89b8bbc89404e7071e573c4f0a17f528996e855djorton rc = reply_to_name(name, len, rep, rep_len);
89b8bbc89404e7071e573c4f0a17f528996e855djorton }
89b8bbc89404e7071e573c4f0a17f528996e855djorton
89b8bbc89404e7071e573c4f0a17f528996e855djorton free(rep);
89b8bbc89404e7071e573c4f0a17f528996e855djorton
89b8bbc89404e7071e573c4f0a17f528996e855djorton return rc;
89b8bbc89404e7071e573c4f0a17f528996e855djorton}
89b8bbc89404e7071e573c4f0a17f528996e855djorton
89b8bbc89404e7071e573c4f0a17f528996e855djorton/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
89b8bbc89404e7071e573c4f0a17f528996e855djortonstatic int send_recv(uint8_t **rep, size_t *rep_len, enum sss_cli_command cmd,
11e076839c8d5a82d55e710194d0daac51390dbdsf const void *req, size_t req_len)
89b8bbc89404e7071e573c4f0a17f528996e855djorton{
89b8bbc89404e7071e573c4f0a17f528996e855djorton int err = 0;
11e076839c8d5a82d55e710194d0daac51390dbdsf enum nss_status req_rc;
89b8bbc89404e7071e573c4f0a17f528996e855djorton struct sss_cli_req_data rd;
89b8bbc89404e7071e573c4f0a17f528996e855djorton
89b8bbc89404e7071e573c4f0a17f528996e855djorton rd.data = req;
89b8bbc89404e7071e573c4f0a17f528996e855djorton rd.len = req_len;
89b8bbc89404e7071e573c4f0a17f528996e855djorton
89b8bbc89404e7071e573c4f0a17f528996e855djorton sss_nss_lock();
1366443dc565c33e7b449ae428bbfc4c86f33935drh req_rc = sss_nss_make_request(cmd, &rd, rep, rep_len, &err);
1366443dc565c33e7b449ae428bbfc4c86f33935drh sss_nss_unlock();
1cb35ac84e3ff37ec77837d1e3702a74604ab6f0fuankg
1366443dc565c33e7b449ae428bbfc4c86f33935drh if (req_rc == NSS_STATUS_NOTFOUND) {
1366443dc565c33e7b449ae428bbfc4c86f33935drh return ENOENT;
e6e65585927961caf45d4e9e932bb1f4e9e89ca1jerenkrantz }
e8f95a682820a599fe41b22977010636be5c2717jim if (req_rc != NSS_STATUS_SUCCESS) {
e6e65585927961caf45d4e9e932bb1f4e9e89ca1jerenkrantz IDMAP_LOG(0, ("no-make-request; err=%i", err));
e8f95a682820a599fe41b22977010636be5c2717jim return EPIPE;
e6e65585927961caf45d4e9e932bb1f4e9e89ca1jerenkrantz }
e8f95a682820a599fe41b22977010636be5c2717jim
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse return 0;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse}
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse
7933d4a963def02417113b6798d87a36395053b0rsestatic int reply_to_id(id_t *idp, uint8_t *rep, size_t rep_len)
7933d4a963def02417113b6798d87a36395053b0rse{
7933d4a963def02417113b6798d87a36395053b0rse int rc = 0;
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe id_t id;
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe uint32_t num_results = 0;
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe if (rep_len < sizeof(uint32_t)) {
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe IDMAP_LOG(0, ("%s: reply too small; rep_len=%lu", __func__, rep_len));
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe rc = EBADMSG;
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe goto done;
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe }
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe SAFEALIGN_COPY_UINT32(&num_results, rep, NULL);
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe if (num_results > 1) {
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe IDMAP_LOG(0, ("%s: too many results (%lu)", __func__, num_results));
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe rc = EBADMSG;
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe goto done;
239dd0cf663713025d4451ddd465685021007d82wrowe }
aafba4d7e3ecc7fcaa87efa8d7fae3e700d2428bdrh if (num_results == 0) {
aafba4d7e3ecc7fcaa87efa8d7fae3e700d2428bdrh rc = ENOENT;
aafba4d7e3ecc7fcaa87efa8d7fae3e700d2428bdrh goto done;
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe }
aafba4d7e3ecc7fcaa87efa8d7fae3e700d2428bdrh if (rep_len < sizeof(uint32_t) + REPLY_ID_OFFSET) {
56bd16e394f49423a22aa82643eb27f26db2c748jorton IDMAP_LOG(0, ("%s: reply too small(2); rep_len=%lu", __func__,
56bd16e394f49423a22aa82643eb27f26db2c748jorton rep_len));
56bd16e394f49423a22aa82643eb27f26db2c748jorton rc = EBADMSG;
56bd16e394f49423a22aa82643eb27f26db2c748jorton goto done;
56bd16e394f49423a22aa82643eb27f26db2c748jorton }
a73ec375db18806018eabc968baa85b250bbbf5djorton
a73ec375db18806018eabc968baa85b250bbbf5djorton SAFEALIGN_COPY_UINT32(&id, rep + REPLY_ID_OFFSET, NULL);
a73ec375db18806018eabc968baa85b250bbbf5djorton *idp = id;
a73ec375db18806018eabc968baa85b250bbbf5djorton
a73ec375db18806018eabc968baa85b250bbbf5djortondone:
a73ec375db18806018eabc968baa85b250bbbf5djorton return rc;
e8f95a682820a599fe41b22977010636be5c2717jim}
e8f95a682820a599fe41b22977010636be5c2717jim
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowestatic int reply_to_name(char *name, size_t len, uint8_t *rep, size_t rep_len)
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe{
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe int rc = 0;
239dd0cf663713025d4451ddd465685021007d82wrowe uint32_t num_results = 0;
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe const char *buf;
d1bb6e2664788e0437acc18e877562c9a796d7cerse size_t buf_len;
71c00f988beb28388702e14cb7fe06f08bd792bbdougm size_t offset;
71c00f988beb28388702e14cb7fe06f08bd792bbdougm
71c00f988beb28388702e14cb7fe06f08bd792bbdougm if (rep_len < sizeof(uint32_t)) {
7933d4a963def02417113b6798d87a36395053b0rse IDMAP_LOG(0, ("%s: reply too small; rep_len=%lu", __func__, rep_len));
c12917da693bae4028a1d5a5e8224bceed8c739dsf rc = EBADMSG;
c12917da693bae4028a1d5a5e8224bceed8c739dsf goto done;
c12917da693bae4028a1d5a5e8224bceed8c739dsf }
c12917da693bae4028a1d5a5e8224bceed8c739dsf
c12917da693bae4028a1d5a5e8224bceed8c739dsf SAFEALIGN_COPY_UINT32(&num_results, rep, NULL);
e8f95a682820a599fe41b22977010636be5c2717jim if (num_results > 1) {
b5451913a64155af2eab4f12ecbaf16e15acafc3wrowe IDMAP_LOG(0, ("%s: too many results (%lu)", __func__, num_results));
b5451913a64155af2eab4f12ecbaf16e15acafc3wrowe rc = EBADMSG;
8aced0b621ea45e8621c7073b0bfbe5ea91c2329wrowe goto done;
b5451913a64155af2eab4f12ecbaf16e15acafc3wrowe }
93350a0dfa22a2c523cdcbad3357327013ecc145martin if (num_results == 0) {
2c038bf2465bf2150c396f4e67f68ebc5bb9e6e9wrowe rc = ENOENT;
b5451913a64155af2eab4f12ecbaf16e15acafc3wrowe goto done;
b5451913a64155af2eab4f12ecbaf16e15acafc3wrowe }
b5451913a64155af2eab4f12ecbaf16e15acafc3wrowe if (rep_len < sizeof(uint32_t) + REPLY_NAME_OFFSET) {
8a5120efd60acf0323371cb30cba489723b03819jorton IDMAP_LOG(0, ("%s: reply too small(2); rep_len=%lu", __func__,
b5451913a64155af2eab4f12ecbaf16e15acafc3wrowe rep_len));
8aced0b621ea45e8621c7073b0bfbe5ea91c2329wrowe rc = EBADMSG;
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe goto done;
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe }
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe buf = (const char *)(rep + REPLY_NAME_OFFSET);
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe buf_len = rep_len - REPLY_NAME_OFFSET;
2b7078b0c4fd5b6054f6f2d4f626177844f5c6f7wrowe offset = 0;
af5dd1c93d2185f7e37f8783c593b64fd35ea8a6wrowe rc = sss_readrep_copy_string(buf, &offset, &buf_len, &len, &name, NULL);
af5dd1c93d2185f7e37f8783c593b64fd35ea8a6wrowe if (rc != 0) {
8dc154408549195c828b823e9dc7396f107f2512jorton rc = -rc;
8dc154408549195c828b823e9dc7396f107f2512jorton }
b79b480213d7452db127eec054e52eb2b4fa6153wrowe
417f504d4d11631c0d062be85347f82a26c88677aarondone:
11f2c481e1d57bedb3f758565307501e9a2730ddtrawick return rc;
2792780a6fb0951dc304b940ba9274ed1e37fe26wrowe}
11f2c481e1d57bedb3f758565307501e9a2730ddtrawick
2792780a6fb0951dc304b940ba9274ed1e37fe26wrowe/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
11f2c481e1d57bedb3f758565307501e9a2730ddtrawick/* configuration parsing aids */
11f2c481e1d57bedb3f758565307501e9a2730ddtrawickstatic bool str_equal(const char *s1, const char *s2)
417f504d4d11631c0d062be85347f82a26c88677aaron{
7933d4a963def02417113b6798d87a36395053b0rse bool res = false;
7933d4a963def02417113b6798d87a36395053b0rse size_t len1;
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm size_t len2;
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm len1 = strlen(s1);
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm len2 = strlen(s2);
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm if (len1 == len2) {
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm res = (strncasecmp(s1, s2, len1) == 0);
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm }
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm return res;
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem}
2ce2fc3287632e20f1b8759aa17e571f68c6fe6dsf
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluemstatic int nfs_conf_get_bool(char *sect, char *attr, int def)
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm{
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm int res;
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm char *val;
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm res = def;
73c7bbd51ac1420b4bb98d1c8b3cc97d57f21c56jorton val = conf_get_str(sect, attr);
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm if (val) {
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem res = (str_equal("1", val) ||
cde1010d880fb6230f80c9d697842ea0b1cb79c7dougm str_equal("yes", val) ||
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm str_equal("true", val) ||
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem str_equal("on", val));
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm }
cde1010d880fb6230f80c9d697842ea0b1cb79c7dougm
185aa71728867671e105178b4c66fbc22b65ae26sf return res;
2261f694ce2fc09f9df6c65bd8e1f4230313696bjorton}
2261f694ce2fc09f9df6c65bd8e1f4230313696bjorton
cde1010d880fb6230f80c9d697842ea0b1cb79c7dougm
cde1010d880fb6230f80c9d697842ea0b1cb79c7dougm/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
cde1010d880fb6230f80c9d697842ea0b1cb79c7dougm/* libnfsidmap return-code aids */
cde1010d880fb6230f80c9d697842ea0b1cb79c7dougm
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm/*
621bd763d2e4d32f19013ac8b76b375b5a01851fdougm * we only want to return 0 or ENOENT; otherwise libnfsidmap will stop
621bd763d2e4d32f19013ac8b76b375b5a01851fdougm * translation instead of proceeding to the next translation plugin
621bd763d2e4d32f19013ac8b76b375b5a01851fdougm */
621bd763d2e4d32f19013ac8b76b375b5a01851fdougmint normalise_rc(int rc) {
621bd763d2e4d32f19013ac8b76b375b5a01851fdougm int res;
73c7bbd51ac1420b4bb98d1c8b3cc97d57f21c56jorton
621bd763d2e4d32f19013ac8b76b375b5a01851fdougm res = rc;
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem if (res != 0 && res != ENOENT) {
621bd763d2e4d32f19013ac8b76b375b5a01851fdougm res = ENOENT;
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem }
621bd763d2e4d32f19013ac8b76b375b5a01851fdougm
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem return res;
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem}
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem/* log the actual rc from our code (to be used before normalising the rc) */
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluemvoid log_actual_rc(const char *trans_name, int rc) {
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem char tmp[80];
ccbf65bf19ac58a396133923aee4597e0870ec47bnicholes IDMAP_LOG(1, ("%s: rc=%i msg=%s", trans_name, rc,
621bd763d2e4d32f19013ac8b76b375b5a01851fdougm strerror_r(rc, tmp, sizeof(tmp))));
621bd763d2e4d32f19013ac8b76b375b5a01851fdougm}
621bd763d2e4d32f19013ac8b76b375b5a01851fdougm
621bd763d2e4d32f19013ac8b76b375b5a01851fdougm
621bd763d2e4d32f19013ac8b76b375b5a01851fdougm/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
621bd763d2e4d32f19013ac8b76b375b5a01851fdougm/* The external interface */
9cb81d96f6b556cec1aa456191f43f7932aabaaedougmstatic int sss_nfs_init(void)
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm{
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm nfs_use_mc = nfs_conf_get_bool(nfs_conf_sect, nfs_conf_use_mc,
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm USE_MC_DEFAULT);
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton IDMAP_LOG(1, ("%s: use memcache: %i", __func__, nfs_use_mc));
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton return 0;
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton}
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton
8a2483ae14c7d9c1ee21a92e4251202456af5747jortonstatic int sss_nfs_princ_to_ids(char *secname, char *princ, uid_t *uid,
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton gid_t *gid, extra_mapping_params **ex)
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton{
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton IDMAP_LOG(0, ("%s: not implemented", __func__));
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton return -ENOENT;
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton}
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton
8a2483ae14c7d9c1ee21a92e4251202456af5747jortonstatic int sss_nfs_name_to_uid(char *name, uid_t *uid)
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton{
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton int rc;
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton size_t name_len = 0;
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton if (name == NULL) {
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton IDMAP_LOG(0, ("%s: name is null", __func__));
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton return -EINVAL;
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton }
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton if (uid == NULL) {
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton IDMAP_LOG(0, ("%s: uid is null", __func__));
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton return -EINVAL;
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton }
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton rc = sss_strnlen(name, SSS_NAME_MAX, &name_len);
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton if (rc != 0) {
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton IDMAP_LOG(0, ("%s: no-strnlen; rc=%i", __func__, rc));
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton return -rc;
8a2483ae14c7d9c1ee21a92e4251202456af5747jorton }
4ede070ca63bd4c48045e35a7192582769770290jorton
7933d4a963def02417113b6798d87a36395053b0rse rc = get_uid_from_mc(uid, name);
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem if (rc != 0) {
a943533fd4d91d114af622731a405407990c4fb1rse rc = name_to_id(name, uid, SSS_NSS_GETPWNAM);
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm }
469549ac22c6f7b9ecdd9df2565925563e4df84djwoolley
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm log_actual_rc(__func__, rc);
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem rc = normalise_rc(rc);
a943533fd4d91d114af622731a405407990c4fb1rse
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm return -rc;
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm}
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluemstatic int sss_nfs_name_to_gid(char *name, gid_t *gid)
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem{
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem int rc;
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem size_t name_len = 0;
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem if (name == NULL) {
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem IDMAP_LOG(0, ("%s: name is null", __func__));
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm return -EINVAL;
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm }
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm if (gid == NULL) {
a943533fd4d91d114af622731a405407990c4fb1rse IDMAP_LOG(0, ("%s: gid is null", __func__));
a943533fd4d91d114af622731a405407990c4fb1rse return -EINVAL;
a943533fd4d91d114af622731a405407990c4fb1rse }
a943533fd4d91d114af622731a405407990c4fb1rse
a943533fd4d91d114af622731a405407990c4fb1rse rc = sss_strnlen(name, SSS_NAME_MAX, &name_len);
9cb81d96f6b556cec1aa456191f43f7932aabaaedougm if (rc != 0) {
185aa71728867671e105178b4c66fbc22b65ae26sf IDMAP_LOG(0, ("%s: no-strnlen; rc=%i", __func__, rc));
2261f694ce2fc09f9df6c65bd8e1f4230313696bjorton return -rc;
2261f694ce2fc09f9df6c65bd8e1f4230313696bjorton }
baa6746bc66ff1daa1852a3a085906d2dfa96bb6sf
71c00f988beb28388702e14cb7fe06f08bd792bbdougm rc = get_gid_from_mc(gid, name);
a943533fd4d91d114af622731a405407990c4fb1rse if (rc != 0) {
71c00f988beb28388702e14cb7fe06f08bd792bbdougm rc = name_to_id(name, gid, SSS_NSS_GETGRNAM);
a943533fd4d91d114af622731a405407990c4fb1rse }
a943533fd4d91d114af622731a405407990c4fb1rse
6d7efb8c76b56eaebd6032096771c9e44b247f3fdougm log_actual_rc(__func__, rc);
f4c472b8dce3c2e559232dbb5b27ed2466922ea4jerenkrantz rc = normalise_rc(rc);
f4c472b8dce3c2e559232dbb5b27ed2466922ea4jerenkrantz
469549ac22c6f7b9ecdd9df2565925563e4df84djwoolley return -rc;
469549ac22c6f7b9ecdd9df2565925563e4df84djwoolley}
d0ba3b97557d47323bd055fb4002ed7692f703b9jerenkrantz
71c00f988beb28388702e14cb7fe06f08bd792bbdougmstatic int sss_nfs_uid_to_name(uid_t uid, char *domain, char *name, size_t len)
185aa71728867671e105178b4c66fbc22b65ae26sf{
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg int rc;
baa6746bc66ff1daa1852a3a085906d2dfa96bb6sf
71c00f988beb28388702e14cb7fe06f08bd792bbdougm if (name == NULL) {
a943533fd4d91d114af622731a405407990c4fb1rse IDMAP_LOG(0, ("%s: name is null", __func__));
71c00f988beb28388702e14cb7fe06f08bd792bbdougm return -EINVAL;
a943533fd4d91d114af622731a405407990c4fb1rse }
a943533fd4d91d114af622731a405407990c4fb1rse
71c00f988beb28388702e14cb7fe06f08bd792bbdougm rc = get_user_from_mc(name, len, uid);
a943533fd4d91d114af622731a405407990c4fb1rse if (rc != 0) {
d28d7091912b3d911bdbe18df2d37d315681054bdougm rc = id_to_name(name, len, uid, SSS_NSS_GETPWUID);
a943533fd4d91d114af622731a405407990c4fb1rse }
931b4fd1cc9dd3da096c45f4bf7ddcc14e0985c1dougm
a943533fd4d91d114af622731a405407990c4fb1rse log_actual_rc(__func__, rc);
a943533fd4d91d114af622731a405407990c4fb1rse rc = normalise_rc(rc);
a943533fd4d91d114af622731a405407990c4fb1rse
4ede070ca63bd4c48045e35a7192582769770290jorton return -rc;
a943533fd4d91d114af622731a405407990c4fb1rse}
a943533fd4d91d114af622731a405407990c4fb1rse
7933d4a963def02417113b6798d87a36395053b0rsestatic int sss_nfs_gid_to_name(gid_t gid, char *domain, char *name, size_t len)
7933d4a963def02417113b6798d87a36395053b0rse{
7b6ba9c468f26bdb3492d5e8cb79628a3b04e8c8wrowe int rc;
7933d4a963def02417113b6798d87a36395053b0rse
a943533fd4d91d114af622731a405407990c4fb1rse if (name == NULL) {
a943533fd4d91d114af622731a405407990c4fb1rse IDMAP_LOG(0, ("%s: name is null", __func__));
2f32a3d146dc55d81b31660386e17c3b83ad61b8bnicholes return -EINVAL;
a943533fd4d91d114af622731a405407990c4fb1rse }
71c00f988beb28388702e14cb7fe06f08bd792bbdougm
a943533fd4d91d114af622731a405407990c4fb1rse rc = get_group_from_mc(name, len, gid);
a943533fd4d91d114af622731a405407990c4fb1rse if (rc != 0) {
7933d4a963def02417113b6798d87a36395053b0rse rc = id_to_name(name, len, gid, SSS_NSS_GETGRGID);
7933d4a963def02417113b6798d87a36395053b0rse }
71c00f988beb28388702e14cb7fe06f08bd792bbdougm
7933d4a963def02417113b6798d87a36395053b0rse log_actual_rc(__func__, rc);
a943533fd4d91d114af622731a405407990c4fb1rse rc = normalise_rc(rc);
a943533fd4d91d114af622731a405407990c4fb1rse
2f32a3d146dc55d81b31660386e17c3b83ad61b8bnicholes return -rc;
a943533fd4d91d114af622731a405407990c4fb1rse}
71c00f988beb28388702e14cb7fe06f08bd792bbdougm
71c00f988beb28388702e14cb7fe06f08bd792bbdougmstatic int sss_nfs_gss_princ_to_grouplist(
a943533fd4d91d114af622731a405407990c4fb1rse char *secname, char *princ, gid_t *groups, int *ngroups,
7933d4a963def02417113b6798d87a36395053b0rse extra_mapping_params **ex)
7933d4a963def02417113b6798d87a36395053b0rse{
e726f34f8da08c01ee8bc90904b26196b69c8587wrowe IDMAP_LOG(0, ("%s: not implemented", __func__));
e726f34f8da08c01ee8bc90904b26196b69c8587wrowe return -ENOENT;
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem}
e726f34f8da08c01ee8bc90904b26196b69c8587wrowe
e726f34f8da08c01ee8bc90904b26196b69c8587wrowestatic struct trans_func s_sss_nfs_trans = {
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem .name = sss_nfs_plugin_name,
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem .init = sss_nfs_init,
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem .princ_to_ids = sss_nfs_princ_to_ids,
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem .name_to_uid = sss_nfs_name_to_uid,
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem .name_to_gid = sss_nfs_name_to_gid,
807c9f7266ad3a966b6714fe578f3c9da1ca868brpluem .uid_to_name = sss_nfs_uid_to_name,
e726f34f8da08c01ee8bc90904b26196b69c8587wrowe .gid_to_name = sss_nfs_gid_to_name,
e726f34f8da08c01ee8bc90904b26196b69c8587wrowe .gss_princ_to_grouplist = sss_nfs_gss_princ_to_grouplist,
e726f34f8da08c01ee8bc90904b26196b69c8587wrowe};
ccbf65bf19ac58a396133923aee4597e0870ec47bnicholes
e726f34f8da08c01ee8bc90904b26196b69c8587wrowestruct trans_func *libnfsidmap_plugin_init(void)
e726f34f8da08c01ee8bc90904b26196b69c8587wrowe{
e726f34f8da08c01ee8bc90904b26196b69c8587wrowe return (&s_sss_nfs_trans);
e726f34f8da08c01ee8bc90904b26196b69c8587wrowe}
e726f34f8da08c01ee8bc90904b26196b69c8587wrowe