summaryrefslogtreecommitdiff
path: root/source3/utils
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2003-06-14 17:51:09 +0000
committerVolker Lendecke <vlendec@samba.org>2003-06-14 17:51:09 +0000
commitbd1333ea74f14d01310a4307db5101578ec16ee5 (patch)
treedabb785f574a7b8b320f39b6db7dfc56cda06d88 /source3/utils
parentb85664047c188126e3ba06862198c1acd4f218ac (diff)
downloadsamba-bd1333ea74f14d01310a4307db5101578ec16ee5.tar.gz
samba-bd1333ea74f14d01310a4307db5101578ec16ee5.tar.bz2
samba-bd1333ea74f14d01310a4307db5101578ec16ee5.zip
Add 'net idmap restore'. This restores a broken idmap file
from the output of 'net idmap dump'. 'net idmap dump' now also prints the USER/GROUP HWM. Volker (This used to be commit c0575be936572bb091a77c58361bd3a4fe9549ff)
Diffstat (limited to 'source3/utils')
-rw-r--r--source3/utils/net.c70
-rw-r--r--source3/utils/net_help.c3
2 files changed, 73 insertions, 0 deletions
diff --git a/source3/utils/net.c b/source3/utils/net.c
index d8f3264840..2b1609e225 100644
--- a/source3/utils/net.c
+++ b/source3/utils/net.c
@@ -376,6 +376,16 @@ static int net_idmap_dump_one_entry(TDB_CONTEXT *tdb,
TDB_DATA data,
void *unused)
{
+ if (strcmp(key.dptr, "USER HWM") == 0) {
+ printf("USER HWM %d\n", IVAL(data.dptr,0));
+ return 0;
+ }
+
+ if (strcmp(key.dptr, "GROUP HWM") == 0) {
+ printf("GROUP HWM %d\n", IVAL(data.dptr,0));
+ return 0;
+ }
+
if (strncmp(key.dptr, "S-", 2) != 0)
return 0;
@@ -408,6 +418,63 @@ static int net_idmap_dump(int argc, const char **argv)
}
/***********************************************************
+ Write entries from stdin to current local idmap
+ **********************************************************/
+static int net_idmap_restore(int argc, const char **argv)
+{
+ if (!idmap_init()) {
+ d_printf("Could not init idmap\n");
+ return -1;
+ }
+
+ while (!feof(stdin)) {
+ fstring line, sid_string;
+ int len;
+ unid_t id;
+ int type = ID_EMPTY;
+ DOM_SID sid;
+
+ if (fgets(line, sizeof(line)-1, stdin) == NULL)
+ break;
+
+ len = strlen(line);
+
+ if ( (len > 0) && (line[len-1] == '\n') )
+ line[len-1] = '\0';
+
+ if (sscanf(line, "GID %d %s", &id.gid, sid_string) == 2) {
+ type = ID_GROUPID;
+ }
+
+ if (sscanf(line, "UID %d %s", &id.uid, sid_string) == 2) {
+ type = ID_USERID;
+ }
+
+ if (type == ID_EMPTY) {
+ d_printf("ignoring invalid line [%s]\n", line);
+ continue;
+ }
+
+ if (!string_to_sid(&sid, sid_string)) {
+ d_printf("ignoring invalid sid [%s]\n", sid_string);
+ continue;
+ }
+
+ if (!NT_STATUS_IS_OK(idmap_set_mapping(&sid, id, type))) {
+ d_printf("Could not set mapping of %s %d to sid %s\n",
+ (type == ID_GROUPID) ? "GID" : "UID",
+ (type == ID_GROUPID) ? id.gid : id.uid,
+ sid_string_static(&sid));
+ continue;
+ }
+
+ }
+
+ idmap_close();
+ return 0;
+}
+
+/***********************************************************
Look at the current idmap
**********************************************************/
static int net_idmap(int argc, const char **argv)
@@ -418,6 +485,9 @@ static int net_idmap(int argc, const char **argv)
if ( !StrCaseCmp( argv[0], "dump" ) )
return net_idmap_dump(argc-1, argv+1);
+ if ( !StrCaseCmp( argv[0], "restore" ) )
+ return net_idmap_restore(argc-1, argv+1);
+
return net_help_idmap( argc, argv );
}
diff --git a/source3/utils/net_help.c b/source3/utils/net_help.c
index 16db55480e..941baf3378 100644
--- a/source3/utils/net_help.c
+++ b/source3/utils/net_help.c
@@ -123,6 +123,9 @@ int net_help_idmap(int argc, const char **argv)
d_printf("net idmap dump filename"\
"\n Dump current id mapping\n");
+ d_printf("net idmap restore"\
+ "\n Restore entries from stdin to current local idmap\n");
+
return -1;
}