s3: Implement wbcGetpwsid
[ira/wip.git] / source3 / lib / winbind_util.c
index f4e7ab19e89dc69c5d43b9230216829b69b1fbcc..686e70f4ad7860a17d3374f002f5e3756daffc27 100644 (file)
 
 #include "nsswitch/libwbclient/wbclient.h"
 
+struct passwd * winbind_getpwnam(const char * name)
+{
+       wbcErr result;
+       struct passwd * tmp_pwd = NULL;
+       struct passwd * pwd = NULL;
+
+       result = wbcGetpwnam(name, &tmp_pwd);
+       if (result != WBC_ERR_SUCCESS)
+               return pwd;
+
+       pwd = tcopy_passwd(talloc_tos(), tmp_pwd);
+
+       wbcFreeMemory(tmp_pwd);
+
+       return pwd;
+}
+
+struct passwd * winbind_getpwsid(const DOM_SID *sid)
+{
+       wbcErr result;
+       struct passwd * tmp_pwd = NULL;
+       struct passwd * pwd = NULL;
+       struct wbcDomainSid dom_sid;
+
+       memcpy(&dom_sid, sid, sizeof(dom_sid));
+
+       result = wbcGetpwsid(&dom_sid, &tmp_pwd);
+       if (result != WBC_ERR_SUCCESS)
+               return pwd;
+
+       pwd = tcopy_passwd(talloc_tos(), tmp_pwd);
+
+       wbcFreeMemory(tmp_pwd);
+
+       return pwd;
+}
+
 /* Call winbindd to convert a name to a sid */
 
 bool winbind_lookup_name(const char *dom_name, const char *name, DOM_SID *sid, 
@@ -35,12 +72,12 @@ bool winbind_lookup_name(const char *dom_name, const char *name, DOM_SID *sid,
 
        result = wbcLookupName(dom_name, name, &dom_sid, &type);
        if (result != WBC_ERR_SUCCESS)
-               return False;
+               return false;
 
        memcpy(sid, &dom_sid, sizeof(DOM_SID)); 
        *name_type = (enum lsa_SidType)type;    
 
-       return True;    
+       return true;    
 }
 
 /* Call winbindd to convert sid to name */
@@ -59,7 +96,7 @@ bool winbind_lookup_sid(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
 
        result = wbcLookupSid(&dom_sid, &domain_name, &account_name, &type);
        if (result != WBC_ERR_SUCCESS)
-               return False;
+               return false;
 
        /* Copy out result */
 
@@ -74,16 +111,16 @@ bool winbind_lookup_sid(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
        DEBUG(10, ("winbind_lookup_sid: SUCCESS: SID %s -> %s %s\n", 
                   sid_string_dbg(sid), domain_name, account_name));
 
-       SAFE_FREE(domain_name);
-       SAFE_FREE(account_name);
+       wbcFreeMemory(domain_name);
+       wbcFreeMemory(account_name);
        
        if ((domain && !*domain) || (name && !*name)) {         
                DEBUG(0,("winbind_lookup_sid: talloc() failed!\n"));
-               return False;
+               return false;
        }       
 
 
-       return True;
+       return true;
 }
 
 /* Ping winbindd to see it is alive */
@@ -105,8 +142,6 @@ bool winbind_sid_to_uid(uid_t *puid, const DOM_SID *sid)
        memcpy(&dom_sid, sid, sizeof(dom_sid)); 
 
        result = wbcSidToUid(&dom_sid, puid);   
-       if (result != WBC_ERR_SUCCESS)
-               return False;
 
        return (result == WBC_ERR_SUCCESS);     
 }
@@ -138,8 +173,6 @@ bool winbind_sid_to_gid(gid_t *pgid, const DOM_SID *sid)
        memcpy(&dom_sid, sid, sizeof(dom_sid)); 
 
        result = wbcSidToGid(&dom_sid, pgid);   
-       if (result != WBC_ERR_SUCCESS)
-               return False;
 
        return (result == WBC_ERR_SUCCESS);     
 }
@@ -196,23 +229,24 @@ bool winbind_lookup_rids(TALLOC_CTX *mem_ctx,
        
        ret = wbcLookupRids(&dom_sid, num_rids, rids,
                            &dom_name, &namelist, &name_types);
-       if (ret != WBC_ERR_SUCCESS)
-               return False;
+       if (ret != WBC_ERR_SUCCESS) {           
+               return false;
+       }       
        
        *domain_name = talloc_strdup(mem_ctx, dom_name);
        *names       = TALLOC_ARRAY(mem_ctx, const char*, num_rids);
        *types       = TALLOC_ARRAY(mem_ctx, enum lsa_SidType, num_rids);
 
        for(i=0; i<num_rids; i++) {
-               (*names)[i] = talloc_strdup(names, namelist[i]);
+               (*names)[i] = talloc_strdup(*names, namelist[i]);
                (*types)[i] = (enum lsa_SidType)name_types[i];
-
-               free(CONST_DISCARD(char*, namelist[i]));                
        }
-       free(namelist);
-       free(name_types);
+
+       wbcFreeMemory(CONST_DISCARD(char*, dom_name));
+       wbcFreeMemory(namelist);
+       wbcFreeMemory(name_types);
        
-       return True;    
+       return true;    
 }
 
 /* Ask Winbind to allocate a new uid for us */
@@ -239,10 +273,20 @@ bool winbind_allocate_gid(gid_t *gid)
 
 #else      /* WITH_WINBIND */
 
+struct passwd * winbind_getpwnam(const char * name)
+{
+       return NULL;
+}
+
+struct passwd * winbind_getpwsid(const DOM_SID *sid)
+{
+       return NULL;
+}
+
 bool winbind_lookup_name(const char *dom_name, const char *name, DOM_SID *sid, 
                          enum lsa_SidType *name_type)
 {
-       return False;
+       return false;
 }
 
 /* Call winbindd to convert sid to name */
@@ -251,42 +295,42 @@ bool winbind_lookup_sid(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
                        const char **domain, const char **name,
                         enum lsa_SidType *name_type)
 {
-       return False;
+       return false;
 }
 
 /* Ping winbindd to see it is alive */
 
 bool winbind_ping(void)
 {
-       return False;
+       return false;
 }
 
 /* Call winbindd to convert SID to uid */
 
 bool winbind_sid_to_uid(uid_t *puid, const DOM_SID *sid)
 {
-       return False;
+       return false;
 }
 
 /* Call winbindd to convert uid to sid */
 
 bool winbind_uid_to_sid(DOM_SID *sid, uid_t uid)
 {
-       return False;
+       return false;
 }
 
 /* Call winbindd to convert SID to gid */
 
 bool winbind_sid_to_gid(gid_t *pgid, const DOM_SID *sid)
 {
-       return False;   
+       return false;   
 }
 
 /* Call winbindd to convert gid to sid */
 
 bool winbind_gid_to_sid(DOM_SID *sid, gid_t gid)
 {
-       return False;
+       return false;
 }
 
 /* Check for a trusted domain */
@@ -304,21 +348,21 @@ bool winbind_lookup_rids(TALLOC_CTX *mem_ctx,
                         const char **domain_name,
                         const char ***names, enum lsa_SidType **types)
 {
-       return False;
+       return false;
 }
 
 /* Ask Winbind to allocate a new uid for us */
 
 bool winbind_allocate_uid(uid_t *uid)
 {
-       return False;
+       return false;
 }
 
 /* Ask Winbind to allocate a new gid for us */
 
 bool winbind_allocate_gid(gid_t *gid)
 {
-       return False;
+       return false;
 }
 
 #endif     /* WITH_WINBIND */