static WERROR backup_registry_key(struct registry_key_handle *krecord, const char *fname) { REGF_FILE *regfile; WERROR result; /* open the registry file....fail if the file already exists */ regfile = regfio_open(fname, (O_RDWR|O_CREAT|O_EXCL), (S_IRUSR|S_IWUSR)); if (regfile == NULL) { DEBUG(0,("backup_registry_key: failed to open \"%s\" (%s)\n", fname, strerror(errno) )); return ntstatus_to_werror(map_nt_error_from_unix(errno)); } /* write the registry tree to the file */ result = reg_write_tree(regfile, krecord->name, NULL); /* cleanup */ regfio_close(regfile); return result; }
static WERROR restore_registry_key(struct registry_key_handle *krecord, const char *fname) { REGF_FILE *regfile; REGF_NK_REC *rootkey; WERROR result; /* open the registry file....fail if the file already exists */ regfile = regfio_open(fname, (O_RDONLY), 0); if (regfile == NULL) { DEBUG(0, ("restore_registry_key: failed to open \"%s\" (%s)\n", fname, strerror(errno))); return ntstatus_to_werror(map_nt_error_from_unix(errno)); } /* get the rootkey from the regf file and then load the tree via recursive calls */ if (!(rootkey = regfio_rootkey(regfile))) { regfio_close(regfile); return WERR_REG_FILE_INVALID; } result = reg_load_tree(regfile, krecord->name, rootkey); /* cleanup */ regfio_close(regfile); return result; }
int main( int argc, char *argv[] ) { TALLOC_CTX *frame = talloc_stackframe(); int opt; REGF_FILE *infile, *outfile; REGF_NK_REC *nk; char *orig_filename, *new_filename; struct poptOption long_options[] = { POPT_AUTOHELP { "change-sid", 'c', POPT_ARG_STRING, NULL, 'c', "Provides SID to change" }, { "new-sid", 'n', POPT_ARG_STRING, NULL, 'n', "Provides SID to change to" }, { "verbose", 'v', POPT_ARG_NONE, &opt_verbose, 'v', "Verbose output" }, POPT_COMMON_SAMBA POPT_COMMON_VERSION POPT_TABLEEND }; poptContext pc; load_case_tables(); /* setup logging options */ setup_logging( "profiles", DEBUG_STDERR); pc = poptGetContext("profiles", argc, (const char **)argv, long_options, POPT_CONTEXT_KEEP_FIRST); poptSetOtherOptionHelp(pc, "<profilefile>"); /* Now, process the arguments */ while ((opt = poptGetNextOpt(pc)) != -1) { switch (opt) { case 'c': change = 1; if (!string_to_sid(&old_sid, poptGetOptArg(pc))) { fprintf(stderr, "Argument to -c should be a SID in form of S-1-5-...\n"); poptPrintUsage(pc, stderr, 0); exit(254); } break; case 'n': new_val = 1; if (!string_to_sid(&new_sid, poptGetOptArg(pc))) { fprintf(stderr, "Argument to -n should be a SID in form of S-1-5-...\n"); poptPrintUsage(pc, stderr, 0); exit(253); } break; } } poptGetArg(pc); if (!poptPeekArg(pc)) { poptPrintUsage(pc, stderr, 0); exit(1); } if ((!change && new_val) || (change && !new_val)) { fprintf(stderr, "You must specify both -c and -n if one or the other is set!\n"); poptPrintUsage(pc, stderr, 0); exit(252); } orig_filename = talloc_strdup(frame, poptPeekArg(pc)); if (!orig_filename) { exit(ENOMEM); } new_filename = talloc_asprintf(frame, "%s.new", orig_filename); if (!new_filename) { exit(ENOMEM); } if (!(infile = regfio_open( orig_filename, O_RDONLY, 0))) { fprintf( stderr, "Failed to open %s!\n", orig_filename ); fprintf( stderr, "Error was (%s)\n", strerror(errno) ); exit (1); } if ( !(outfile = regfio_open( new_filename, (O_RDWR|O_CREAT|O_TRUNC), (S_IRUSR|S_IWUSR) )) ) { fprintf( stderr, "Failed to open new file %s!\n", new_filename ); fprintf( stderr, "Error was (%s)\n", strerror(errno) ); exit (1); } /* actually do the update now */ if ((nk = regfio_rootkey( infile )) == NULL) { fprintf(stderr, "Could not get rootkey\n"); exit(3); } if (!copy_registry_tree( infile, nk, NULL, outfile, "")) { fprintf(stderr, "Failed to write updated registry file!\n"); exit(2); } /* cleanup */ regfio_close(infile); regfio_close(outfile); poptFreeContext(pc); TALLOC_FREE(frame); return 0; }