winbind: Add parse_xidlist()
authorVolker Lendecke <vl@samba.org>
Fri, 14 Aug 2015 15:14:53 +0000 (17:14 +0200)
committerRalph Boehme <slow@samba.org>
Mon, 22 Feb 2016 19:29:15 +0000 (20:29 +0100)
This will be part of parsing the socket protocols xids2sids request

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
source3/winbindd/winbindd_proto.h
source3/winbindd/winbindd_util.c

index bc3ac6535fd811a41c880c612f6961e269dbf9f1..f3c5c994957d44ae9ab5fbdbd8e829b9045a8c19 100644 (file)
@@ -468,6 +468,8 @@ bool is_domain_offline(const struct winbindd_domain *domain);
 bool is_domain_online(const struct winbindd_domain *domain);
 bool parse_sidlist(TALLOC_CTX *mem_ctx, const char *sidstr,
                   struct dom_sid **sids, uint32_t *num_sids);
+bool parse_xidlist(TALLOC_CTX *mem_ctx, const char *xidstr,
+                  struct unixid **pxids, uint32_t *pnum_xids);
 
 /* The following definitions come from winbindd/winbindd_wins.c  */
 
index 8139daadfd73ac064cf94e505c49bab741ecee33..0cd77f73263cb3015b7410793e3889a90a8fceca 100644 (file)
@@ -1610,3 +1610,67 @@ bool parse_sidlist(TALLOC_CTX *mem_ctx, const char *sidstr,
        }
        return True;
 }
+
+bool parse_xidlist(TALLOC_CTX *mem_ctx, const char *xidstr,
+                  struct unixid **pxids, uint32_t *pnum_xids)
+{
+       const char *p;
+       struct unixid *xids = NULL;
+       uint32_t num_xids = 0;
+
+       p = xidstr;
+       if (p == NULL) {
+               return false;
+       }
+
+       while (p[0] != '\0') {
+               struct unixid *tmp;
+               struct unixid xid;
+               unsigned long long id;
+               char *endp;
+
+               switch (p[0]) {
+               case 'U':
+                       xid = (struct unixid) { .type = ID_TYPE_UID };
+                       break;
+               case 'G':
+                       xid = (struct unixid) { .type = ID_TYPE_GID };
+                       break;
+               default:
+                       return false;
+               }
+
+               p += 1;
+
+               id = strtoull(p, &endp, 10);
+               if ((id == ULLONG_MAX) && (errno == ERANGE)) {
+                       goto fail;
+               }
+               if (*endp != '\n') {
+                       goto fail;
+               }
+               p = endp+1;
+
+               xid.id = id;
+               if ((unsigned long long)xid.id != id) {
+                       goto fail;
+               }
+
+               tmp = talloc_realloc(mem_ctx, xids, struct unixid, num_xids+1);
+               if (tmp == NULL) {
+                       return 0;
+               }
+               xids = tmp;
+
+               xids[num_xids] = xid;
+               num_xids += 1;
+       }
+
+       *pxids = xids;
+       *pnum_xids = num_xids;
+       return true;
+
+fail:
+       TALLOC_FREE(xids);
+       return false;
+}