diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2006-09-14 14:51:16 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 11:51:46 -0500 |
commit | 71453ab90dbda7f335a3c7119eb8d404e85a0131 (patch) | |
tree | 98389567efb132cd9bdec96e7ae1ce77800ee03c /source3/rpc_server | |
parent | 1e811453620ea35bcc1f2b481d1ebdc0778b282f (diff) | |
download | samba-71453ab90dbda7f335a3c7119eb8d404e85a0131.tar.gz samba-71453ab90dbda7f335a3c7119eb8d404e85a0131.tar.bz2 samba-71453ab90dbda7f335a3c7119eb8d404e85a0131.zip |
r18526: Use generated server for unixinfo RPC interface.
(This used to be commit a5c0606d7667506fdc64776e32d4b3508195a199)
Diffstat (limited to 'source3/rpc_server')
-rw-r--r-- | source3/rpc_server/srv_unixinfo.c | 163 | ||||
-rw-r--r-- | source3/rpc_server/srv_unixinfo_nt.c | 116 |
2 files changed, 44 insertions, 235 deletions
diff --git a/source3/rpc_server/srv_unixinfo.c b/source3/rpc_server/srv_unixinfo.c deleted file mode 100644 index f21416dfab..0000000000 --- a/source3/rpc_server/srv_unixinfo.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Unix SMB/CIFS implementation. - * RPC Pipe client / server routines for unixinfo-pipe - * Copyright (C) Volker Lendecke 2005 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/* This is the interface to the rpcunixinfo pipe. */ - -#include "includes.h" -#include "nterr.h" - -#undef DBGC_CLASS -#define DBGC_CLASS DBGC_RPC_SRV - -static BOOL api_sid_to_uid(pipes_struct *p) -{ - UNIXINFO_Q_SID_TO_UID q_u; - UNIXINFO_R_SID_TO_UID r_u; - - prs_struct *data = &p->in_data.data; - prs_struct *rdata = &p->out_data.rdata; - - ZERO_STRUCT(q_u); - ZERO_STRUCT(r_u); - - if (!unixinfo_io_q_unixinfo_sid_to_uid("", &q_u, data, 0)) - return False; - - r_u.status = _unixinfo_sid_to_uid(p, &q_u, &r_u); - - if (!unixinfo_io_r_unixinfo_sid_to_uid("", &r_u, rdata, 0)) - return False; - - return True; -} - -static BOOL api_uid_to_sid(pipes_struct *p) -{ - UNIXINFO_Q_UID_TO_SID q_u; - UNIXINFO_R_UID_TO_SID r_u; - - prs_struct *data = &p->in_data.data; - prs_struct *rdata = &p->out_data.rdata; - - ZERO_STRUCT(q_u); - ZERO_STRUCT(r_u); - - if (!unixinfo_io_q_unixinfo_uid_to_sid("", &q_u, data, 0)) - return False; - - r_u.status = _unixinfo_uid_to_sid(p, &q_u, &r_u); - - if (!unixinfo_io_r_unixinfo_uid_to_sid("", &r_u, rdata, 0)) - return False; - - return True; -} - -static BOOL api_sid_to_gid(pipes_struct *p) -{ - UNIXINFO_Q_SID_TO_GID q_u; - UNIXINFO_R_SID_TO_GID r_u; - - prs_struct *data = &p->in_data.data; - prs_struct *rdata = &p->out_data.rdata; - - ZERO_STRUCT(q_u); - ZERO_STRUCT(r_u); - - if (!unixinfo_io_q_unixinfo_sid_to_gid("", &q_u, data, 0)) - return False; - - r_u.status = _unixinfo_sid_to_gid(p, &q_u, &r_u); - - if (!unixinfo_io_r_unixinfo_sid_to_gid("", &r_u, rdata, 0)) - return False; - - return True; -} - -static BOOL api_gid_to_sid(pipes_struct *p) -{ - UNIXINFO_Q_GID_TO_SID q_u; - UNIXINFO_R_GID_TO_SID r_u; - - prs_struct *data = &p->in_data.data; - prs_struct *rdata = &p->out_data.rdata; - - ZERO_STRUCT(q_u); - ZERO_STRUCT(r_u); - - if (!unixinfo_io_q_unixinfo_gid_to_sid("", &q_u, data, 0)) - return False; - - r_u.status = _unixinfo_gid_to_sid(p, &q_u, &r_u); - - if (!unixinfo_io_r_unixinfo_gid_to_sid("", &r_u, rdata, 0)) - return False; - - return True; -} - -static BOOL api_getpwuid(pipes_struct *p) -{ - UNIXINFO_Q_GETPWUID q_u; - UNIXINFO_R_GETPWUID r_u; - - prs_struct *data = &p->in_data.data; - prs_struct *rdata = &p->out_data.rdata; - - ZERO_STRUCT(q_u); - ZERO_STRUCT(r_u); - - if (!unixinfo_io_q_unixinfo_getpwuid("", &q_u, data, 0)) - return False; - - r_u.status = _unixinfo_getpwuid(p, &q_u, &r_u); - - if (!unixinfo_io_r_unixinfo_getpwuid("", &r_u, rdata, 0)) - return False; - - return True; -} - -/******************************************************************* -\pipe\unixinfo commands -********************************************************************/ - -struct api_struct api_unixinfo_cmds[] = { - {"SID_TO_UID", UNIXINFO_SID_TO_UID, api_sid_to_uid }, - {"UID_TO_SID", UNIXINFO_UID_TO_SID, api_uid_to_sid }, - {"SID_TO_GID", UNIXINFO_SID_TO_GID, api_sid_to_gid }, - {"GID_TO_SID", UNIXINFO_GID_TO_SID, api_gid_to_sid }, - {"GETPWUID", UNIXINFO_GETPWUID, api_getpwuid }, -}; - - -void unixinfo_get_pipe_fns( struct api_struct **fns, int *n_fns ) -{ - *fns = api_unixinfo_cmds; - *n_fns = sizeof(api_unixinfo_cmds) / sizeof(struct api_struct); -} - -NTSTATUS rpc_unixinfo_init(void) -{ - return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, - "unixinfo", "unixinfo", api_unixinfo_cmds, - sizeof(api_unixinfo_cmds) / sizeof(struct api_struct)); -} diff --git a/source3/rpc_server/srv_unixinfo_nt.c b/source3/rpc_server/srv_unixinfo_nt.c index 5afbb7bed0..321c6a6a5e 100644 --- a/source3/rpc_server/srv_unixinfo_nt.c +++ b/source3/rpc_server/srv_unixinfo_nt.c @@ -23,120 +23,92 @@ #include "includes.h" #include "nterr.h" + + #undef DBGC_CLASS #define DBGC_CLASS DBGC_RPC_SRV /* Map a sid to a uid */ -NTSTATUS _unixinfo_sid_to_uid(pipes_struct *p, - UNIXINFO_Q_SID_TO_UID *q_u, - UNIXINFO_R_SID_TO_UID *r_u) +NTSTATUS _unixinfo_SidToUid(pipes_struct *p, struct dom_sid sid, uint64_t *uid) { - uid_t uid; + uid_t real_uid; + NTSTATUS status; + *uid = 0; - r_u->uid = 0; + status = sid_to_uid(&sid, &real_uid) ? NT_STATUS_OK : NT_STATUS_NONE_MAPPED; + if (NT_STATUS_IS_OK(status)) + *uid = real_uid; - r_u->status = sid_to_uid(&q_u->sid, &uid) ? NT_STATUS_OK : NT_STATUS_NONE_MAPPED; - if (NT_STATUS_IS_OK(r_u->status)) - r_u->uid = uid; - - return r_u->status; + return status; } /* Map a uid to a sid */ -NTSTATUS _unixinfo_uid_to_sid(pipes_struct *p, - UNIXINFO_Q_UID_TO_SID *q_u, - UNIXINFO_R_UID_TO_SID *r_u) +NTSTATUS _unixinfo_UidToSid(pipes_struct *p, uint64_t uid, struct dom_sid *sid) { - DOM_SID sid; + NTSTATUS status = NT_STATUS_NO_SUCH_USER; - r_u->status = NT_STATUS_NO_SUCH_USER; + uid_to_sid(sid, (uid_t)uid); + status = NT_STATUS_OK; - if (q_u->uid == 0) { - uid_to_sid(&sid, q_u->uid); - r_u->status = NT_STATUS_OK; - } - - init_r_unixinfo_uid_to_sid(r_u, - NT_STATUS_IS_OK(r_u->status) ? &sid : NULL); - - return r_u->status; + return status; } /* Map a sid to a gid */ -NTSTATUS _unixinfo_sid_to_gid(pipes_struct *p, - UNIXINFO_Q_SID_TO_GID *q_u, - UNIXINFO_R_SID_TO_GID *r_u) +NTSTATUS _unixinfo_SidToGid(pipes_struct *p, struct dom_sid sid, uint64_t *gid) { - gid_t gid; + gid_t real_gid; + NTSTATUS status; - r_u->gid = 0; + *gid = 0; - r_u->status = sid_to_gid(&q_u->sid, &gid) ? NT_STATUS_OK : NT_STATUS_NONE_MAPPED; - if (NT_STATUS_IS_OK(r_u->status)) - r_u->gid = gid; + status = sid_to_gid(&sid, &real_gid) ? NT_STATUS_OK : NT_STATUS_NONE_MAPPED; + if (NT_STATUS_IS_OK(status)) + *gid = real_gid; - return r_u->status; + return status; } /* Map a gid to a sid */ -NTSTATUS _unixinfo_gid_to_sid(pipes_struct *p, - UNIXINFO_Q_GID_TO_SID *q_u, - UNIXINFO_R_GID_TO_SID *r_u) +NTSTATUS _unixinfo_GidToSid(pipes_struct *p, uint64_t gid, struct dom_sid *sid) { - DOM_SID sid; + NTSTATUS status = NT_STATUS_NO_SUCH_GROUP; - r_u->status = NT_STATUS_NO_SUCH_GROUP; + gid_to_sid(sid, (gid_t)gid); + status = NT_STATUS_OK; - if (q_u->gid == 0) { - gid_to_sid(&sid, q_u->gid); - r_u->status = NT_STATUS_OK; - } - - init_r_unixinfo_gid_to_sid(r_u, - NT_STATUS_IS_OK(r_u->status) ? &sid : NULL); - - return r_u->status; + return status; } /* Get unix struct passwd information */ -NTSTATUS _unixinfo_getpwuid(pipes_struct *p, - UNIXINFO_Q_GETPWUID *q_u, - UNIXINFO_R_GETPWUID *r_u) +NTSTATUS _unixinfo_GetPWUid(pipes_struct *p, uint32_t *count, uint64_t *uids, + struct unixinfo_GetPWUidInfo *infos) { int i; + NTSTATUS status; - if (r_u->count > 1023) { + if (*count > 1023) return NT_STATUS_INVALID_PARAMETER; - } - - r_u->info = TALLOC_ARRAY(p->mem_ctx, struct unixinfo_getpwuid, - q_u->count); - - if ((r_u->count > 0) && (r_u->info == NULL)) { - return NT_STATUS_NO_MEMORY; - } - r_u->status = NT_STATUS_OK; - r_u->count = q_u->count; + status = NT_STATUS_OK; - for (i=0; i<r_u->count; i++) { + for (i=0; i<*count; i++) { struct passwd *pw; char *homedir, *shell; ssize_t len1, len2; - r_u->info[i].status = NT_STATUS_NO_SUCH_USER; - r_u->info[i].homedir = ""; - r_u->info[i].shell = ""; + infos[i].status = NT_STATUS_NO_SUCH_USER; + infos[i].homedir = ""; + infos[i].shell = ""; - pw = getpwuid(q_u->uid[i]); + pw = getpwuid(uids[i]); if (pw == NULL) { - DEBUG(10, ("Did not find uid %lld\n", q_u->uid[i])); + DEBUG(10, ("Did not find uid %lld\n", uids[i])); continue; } @@ -146,14 +118,14 @@ NTSTATUS _unixinfo_getpwuid(pipes_struct *p, if ((len1 < 0) || (len2 < 0) || (homedir == NULL) || (shell == NULL)) { DEBUG(3, ("push_utf8_talloc failed\n")); - r_u->info[i].status = NT_STATUS_NO_MEMORY; + infos[i].status = NT_STATUS_NO_MEMORY; continue; } - r_u->info[i].status = NT_STATUS_OK; - r_u->info[i].homedir = homedir; - r_u->info[i].shell = shell; + infos[i].status = NT_STATUS_OK; + infos[i].homedir = homedir; + infos[i].shell = shell; } - return r_u->status; + return status; } |