summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/db/sysdb.h5
-rw-r--r--src/db/sysdb_ops.c40
-rw-r--r--src/tests/sysdb-tests.c4
3 files changed, 28 insertions, 21 deletions
diff --git a/src/db/sysdb.h b/src/db/sysdb.h
index 23c8baca7..68d3021ee 100644
--- a/src/db/sysdb.h
+++ b/src/db/sysdb.h
@@ -62,6 +62,7 @@
#define SYSDB_MEMBER "member"
#define SYSDB_MEMBERUID "memberUid"
+#define SYSDB_POSIX "isPosix"
#define SYSDB_DEFAULTGROUP "defaultGroup"
#define SYSDB_GECOS "gecos"
@@ -153,7 +154,7 @@
NULL}
#define SYSDB_INITGR_ATTR SYSDB_MEMBEROF
-#define SYSDB_INITGR_ATTRS {SYSDB_GIDNUM, \
+#define SYSDB_INITGR_ATTRS {SYSDB_GIDNUM, SYSDB_POSIX, \
SYSDB_DEFAULT_ATTRS, \
NULL}
@@ -505,7 +506,7 @@ int sysdb_add_incomplete_group(struct sysdb_ctx *ctx,
struct sss_domain_info *domain,
const char *name,
gid_t gid,
- const char *original_dn);
+ const char *original_dn, bool posix);
/* Add netgroup (only basic attrs and w/o checks) */
int sysdb_add_basic_netgroup(struct sysdb_ctx *ctx,
diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c
index ba1f6672c..08437f6dd 100644
--- a/src/db/sysdb_ops.c
+++ b/src/db/sysdb_ops.c
@@ -1047,6 +1047,7 @@ int sysdb_add_group(TALLOC_CTX *mem_ctx,
uint32_t id;
time_t now;
int ret;
+ bool posix;
if (domain->id_max != 0 && gid != 0 &&
(gid < domain->id_min || gid > domain->id_max)) {
@@ -1095,22 +1096,6 @@ int sysdb_add_group(TALLOC_CTX *mem_ctx,
ret = sysdb_add_basic_group(tmpctx, ctx, domain, name, gid);
if (ret) goto done;
- if (gid == 0) {
- ret = sysdb_get_new_id(tmpctx, ctx, domain, &id);
- if (ret) goto done;
-
- if (!attrs) {
- attrs = sysdb_new_attrs(tmpctx);
- if (!attrs) {
- ret = ENOMEM;
- goto done;
- }
- }
-
- ret = sysdb_attrs_add_uint32(attrs, SYSDB_GIDNUM, id);
- if (ret) goto done;
- }
-
if (!attrs) {
attrs = sysdb_new_attrs(tmpctx);
if (!attrs) {
@@ -1119,6 +1104,23 @@ int sysdb_add_group(TALLOC_CTX *mem_ctx,
}
}
+ ret = sysdb_attrs_get_bool(attrs, SYSDB_POSIX, &posix);
+ if (ret == ENOENT) {
+ posix = true;
+ ret = sysdb_attrs_add_bool(attrs, SYSDB_POSIX, true);
+ if (ret) goto done;
+ } else if (ret != EOK) {
+ goto done;
+ }
+
+ if (posix && gid == 0) {
+ ret = sysdb_get_new_id(tmpctx, ctx, domain, &id);
+ if (ret) goto done;
+
+ ret = sysdb_attrs_add_uint32(attrs, SYSDB_GIDNUM, id);
+ if (ret) goto done;
+ }
+
now = time(NULL);
ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
@@ -1148,7 +1150,8 @@ int sysdb_add_incomplete_group(struct sysdb_ctx *ctx,
struct sss_domain_info *domain,
const char *name,
gid_t gid,
- const char *original_dn)
+ const char *original_dn,
+ bool posix)
{
TALLOC_CTX *tmpctx;
time_t now;
@@ -1179,6 +1182,9 @@ int sysdb_add_incomplete_group(struct sysdb_ctx *ctx,
now-1);
if (ret) goto done;
+ ret = sysdb_attrs_add_bool(attrs, SYSDB_POSIX, posix);
+ if (ret) goto done;
+
if (original_dn) {
ret = sysdb_attrs_add_string(attrs, SYSDB_ORIG_DN, original_dn);
if (ret) goto done;
diff --git a/src/tests/sysdb-tests.c b/src/tests/sysdb-tests.c
index b856c093b..540fba3d5 100644
--- a/src/tests/sysdb-tests.c
+++ b/src/tests/sysdb-tests.c
@@ -268,7 +268,7 @@ static int test_add_incomplete_group(struct test_data *data)
int ret;
ret = sysdb_add_incomplete_group(data->ctx->sysdb, data->ctx->domain,
- data->groupname, data->gid, NULL);
+ data->groupname, data->gid, NULL, true);
return ret;
}
@@ -2743,7 +2743,7 @@ START_TEST(test_odd_characters)
/* Add */
ret = sysdb_add_incomplete_group(test_ctx->sysdb, test_ctx->domain,
- odd_groupname, 20000, NULL);
+ odd_groupname, 20000, NULL, true);
fail_unless(ret == EOK, "sysdb_add_incomplete_group error [%d][%s]",
ret, strerror(ret));