diff options
author | Michael Adam <obnox@samba.org> | 2013-09-11 01:05:02 +0200 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2013-10-02 00:50:09 +0200 |
commit | 350916c11d879d2289f7518625547b88e8dd5705 (patch) | |
tree | f50996d48c6d311b340f6950ec851dfc175834c8 | |
parent | 8371f5981dea11ac29451ccccac345e5a0350b5d (diff) | |
download | samba-350916c11d879d2289f7518625547b88e8dd5705.tar.gz samba-350916c11d879d2289f7518625547b88e8dd5705.tar.bz2 samba-350916c11d879d2289f7518625547b88e8dd5705.zip |
net: implement "net idmap get range"
get the range for a domain sid and range index.
Signed-off-by: Michael Adam <obnox@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
-rw-r--r-- | source3/utils/net_idmap.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/source3/utils/net_idmap.c b/source3/utils/net_idmap.c index 39040343f6..e151bf90a0 100644 --- a/source3/utils/net_idmap.c +++ b/source3/utils/net_idmap.c @@ -915,6 +915,84 @@ static int net_idmap_set(struct net_context *c, int argc, const char **argv) return net_run_function(c, argc, argv, "net idmap set", func); } +static void net_idmap_autorid_get_range_usage(void) +{ + d_printf("%s\n%s", + _("Usage:"), + _("net idmap get range <SID> [<index>] [--db=<inputfile>]\n" + " Get the range for a given domain and index.\n" + " SID\t\tSID of the domain\n" + " index\trange-index number to be retrieved\n" + " inputfile\tTDB file to add mapping to.\n")); +} + + +static int net_idmap_autorid_get_range(struct net_context *c, int argc, + const char **argv) +{ + int ret = -1; + TALLOC_CTX *mem_ctx; + struct db_context *db = NULL; + const char *domsid; + uint32_t rangenum; + uint32_t range_index = 0; + uint32_t low_id; + NTSTATUS status; + char *keystr; + bool ok; + + if (c->display_usage) { + net_idmap_autorid_get_range_usage(); + return 0; + } + + if (argc < 1 || argc > 2) { + net_idmap_autorid_get_range_usage(); + return -1; + } + + domsid = argv[0]; + + if (argc == 2) { + ok = parse_uint32(argv[1], &range_index); + if (!ok) { + d_printf("%s: %s\n", + _("Invalid index specification"), argv[1]); + net_idmap_autorid_get_range_usage(); + return -1; + } + } + + mem_ctx = talloc_stackframe(); + if (!net_idmap_opendb_autorid(mem_ctx, c, true, &db)) { + goto done; + } + + status = idmap_autorid_getrange(db, domsid, range_index, &rangenum, + &low_id); + if (!NT_STATUS_IS_OK(status)) { + d_fprintf(stderr, "%s: %s\n", + _("Failed to load domain range"), nt_errstr(status)); + goto done; + } + + if (range_index == 0) { + keystr = talloc_strdup(mem_ctx, domsid); + } else { + keystr = talloc_asprintf(mem_ctx, "%s#%"PRIu32, domsid, + range_index); + } + + printf("RANGE %"PRIu32": %s (low id: %"PRIu32")\n", + rangenum, keystr, low_id); + + ret = 0; + +done: + TALLOC_FREE(mem_ctx); + return ret; +} + static int net_idmap_autorid_get_config(struct net_context *c, int argc, const char **argv) { @@ -961,6 +1039,14 @@ static int net_idmap_get(struct net_context *c, int argc, const char **argv) { struct functable func[] = { { + "range", + net_idmap_autorid_get_range, + NET_TRANSPORT_LOCAL, + N_("Get the range for a domain and range-index"), + N_("net idmap get range\n" + " Get the range for a domain and range-index") + }, + { "config", net_idmap_autorid_get_config, NET_TRANSPORT_LOCAL, |