The branch, master has been updated
       via  4ff7f6e... s3 test: Make the netbios name test pass again
       via  ea055e8... s4: Switch to S3-style id mapping data types.
       via  86d70ae... s4 idmap: Make the sid_to_xid and xid_to_sid calls 
static.
       via  5d84805... libwbclient: Test wbcLookupName async functions
       via  cf96837... libwbclient: Implement wbcLookupName_send/recv
       via  145f2c7... libwbclient: Implement wbcAuthenticateUserEx_send/recv
       via  749fb03... libwbclient: Implement wbcLookupSid_send/recv
       via  5788672... libwbclient: Implement wbcGidToSid_send/recv
       via  ada6e26... libwbclient: Implement wbcSidToGid_send/recv
       via  446b4aa... libwbclient: Implement wbcUidToSid_send/recv
       via  4ff1906... libwbclient: Implement wbcSidToUid_send/recv
       via  33bbe1c... libwbclient: Add wbcInterfaceDetails_send/recv
       via  861ef36... libwbclient: Add wbcDomainInfo_send/recv calls
       via  99c0f56... libwbclient: Add wbcDomainName_send/recv call
       via  7cb070f... libwbclient: Add wbcNetbiosName_send/recv calls
       via  fd6b145... libwbclient: Add async wbcInfo_send()/wbcInfo_recv() 
calls
       via  a089522... libwbclient: add wbcInterfaceVersion send/recv calls
       via  1ca7274... libwbclient: torture-test wbcPing async functions.
       via  3204113... libwbclient: Add async wbcPing_send/_recv
       via  f9d041c... libwbclient: Zero out context on initialization
      from  02a5078... Final part of jumbo patch for bug #7104 - "wide links" 
and "unix extensions" are incompatible.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 4ff7f6ed3634f9a45b1ebdc965152bbada72b49d
Author: Kai Blin <k...@samba.org>
Date:   Tue Feb 2 15:18:01 2010 +0100

    s3 test: Make the netbios name test pass again

commit ea055e8c7905ec5d229fd5b50ca9ec8f60073b53
Author: Kai Blin <k...@samba.org>
Date:   Thu Apr 23 16:37:11 2009 +0200

    s4: Switch to S3-style id mapping data types.

commit 86d70ae94425c34fcb7cc7791a6e54b1a47f21cc
Author: Kai Blin <k...@samba.org>
Date:   Wed Apr 22 18:10:12 2009 +0200

    s4 idmap: Make the sid_to_xid and xid_to_sid calls static.
    
    Looking at the winbind interface, we should only be using the bulk 
conversion calls.

commit 5d848053a7f62519beed6b5ac7fb0076ae8fa9e3
Author: Kai Blin <k...@samba.org>
Date:   Fri Jan 29 12:09:18 2010 +0100

    libwbclient: Test wbcLookupName async functions

commit cf968371ef207719424d2eb58dbddcf0d0c7952d
Author: Kai Blin <k...@samba.org>
Date:   Thu May 28 00:57:32 2009 +0200

    libwbclient: Implement wbcLookupName_send/recv

commit 145f2c751b5de2864a472363cb478596c5040ee4
Author: Kai Blin <k...@samba.org>
Date:   Thu May 28 00:55:57 2009 +0200

    libwbclient: Implement wbcAuthenticateUserEx_send/recv

commit 749fb039719e60d82c496a2e1587bfa32d0360b8
Author: Kai Blin <k...@samba.org>
Date:   Fri Apr 24 16:24:56 2009 +0200

    libwbclient: Implement wbcLookupSid_send/recv

commit 57886720bb1a0e93d8903a0fa677f3820fa3cb07
Author: Kai Blin <k...@samba.org>
Date:   Thu Apr 2 09:45:39 2009 +0200

    libwbclient: Implement wbcGidToSid_send/recv

commit ada6e26d5e6bacaacbe9cdebdabe41c383e5f8c8
Author: Kai Blin <k...@samba.org>
Date:   Thu Apr 2 09:22:43 2009 +0200

    libwbclient: Implement wbcSidToGid_send/recv

commit 446b4aa17c03993a0fa0c77bd7e8bdec938be991
Author: Kai Blin <k...@samba.org>
Date:   Thu Apr 2 09:57:40 2009 +0200

    libwbclient: Implement wbcUidToSid_send/recv

commit 4ff1906357659a040aa90bcd51dd1974ec405001
Author: Kai Blin <k...@samba.org>
Date:   Tue Mar 31 23:10:48 2009 +0200

    libwbclient: Implement wbcSidToUid_send/recv

commit 33bbe1cafda93d493509f5dabfdb0ed7bbe69a71
Author: Kai Blin <k...@samba.org>
Date:   Sun Feb 15 11:01:44 2009 +0100

    libwbclient: Add wbcInterfaceDetails_send/recv

commit 861ef367c839d44b185ae3dd9191e849a5e33027
Author: Kai Blin <k...@samba.org>
Date:   Sat Feb 14 10:06:05 2009 +0100

    libwbclient: Add wbcDomainInfo_send/recv calls

commit 99c0f569f9a62b63e1d26418a777302b03c3fc7f
Author: Kai Blin <k...@samba.org>
Date:   Fri Feb 13 22:51:52 2009 +0100

    libwbclient: Add wbcDomainName_send/recv call

commit 7cb070f2b346ed486ee24926965290890f72786f
Author: Kai Blin <k...@samba.org>
Date:   Fri Feb 13 22:37:56 2009 +0100

    libwbclient: Add wbcNetbiosName_send/recv calls

commit fd6b1457935e3d6e156a85cce27aae43b3475723
Author: Kai Blin <k...@samba.org>
Date:   Wed Mar 25 10:08:10 2009 +0100

    libwbclient: Add async wbcInfo_send()/wbcInfo_recv() calls

commit a0895222be4e0227f26a625474c89fdf5aa9875c
Author: Kai Blin <k...@samba.org>
Date:   Thu Feb 12 00:11:45 2009 +0100

    libwbclient: add wbcInterfaceVersion send/recv calls

commit 1ca727420a0d2f3d0f4a14b06c1a8d1ea6c40339
Author: Kai Blin <k...@samba.org>
Date:   Fri Jan 29 11:22:14 2010 +0100

    libwbclient: torture-test wbcPing async functions.

commit 3204113efe0eccbb502914699cb5a4ddcf4efdfa
Author: Kai Blin <k...@samba.org>
Date:   Tue Mar 24 22:51:11 2009 +0100

    libwbclient: Add async wbcPing_send/_recv

commit f9d041ccd358f6e91a44369c70eebcbf605de2cd
Author: Kai Blin <k...@samba.org>
Date:   Fri Jan 29 11:54:33 2010 +0100

    libwbclient: Zero out context on initialization
    
    This prevents a segfault when using wbcDebug without prior call to 
wbcSetDebug

-----------------------------------------------------------------------

Summary of changes:
 nsswitch/libwbclient/tests/wbclient.c         |   99 +++
 nsswitch/libwbclient/wbc_async.c              |    2 +-
 nsswitch/libwbclient/wbc_async.h              |  105 ++++
 nsswitch/libwbclient/wbc_idmap.c              |  422 +++++++++++++
 nsswitch/libwbclient/wbc_pam.c                |  270 ++++++++
 nsswitch/libwbclient/wbc_sid.c                |  258 ++++++++
 nsswitch/libwbclient/wbc_util.c               |  826 ++++++++++++++++++++++++-
 nsswitch/libwbclient/wbclient.h               |   11 +-
 source3/selftest/tests.sh                     |    2 +
 source4/libcli/wbclient/wbclient.c            |   10 +-
 source4/libcli/wbclient/wbclient.h            |    8 +-
 source4/librpc/idl/winbind.idl                |   13 +-
 source4/ntvfs/posix/pvfs_acl.c                |   18 +-
 source4/ntvfs/posix/pvfs_acl_nfs4.c           |   16 +-
 source4/ntvfs/unixuid/vfs_unixuid.c           |   10 +-
 source4/rpc_server/unixinfo/dcesrv_unixinfo.c |   24 +-
 source4/winbind/idmap.c                       |   40 +-
 source4/winbind/wb_gid2sid.c                  |   10 +-
 source4/winbind/wb_sid2gid.c                  |   10 +-
 source4/winbind/wb_sid2uid.c                  |   10 +-
 source4/winbind/wb_sids2xids.c                |    6 +-
 source4/winbind/wb_uid2sid.c                  |   10 +-
 source4/winbind/wb_xids2sids.c                |    6 +-
 23 files changed, 2092 insertions(+), 94 deletions(-)


Changeset truncated at 500 lines:

diff --git a/nsswitch/libwbclient/tests/wbclient.c 
b/nsswitch/libwbclient/tests/wbclient.c
index 9e4c348..6d4ea86 100644
--- a/nsswitch/libwbclient/tests/wbclient.c
+++ b/nsswitch/libwbclient/tests/wbclient.c
@@ -19,6 +19,7 @@
 
 #include "includes.h"
 #include "nsswitch/libwbclient/wbclient.h"
+#include "nsswitch/libwbclient/wbc_async.h"
 #include "torture/smbtorture.h"
 #include "torture/winbind/proto.h"
 
@@ -35,6 +36,17 @@
 #define torture_assert_wbc_ok(torture_ctx,expr,cmt) \
                torture_assert_wbc_equal(torture_ctx,expr,WBC_ERR_SUCCESS,cmt)
 
+
+static void wbc_debug_torture(void *private_data, enum wbcDebugLevel level,
+                             const char *fmt, va_list ap) 
PRINTF_ATTRIBUTE(3,0);
+static void wbc_debug_torture(void *private_data, enum wbcDebugLevel level,
+                             const char *fmt, va_list ap)
+{
+       struct torture_context *tctx = talloc_get_type_abort(private_data,
+                                       struct torture_context);
+       torture_comment(tctx, "%s", talloc_vasprintf(tctx, fmt, ap));
+}
+
 static bool test_wbc_ping(struct torture_context *tctx)
 {
        torture_assert_wbc_ok(tctx, wbcPing(),
@@ -43,6 +55,24 @@ static bool test_wbc_ping(struct torture_context *tctx)
        return true;
 }
 
+static bool test_wbc_ping_async(struct torture_context *tctx)
+{
+       struct wb_context *wb_ctx;
+       struct tevent_req *req;
+
+       wb_ctx = wb_context_init(tctx, NULL);
+
+       req = wbcPing_send(tctx, tctx->ev, wb_ctx);
+       torture_assert(tctx, req, "wbcPing_send failed");
+
+       if(!tevent_req_poll(req, tctx->ev)) {
+               return false;
+       }
+       torture_assert_wbc_ok(tctx, wbcPing_recv(req), "wbcPing_recv failed");
+       return true;
+}
+
+
 static bool test_wbc_pingdc(struct torture_context *tctx)
 {
        torture_assert_wbc_equal(tctx, wbcPingDc("random_string", NULL), 
WBC_ERR_NOT_IMPLEMENTED,
@@ -202,6 +232,73 @@ static bool test_wbc_users(struct torture_context *tctx)
        return true;
 }
 
+static bool test_wbc_users_async(struct torture_context *tctx)
+{
+       struct wb_context *wb_ctx;
+       struct tevent_req *req;
+       const char *domain_name = NULL;
+       uint32_t num_users;
+       const char **users;
+       int i;
+       struct wbcInterfaceDetails *details;
+
+       wb_ctx = wb_context_init(tctx, NULL);
+       wbcSetDebug(wb_ctx, wbc_debug_torture, tctx);
+
+       req = wbcInterfaceDetails_send(tctx, tctx->ev, wb_ctx);
+       torture_assert(tctx, req, "wbcInterfaceDetails_send failed");
+
+       if(!tevent_req_poll(req, tctx->ev)) {
+               return false;
+       }
+       torture_assert_wbc_ok(tctx,
+                             wbcInterfaceDetails_recv(req, tctx, &details),
+                             "wbcInterfaceDetails_recv failed");
+
+       domain_name = talloc_strdup(tctx, details->netbios_domain);
+       wbcFreeMemory(details);
+
+       /* No async implementation of this yet. */
+       torture_assert_wbc_ok(tctx, wbcListUsers(domain_name, &num_users, 
&users),
+               "wbcListUsers failed");
+       torture_assert(tctx, !(num_users > 0 && !users),
+               "wbcListUsers returned invalid results");
+
+       for (i=0; i < MIN(num_users,100); i++) {
+
+               struct wbcDomainSid sid, *sids;
+               enum wbcSidType name_type;
+               char *domain;
+               char *name;
+               uint32_t num_sids;
+
+               req = wbcLookupName_send(tctx, tctx->ev, wb_ctx, domain_name,
+                                        users[i]);
+               torture_assert(tctx, req, "wbcLookupName_send failed");
+
+               if(!tevent_req_poll(req, tctx->ev)) {
+                       return false;
+               }
+
+               torture_assert_wbc_ok(tctx,
+                                     wbcLookupName_recv(req, &sid, &name_type),
+                                     "wbcLookupName_recv failed");
+
+               torture_assert_int_equal(tctx, name_type, WBC_SID_NAME_USER,
+                       "wbcLookupName expected WBC_SID_NAME_USER");
+               torture_assert_wbc_ok(tctx, wbcLookupSid(&sid, &domain, &name, 
&name_type),
+                       "wbcLookupSid failed");
+               torture_assert_int_equal(tctx, name_type, WBC_SID_NAME_USER,
+                       "wbcLookupSid expected WBC_SID_NAME_USER");
+               torture_assert(tctx, name,
+                       "wbcLookupSid returned no name");
+               torture_assert_wbc_ok(tctx, wbcLookupUserSids(&sid, true, 
&num_sids, &sids),
+                       "wbcLookupUserSids failed");
+       }
+
+       return true;
+}
+
 static bool test_wbc_groups(struct torture_context *tctx)
 {
        const char *domain_name = NULL;
@@ -353,6 +450,7 @@ struct torture_suite *torture_wbclient(void)
        struct torture_suite *suite = 
torture_suite_create(talloc_autofree_context(), "WBCLIENT");
 
        torture_suite_add_simple_test(suite, "wbcPing", test_wbc_ping);
+       torture_suite_add_simple_test(suite, "wbcPing_async", 
test_wbc_ping_async);
        torture_suite_add_simple_test(suite, "wbcPingDc", test_wbc_pingdc);
        torture_suite_add_simple_test(suite, "wbcLibraryDetails", 
test_wbc_library_details);
        torture_suite_add_simple_test(suite, "wbcInterfaceDetails", 
test_wbc_interface_details);
@@ -361,6 +459,7 @@ struct torture_suite *torture_wbclient(void)
        torture_suite_add_simple_test(suite, "wbcGuidToString", 
test_wbc_guidtostring);
        torture_suite_add_simple_test(suite, "wbcDomainInfo", 
test_wbc_domain_info);
        torture_suite_add_simple_test(suite, "wbcListUsers", test_wbc_users);
+       torture_suite_add_simple_test(suite, "wbcListUsers_async", 
test_wbc_users_async);
        torture_suite_add_simple_test(suite, "wbcListGroups", test_wbc_groups);
        torture_suite_add_simple_test(suite, "wbcListTrusts", test_wbc_trusts);
        torture_suite_add_simple_test(suite, "wbcLookupDomainController", 
test_wbc_lookupdc);
diff --git a/nsswitch/libwbclient/wbc_async.c b/nsswitch/libwbclient/wbc_async.c
index 181d546..d1dd76d 100644
--- a/nsswitch/libwbclient/wbc_async.c
+++ b/nsswitch/libwbclient/wbc_async.c
@@ -192,7 +192,7 @@ struct wb_context *wb_context_init(TALLOC_CTX *mem_ctx, 
const char* dir)
 {
        struct wb_context *result;
 
-       result = talloc(mem_ctx, struct wb_context);
+       result = talloc_zero(mem_ctx, struct wb_context);
        if (result == NULL) {
                return NULL;
        }
diff --git a/nsswitch/libwbclient/wbc_async.h b/nsswitch/libwbclient/wbc_async.h
index 76e02ca..c918ccb 100644
--- a/nsswitch/libwbclient/wbc_async.h
+++ b/nsswitch/libwbclient/wbc_async.h
@@ -92,4 +92,109 @@ struct tevent_req *wb_simple_trans_send(TALLOC_CTX *mem_ctx,
 int wb_simple_trans_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
                         struct winbindd_response **presponse, int *err);
 
+/* Async functions from wbc_idmap.c */
+
+struct tevent_req *wbcSidToUid_send(TALLOC_CTX *mem_ctx,
+                                   struct tevent_context *ev,
+                                   struct wb_context *wb_ctx,
+                                   const struct wbcDomainSid *sid);
+wbcErr wbcSidToUid_recv(struct tevent_req *req, uid_t *puid);
+
+struct tevent_req *wbcUidToSid_send(TALLOC_CTX *mem_ctx,
+                                   struct tevent_context *ev,
+                                   struct wb_context *wb_ctx,
+                                   uid_t uid);
+wbcErr wbcUidToSid_recv(struct tevent_req *req, struct wbcDomainSid *psid);
+
+struct tevent_req *wbcSidToGid_send(TALLOC_CTX *mem_ctx,
+                                   struct tevent_context *ev,
+                                   struct wb_context *wb_ctx,
+                                   const struct wbcDomainSid *sid);
+wbcErr wbcSidToGid_recv(struct tevent_req *req, gid_t *pgid);
+
+struct tevent_req *wbcGidToSid_send(TALLOC_CTX *mem_ctx,
+                                   struct tevent_context *ev,
+                                   struct wb_context *wb_ctx,
+                                   gid_t gid);
+wbcErr wbcGidToSid_recv(struct tevent_req *req, struct wbcDomainSid *psid);
+
+/* Async functions from wbc_pam.c */
+struct tevent_req *wbcAuthenticateUserEx_send(TALLOC_CTX *mem_ctx,
+                                       struct tevent_context *ev,
+                                       struct wb_context *wb_ctx,
+                                       const struct wbcAuthUserParams *params);
+wbcErr wbcAuthenticateUserEx_recv(struct tevent_req *req,
+                                 TALLOC_CTX *mem_ctx,
+                                 struct wbcAuthUserInfo **info,
+                                 struct wbcAuthErrorInfo **error);
+
+/* Async functions from wbc_sid.c */
+struct tevent_req *wbcLookupName_send(TALLOC_CTX *mem_ctx,
+                                     struct tevent_context *ev,
+                                     struct wb_context *wb_ctx,
+                                     const char *domain,
+                                     const char *name);
+wbcErr wbcLookupName_recv(struct tevent_req *req,
+                         struct wbcDomainSid *sid,
+                         enum wbcSidType *name_type);
+struct tevent_req *wbcLookupSid_send(TALLOC_CTX *mem_ctx,
+                                    struct tevent_context *ev,
+                                    struct wb_context *wb_ctx,
+                                    const struct wbcDomainSid *sid);
+wbcErr wbcLookupSid_recv(struct tevent_req *req,
+                        TALLOC_CTX *mem_ctx,
+                        char **pdomain,
+                        char **pname,
+                        enum wbcSidType *pname_type);
+
+/* Async functions from wbc_util.c */
+
+struct tevent_req *wbcPing_send(TALLOC_CTX *mem_ctx,
+                              struct tevent_context *ev,
+                              struct wb_context *wb_ctx);
+wbcErr wbcPing_recv(struct tevent_req *req);
+
+struct tevent_req *wbcInterfaceVersion_send(TALLOC_CTX *mem_ctx,
+                                           struct tevent_context *ev,
+                                           struct wb_context *wb_ctx);
+wbcErr wbcInterfaceVersion_recv(struct tevent_req *req,
+                               uint32_t *interface_version);
+
+struct tevent_req *wbcInfo_send(TALLOC_CTX *mem_ctx,
+                               struct tevent_context *ev,
+                               struct wb_context *wb_ctx);
+wbcErr wbcInfo_recv(struct tevent_req *req,
+                   TALLOC_CTX *mem_ctx,
+                   char *winbind_separator,
+                   char **version_string);
+
+struct tevent_req *wbcNetbiosName_send(TALLOC_CTX *mem_ctx,
+                                      struct tevent_context *ev,
+                                      struct wb_context *wb_ctx);
+wbcErr wbcNetbiosName_recv(struct tevent_req *req,
+                          TALLOC_CTX *mem_ctx,
+                          char **netbios_name);
+
+struct tevent_req *wbcDomainName_send(TALLOC_CTX *mem_ctx,
+                                     struct tevent_context *ev,
+                                     struct wb_context *wb_ctx);
+wbcErr wbcDomainName_recv(struct tevent_req *req,
+                         TALLOC_CTX *mem_ctx,
+                         char **netbios_name);
+
+struct tevent_req *wbcInterfaceDetails_send(TALLOC_CTX *mem_ctx,
+                                           struct tevent_context *ev,
+                                           struct wb_context *wb_ctx);
+wbcErr wbcInterfaceDetails_recv(struct tevent_req *req,
+                               TALLOC_CTX *mem_ctx,
+                               struct wbcInterfaceDetails **details);
+
+struct tevent_req *wbcDomainInfo_send(TALLOC_CTX *mem_ctx,
+                                     struct tevent_context *ev,
+                                     struct wb_context *wb_ctx,
+                                     const char *domain);
+wbcErr wbcDomainInfo_recv(struct tevent_req *req,
+                         TALLOC_CTX *mem_ctx,
+                         struct wbcDomainInfo **dinfo);
+
 #endif /*_WBC_ASYNC_H_*/
diff --git a/nsswitch/libwbclient/wbc_idmap.c b/nsswitch/libwbclient/wbc_idmap.c
index 10a02fd..e1bb6f2 100644
--- a/nsswitch/libwbclient/wbc_idmap.c
+++ b/nsswitch/libwbclient/wbc_idmap.c
@@ -4,6 +4,7 @@
    Winbind client API
 
    Copyright (C) Gerald (Jerry) Carter 2007
+   Copyright (C) Kai Blin 2009
 
 
    This library is free software; you can redistribute it and/or
@@ -25,6 +26,105 @@
 #include "replace.h"
 #include "libwbclient.h"
 
+struct wbc_sid_to_uid_state {
+       struct winbindd_request req;
+       uid_t uid;
+};
+
+static void wbcSidToUid_done(struct tevent_req *subreq);
+
+/**
+ * @brief Convert a Windows SID to a Unix uid, allocating an uid if needed
+ *
+ * @param mem_ctx      talloc context to allocate the request from
+ * @param ev           tevent context to use for async operation
+ * @param wb_ctx       winbind context to use
+ * @param *sid         pointer to the domain SID to be resolved
+ *
+ * @return tevent_req on success, NULL on error
+ */
+
+struct tevent_req *wbcSidToUid_send(TALLOC_CTX *mem_ctx,
+                                   struct tevent_context *ev,
+                                   struct wb_context *wb_ctx,
+                                   const struct wbcDomainSid *sid)
+{
+       struct tevent_req *req, *subreq;
+       struct wbc_sid_to_uid_state *state;
+       char *sid_string;
+       wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE;
+
+       req = tevent_req_create(mem_ctx, &state, struct wbc_sid_to_uid_state);
+       if (req == NULL) {
+               return NULL;
+       }
+
+       ZERO_STRUCT(state->req);
+
+       state->req.cmd = WINBINDD_SID_TO_UID;
+       wbc_status = wbcSidToString(sid, &sid_string);
+       if (!WBC_ERROR_IS_OK(wbc_status)) {
+               return tevent_req_post(req, ev);
+       }
+       strncpy(state->req.data.sid, sid_string, sizeof(state->req.data.sid)-1);
+       wbcFreeMemory(sid_string);
+
+       subreq = wb_trans_send(state, ev, wb_ctx, false, &state->req);
+       if (tevent_req_nomem(subreq, req)) {
+               return tevent_req_post(req, ev);
+       }
+
+       tevent_req_set_callback(subreq, wbcSidToUid_done, req);
+       return req;
+}
+
+static void wbcSidToUid_done(struct tevent_req *subreq)
+{
+       struct tevent_req *req = tevent_req_callback_data(
+                       subreq, struct tevent_req);
+       struct wbc_sid_to_uid_state *state = tevent_req_data(
+                       req, struct wbc_sid_to_uid_state);
+       struct winbindd_response *resp;
+       wbcErr wbc_status;
+
+       wbc_status = wb_trans_recv(subreq, state, &resp);
+       TALLOC_FREE(subreq);
+       if (!WBC_ERROR_IS_OK(wbc_status)) {
+               tevent_req_error(req, wbc_status);
+               return;
+       }
+       state->uid = resp->data.uid;
+       TALLOC_FREE(resp);
+
+       tevent_req_done(req);
+}
+
+/**
+ * @brief Receive a Unix uid mapped to a Windows SID
+ *
+ * @param req          tevent_req containing the request
+ * @param *puid                pointer to hold the resolved uid_t value
+ *
+ * @return #wbcErr
+ */
+
+wbcErr wbcSidToUid_recv(struct tevent_req *req, uid_t *puid)
+{
+       struct wbc_sid_to_uid_state *state = tevent_req_data(
+                       req, struct wbc_sid_to_uid_state);
+       wbcErr wbc_status;
+
+       if (tevent_req_is_wbcerr(req, &wbc_status)) {
+               tevent_req_received(req);
+               return wbc_status;
+       }
+
+       *puid = state->uid;
+
+       tevent_req_received(req);
+       return WBC_ERR_SUCCESS;
+}
+
 /* Convert a Windows SID to a Unix uid, allocating an uid if needed */
 wbcErr wbcSidToUid(const struct wbcDomainSid *sid, uid_t *puid)
 {
@@ -71,6 +171,116 @@ wbcErr wbcQuerySidToUid(const struct wbcDomainSid *sid,
        return WBC_ERR_NOT_IMPLEMENTED;
 }
 
+struct wbc_uid_to_sid_state {
+       struct winbindd_request req;
+       struct wbcDomainSid *sid;
+};
+
+static void wbcUidToSid_done(struct tevent_req *subreq);
+
+/**
+ * @brief Request a Windows SID for an Unix uid, allocating an SID if needed
+ *
+ * @param mem_ctx      talloc context to allocate the request from
+ * @param ev           tevent context to use for async operation
+ * @param wb_ctx       winbind context to use
+ * @param uid          uid to be resolved to a SID
+ *
+ * @return tevent_req on success, NULL on error
+ */
+
+struct tevent_req *wbcUidToSid_send(TALLOC_CTX *mem_ctx,
+                                   struct tevent_context *ev,
+                                   struct wb_context *wb_ctx,
+                                   uid_t uid)
+{
+       struct tevent_req *req, *subreq;
+       struct wbc_uid_to_sid_state *state;
+
+       req = tevent_req_create(mem_ctx, &state, struct wbc_uid_to_sid_state);
+       if (req == NULL) {
+               return NULL;
+       }
+
+       ZERO_STRUCT(state->req);
+
+       state->req.cmd = WINBINDD_UID_TO_SID;
+       state->req.data.uid = uid;
+
+       subreq = wb_trans_send(state, ev, wb_ctx, false, &state->req);
+       if (tevent_req_nomem(subreq, req)) {
+               return tevent_req_post(req, ev);
+       }
+
+       tevent_req_set_callback(subreq, wbcUidToSid_done, req);
+       return req;
+}
+
+static void wbcUidToSid_done(struct tevent_req *subreq)
+{
+       struct tevent_req *req = tevent_req_callback_data(
+                       subreq, struct tevent_req);
+       struct wbc_uid_to_sid_state *state = tevent_req_data(
+                       req, struct wbc_uid_to_sid_state);
+       struct winbindd_response *resp;
+       wbcErr wbc_status;
+
+       wbc_status = wb_trans_recv(subreq, state, &resp);
+       TALLOC_FREE(subreq);
+       if (!WBC_ERROR_IS_OK(wbc_status)) {
+               tevent_req_error(req, wbc_status);
+               return;
+       }
+
+       state->sid = talloc(state, struct wbcDomainSid);
+       if (state->sid == NULL) {
+               TALLOC_FREE(resp);
+               tevent_req_error(req, WBC_ERR_NO_MEMORY);
+               return;
+       }
+
+       wbc_status = wbcStringToSid(resp->data.sid.sid, state->sid);
+       TALLOC_FREE(resp);
+
+       if (!WBC_ERROR_IS_OK(wbc_status)) {
+               tevent_req_error(req, wbc_status);
+               return;
+       }
+
+       tevent_req_done(req);
+}
+
+/**
+ * @brief Receive a Unix uid mapped to a Windows SID
+ *
+ * @param req          tevent_req containing the request
+ * @param *psid                pointer to hold the resolved SID
+ *
+ * @return #wbcErr
+ */
+
+wbcErr wbcUidToSid_recv(struct tevent_req *req, struct wbcDomainSid *psid)
+{
+       struct wbc_uid_to_sid_state *state = tevent_req_data(
+                       req, struct wbc_uid_to_sid_state);
+       wbcErr wbc_status;
+
+       if (psid == NULL) {
+               tevent_req_received(req);
+               return WBC_ERR_INVALID_PARAM;
+       }
+
+       if (tevent_req_is_wbcerr(req, &wbc_status)) {
+               tevent_req_received(req);
+               return wbc_status;
+       }
+
+       memcpy(psid, state->sid, sizeof(struct wbcDomainSid));
+


-- 
Samba Shared Repository

Reply via email to