static void amgtar_restore( application_argument_t *argument) { char *cmd; GPtrArray *argv_ptr = g_ptr_array_new(); char **env; int j; char *e; char *include_filename = NULL; char *exclude_filename = NULL; int tarpid; if (!gnutar_path) { error(_("GNUTAR-PATH not defined")); } cmd = g_strdup(gnutar_path); g_ptr_array_add(argv_ptr, g_strdup(gnutar_path)); g_ptr_array_add(argv_ptr, g_strdup("--numeric-owner")); if (gnutar_no_unquote) g_ptr_array_add(argv_ptr, g_strdup("--no-unquote")); if (gnutar_acls) g_ptr_array_add(argv_ptr, g_strdup("--acls")); if (gnutar_selinux) g_ptr_array_add(argv_ptr, g_strdup("--selinux")); if (gnutar_xattrs) g_ptr_array_add(argv_ptr, g_strdup("--xattrs")); /* ignore trailing zero blocks on input (this was the default until tar-1.21) */ if (argument->ignore_zeros) { g_ptr_array_add(argv_ptr, g_strdup("--ignore-zeros")); } if (argument->tar_blocksize) { g_ptr_array_add(argv_ptr, g_strdup("--blocking-factor")); g_ptr_array_add(argv_ptr, g_strdup(argument->tar_blocksize)); } g_ptr_array_add(argv_ptr, g_strdup("-xpGvf")); g_ptr_array_add(argv_ptr, g_strdup("-")); if (gnutar_directory) { struct stat stat_buf; if(stat(gnutar_directory, &stat_buf) != 0) { fprintf(stderr,"can not stat directory %s: %s\n", gnutar_directory, strerror(errno)); exit(1); } if (!S_ISDIR(stat_buf.st_mode)) { fprintf(stderr,"%s is not a directory\n", gnutar_directory); exit(1); } if (access(gnutar_directory, W_OK) != 0) { fprintf(stderr, "Can't write to %s: %s\n", gnutar_directory, strerror(errno)); exit(1); } g_ptr_array_add(argv_ptr, g_strdup("--directory")); g_ptr_array_add(argv_ptr, g_strdup(gnutar_directory)); } g_ptr_array_add(argv_ptr, g_strdup("--wildcards")); if (argument->dle.exclude_list && argument->dle.exclude_list->nb_element == 1) { FILE *exclude; char *sdisk; int in_argv; int entry_in_exclude = 0; char line[2*PATH_MAX]; FILE *exclude_list; if (argument->dle.disk) { sdisk = sanitise_filename(argument->dle.disk); } else { sdisk = g_strdup_printf("no_dle-%d", (int)getpid()); } exclude_filename= g_strjoin(NULL, AMANDA_TMPDIR, "/", "exclude-", sdisk, NULL); exclude_list = fopen(argument->dle.exclude_list->first->name, "r"); if (!exclude_list) { fprintf(stderr, "Cannot open exclude file '%s': %s\n", argument->dle.exclude_list->first->name, strerror(errno)); error("Cannot open exclude file '%s': %s\n", argument->dle.exclude_list->first->name, strerror(errno)); /*NOTREACHED*/ } exclude = fopen(exclude_filename, "w"); if (!exclude) { fprintf(stderr, "Cannot open exclude file '%s': %s\n", exclude_filename, strerror(errno)); fclose(exclude_list); error("Cannot open exclude file '%s': %s\n", exclude_filename, strerror(errno)); /*NOTREACHED*/ } while (fgets(line, 2*PATH_MAX, exclude_list)) { char *escaped; line[strlen(line)-1] = '\0'; /* remove '\n' */ escaped = escape_tar_glob(line, &in_argv); if (in_argv) { g_ptr_array_add(argv_ptr, "--exclude"); g_ptr_array_add(argv_ptr, escaped); } else { fprintf(exclude,"%s\n", escaped); entry_in_exclude++; amfree(escaped); } } fclose(exclude_list); fclose(exclude); g_ptr_array_add(argv_ptr, g_strdup("--exclude-from")); g_ptr_array_add(argv_ptr, exclude_filename); } if (argument->exclude_list_glob) { g_ptr_array_add(argv_ptr, g_strdup("--exclude-from")); g_ptr_array_add(argv_ptr, g_strdup(argument->exclude_list_glob)); } { GPtrArray *argv_include = g_ptr_array_new(); FILE *include; char *sdisk; int in_argv; guint i; int entry_in_include = 0; if (argument->dle.disk) { sdisk = sanitise_filename(argument->dle.disk); } else { sdisk = g_strdup_printf("no_dle-%d", (int)getpid()); } include_filename = g_strjoin(NULL, AMANDA_TMPDIR, "/", "include-", sdisk, NULL); include = fopen(include_filename, "w"); if (!include) { fprintf(stderr, "Cannot open include file '%s': %s\n", include_filename, strerror(errno)); error("Cannot open include file '%s': %s\n", include_filename, strerror(errno)); /*NOTREACHED*/ } if (argument->dle.include_list && argument->dle.include_list->nb_element == 1) { char line[2*PATH_MAX]; FILE *include_list = fopen(argument->dle.include_list->first->name, "r"); if (!include_list) { fclose(include); fprintf(stderr, "Cannot open include file '%s': %s\n", argument->dle.include_list->first->name, strerror(errno)); error("Cannot open include file '%s': %s\n", argument->dle.include_list->first->name, strerror(errno)); /*NOTREACHED*/ } while (fgets(line, 2*PATH_MAX, include_list)) { char *escaped; line[strlen(line)-1] = '\0'; /* remove '\n' */ escaped = escape_tar_glob(line, &in_argv); if (in_argv) { g_ptr_array_add(argv_include, escaped); } else { fprintf(include,"%s\n", escaped); entry_in_include++; amfree(escaped); } } fclose(include_list); } for (j=1; j< argument->argc; j++) { char *escaped = escape_tar_glob(argument->argv[j], &in_argv); if (in_argv) { g_ptr_array_add(argv_include, escaped); } else { fprintf(include,"%s\n", escaped); entry_in_include++; amfree(escaped); } } fclose(include); if (entry_in_include) { g_ptr_array_add(argv_ptr, g_strdup("--files-from")); g_ptr_array_add(argv_ptr, include_filename); } if (argument->include_list_glob) { g_ptr_array_add(argv_ptr, g_strdup("--files-from")); g_ptr_array_add(argv_ptr, g_strdup(argument->include_list_glob)); } for (i = 0; i < argv_include->len; i++) { g_ptr_array_add(argv_ptr, (char *)g_ptr_array_index(argv_include,i)); } amfree(sdisk); } g_ptr_array_add(argv_ptr, NULL); debug_executing(argv_ptr); tarpid = fork(); switch (tarpid) { case -1: error(_("%s: fork returned: %s"), get_pname(), strerror(errno)); case 0: env = safe_env(); become_root(); execve(cmd, (char **)argv_ptr->pdata, env); e = strerror(errno); error(_("error [exec %s: %s]"), cmd, e); break; default: break; } waitpid(tarpid, NULL, 0); if (argument->verbose == 0) { if (exclude_filename) unlink(exclude_filename); unlink(include_filename); } amfree(cmd); amfree(include_filename); amfree(exclude_filename); }
static void amstar_restore( application_argument_t *argument) { char *cmd; GPtrArray *argv_ptr = g_ptr_array_new(); char **env; int j; char *e; if (!star_path) { error(_("STAR-PATH not defined")); } cmd = stralloc(star_path); g_ptr_array_add(argv_ptr, stralloc(star_path)); if (star_directory) { struct stat stat_buf; if(stat(star_directory, &stat_buf) != 0) { fprintf(stderr,"can not stat directory %s: %s\n", star_directory, strerror(errno)); exit(1); } if (!S_ISDIR(stat_buf.st_mode)) { fprintf(stderr,"%s is not a directory\n", star_directory); exit(1); } if (access(star_directory, W_OK) != 0 ) { fprintf(stderr, "Can't write to %s: %s\n", star_directory, strerror(errno)); exit(1); } g_ptr_array_add(argv_ptr, stralloc("-C")); g_ptr_array_add(argv_ptr, stralloc(star_directory)); } g_ptr_array_add(argv_ptr, stralloc("-x")); g_ptr_array_add(argv_ptr, stralloc("-v")); g_ptr_array_add(argv_ptr, stralloc("-xattr")); g_ptr_array_add(argv_ptr, stralloc("-acl")); g_ptr_array_add(argv_ptr, stralloc("errctl=WARN|SAMEFILE|SETTIME|DIFF|SETACL|SETXATTR|SETMODE|BADACL *")); g_ptr_array_add(argv_ptr, stralloc("-no-fifo")); g_ptr_array_add(argv_ptr, stralloc("-f")); g_ptr_array_add(argv_ptr, stralloc("-")); if (argument->dle.exclude_list && argument->dle.exclude_list->nb_element == 1) { g_ptr_array_add(argv_ptr, stralloc("-exclude-from")); g_ptr_array_add(argv_ptr, stralloc(argument->dle.exclude_list->first->name)); } if (argument->dle.include_list && argument->dle.include_list->nb_element == 1) { g_ptr_array_add(argv_ptr, stralloc2("list=", argument->dle.include_list->first->name)); } for (j=1; j< argument->argc; j++) g_ptr_array_add(argv_ptr, stralloc(argument->argv[j]+2));/*remove ./ */ g_ptr_array_add(argv_ptr, NULL); debug_executing(argv_ptr); env = safe_env(); become_root(); execve(cmd, (char **)argv_ptr->pdata, env); e = strerror(errno); error(_("error [exec %s: %s]"), cmd, e); }
char * get_first_line( GPtrArray *argv_ptr) { char *output_string = NULL; int inpipe[2], outpipe[2], errpipe[2]; int pid; FILE *out, *err; assert(argv_ptr != NULL); assert(argv_ptr->pdata != NULL); assert(argv_ptr->len >= 1); if (pipe(inpipe) == -1) { error(_("error [open pipe: %s]"), strerror(errno)); /*NOTREACHED*/ } if (pipe(outpipe) == -1) { error(_("error [open pipe: %s]"), strerror(errno)); /*NOTREACHED*/ } if (pipe(errpipe) == -1) { error(_("error [open pipe: %s]"), strerror(errno)); /*NOTREACHED*/ } fflush(stdout); switch(pid = fork()) { case -1: error(_("error [fork: %s]"), strerror(errno)); /*NOTREACHED*/ default: /* parent process */ aclose(inpipe[0]); aclose(outpipe[1]); aclose(errpipe[1]); break; case 0: /* child process */ aclose(inpipe[1]); aclose(outpipe[0]); aclose(errpipe[0]); dup2(inpipe[0], 0); dup2(outpipe[1], 1); dup2(errpipe[1], 2); debug_executing(argv_ptr); g_fprintf(stdout, "unknown\n"); execv((char *)*argv_ptr->pdata, (char **)argv_ptr->pdata); error(_("error [exec %s: %s]"), (char *)*argv_ptr->pdata, strerror(errno)); } aclose(inpipe[1]); out = fdopen(outpipe[0],"r"); err = fdopen(errpipe[0],"r"); if (out) { output_string = agets(out); fclose(out); } if (err) { if (!output_string) output_string = agets(err); fclose(err); } waitpid(pid, NULL, 0); return output_string; }
static void amstar_restore( application_argument_t *argument) { char *cmd; GPtrArray *argv_ptr = g_ptr_array_new(); char **env; int j; char *e; if (!star_path) { error(_("STAR-PATH not defined")); } cmd = g_strdup(star_path); g_ptr_array_add(argv_ptr, g_strdup(star_path)); if (star_directory) { struct stat stat_buf; if(stat(star_directory, &stat_buf) != 0) { fprintf(stderr,"can not stat directory %s: %s\n", star_directory, strerror(errno)); exit(1); } if (!S_ISDIR(stat_buf.st_mode)) { fprintf(stderr,"%s is not a directory\n", star_directory); exit(1); } if (access(star_directory, W_OK) != 0 ) { fprintf(stderr, "Can't write to %s: %s\n", star_directory, strerror(errno)); exit(1); } g_ptr_array_add(argv_ptr, g_strdup("-C")); g_ptr_array_add(argv_ptr, g_strdup(star_directory)); } g_ptr_array_add(argv_ptr, g_strdup("-x")); g_ptr_array_add(argv_ptr, g_strdup("-v")); g_ptr_array_add(argv_ptr, g_strdup("-xattr")); g_ptr_array_add(argv_ptr, g_strdup("-acl")); g_ptr_array_add(argv_ptr, g_strdup("errctl=WARN|SAMEFILE|SETTIME|DIFF|SETACL|SETXATTR|SETMODE|BADACL *")); g_ptr_array_add(argv_ptr, g_strdup("-no-fifo")); g_ptr_array_add(argv_ptr, g_strdup("-f")); g_ptr_array_add(argv_ptr, g_strdup("-")); if (argument->dle.exclude_list && argument->dle.exclude_list->nb_element == 1) { g_ptr_array_add(argv_ptr, g_strdup("-exclude-from")); g_ptr_array_add(argv_ptr, g_strdup(argument->dle.exclude_list->first->name)); } if (argument->dle.include_list && argument->dle.include_list->nb_element == 1) { FILE *include_list = fopen(argument->dle.include_list->first->name, "r"); if (include_list) { char line[2*PATH_MAX+2]; while (fgets(line, 2*PATH_MAX, include_list)) { line[strlen(line)-1] = '\0'; /* remove '\n' */ if (strncmp(line, "./", 2) == 0) g_ptr_array_add(argv_ptr, g_strdup(line+2)); /* remove ./ */ else if (strcmp(line, ".") != 0) g_ptr_array_add(argv_ptr, g_strdup(line)); } fclose(include_list); } } for (j=1; j< argument->argc; j++) { if (strncmp(argument->argv[j], "./", 2) == 0) g_ptr_array_add(argv_ptr, g_strdup(argument->argv[j]+2));/*remove ./ */ else if (strcmp(argument->argv[j], ".") != 0) g_ptr_array_add(argv_ptr, g_strdup(argument->argv[j])); } g_ptr_array_add(argv_ptr, NULL); debug_executing(argv_ptr); env = safe_env(); become_root(); execve(cmd, (char **)argv_ptr->pdata, env); e = strerror(errno); error(_("error [exec %s: %s]"), cmd, e); }