📄 sendsize.c
字号:
else#endif /* } */#ifdef VXDUMP /* { */#ifdef DUMP /* { */ if (strcmp(fstype, "vxfs") == 0)#else /* } { */ if (1)#endif /* } */ {#ifdef USE_RUNDUMP name = stralloc(" (vxdump)");#else name = stralloc(""); cmd = newstralloc(cmd, VXDUMP); config = skip_argument; is_rundump = 0;#endif dumpkeys = vstralloc(level_str, "s", "f", NULL); dbprintf(_("running \"%s%s %s 1048576 - %s\"\n"), cmd, name, dumpkeys, qdevice); } else#endif /* } */#ifdef VDUMP /* { */#ifdef DUMP /* { */ if (strcmp(fstype, "advfs") == 0)#else /* } { */ if (1)#endif /* } */ { name = stralloc(" (vdump)"); amfree(device); amfree(qdevice); device = amname_to_dirname(amdevice); qdevice = quote_string(device); dumpkeys = vstralloc(level_str, "b", "f", NULL); dbprintf(_("running \"%s%s %s 60 - %s\"\n"), cmd, name, dumpkeys, qdevice); } else#endif /* } */#ifdef DUMP /* { */ if (1) {# ifdef USE_RUNDUMP /* { */# ifdef AIX_BACKUP /* { */ name = stralloc(" (backup)");# else /* } { */ name = vstralloc(" (", DUMP, ")", NULL);# endif /* } */# else /* } { */ name = stralloc(""); cmd = newstralloc(cmd, DUMP); config = skip_argument; is_rundump = 0;# endif /* } */# ifdef AIX_BACKUP /* { */ dumpkeys = vstralloc("-", level_str, "f", NULL); dbprintf(_("running \"%s%s %s - %s\"\n"), cmd, name, dumpkeys, qdevice);# else /* } { */# ifdef HAVE_DUMP_ESTIMATE# define PARAM_DUMP_ESTIMATE HAVE_DUMP_ESTIMATE# else# define PARAM_DUMP_ESTIMATE ""# endif# ifdef HAVE_HONOR_NODUMP# define PARAM_HONOR_NODUMP "h"# else# define PARAM_HONOR_NODUMP ""# endif dumpkeys = vstralloc(level_str, PARAM_DUMP_ESTIMATE, PARAM_HONOR_NODUMP, "s", "f", NULL);# ifdef HAVE_DUMP_ESTIMATE stdoutfd = pipefd[1];# endif# ifdef HAVE_HONOR_NODUMP /* { */ dbprintf(_("running \"%s%s %s 0 1048576 - %s\"\n"), cmd, name, dumpkeys, qdevice);# else /* } { */ dbprintf(_("running \"%s%s %s 1048576 - %s\"\n"), cmd, name, dumpkeys, qdevice);# endif /* } */# endif /* } */ } else#endif /* } */ { error(_("no dump program available")); /*NOTREACHED*/ } if (pipe(killctl) < 0) { dbprintf(_("Could not create pipe: %s\n"), strerror(errno)); /* Message will be printed later... */ killctl[0] = killctl[1] = -1; } start_time = curclock(); switch(dumppid = fork()) { case -1: *errmsg = vstrallocf(_("cannot fork for killpgrp: %s"), strerror(errno)); dbprintf("%s\n", *errmsg); amfree(dumpkeys); amfree(cmd); amfree(rundump_cmd); amfree(device); amfree(qdevice); amfree(qdisk); amfree(name); amfree(fstype); return -1; default: break; case 0: /* child process */ if(SETPGRP == -1) SETPGRP_FAILED(); else if (killctl[0] == -1 || killctl[1] == -1) dbprintf(_("Trying without killpgrp\n")); else { switch(fork()) { case -1: dbprintf(_("fork failed, trying without killpgrp\n")); break; default: { char *config; char *killpgrp_cmd = vstralloc(amlibexecdir, "/killpgrp", versionsuffix(), NULL); dbprintf(_("running %s\n"), killpgrp_cmd); dup2(killctl[0], 0); dup2(nullfd, 1); dup2(nullfd, 2); close(pipefd[0]); close(pipefd[1]); close(killctl[1]); close(nullfd); if (g_options->config) config = g_options->config; else config = "NOCONFIG"; safe_fd(-1, 0); execle(killpgrp_cmd, killpgrp_cmd, config, (char *)0, safe_env()); dbprintf(_("cannot execute %s: %s\n"), killpgrp_cmd, strerror(errno)); exit(-1); } case 0: /* child process */ break; } } dup2(nullfd, 0); dup2(stdoutfd, 1); dup2(pipefd[1], 2); aclose(pipefd[0]); if (killctl[0] != -1) aclose(killctl[0]); if (killctl[1] != -1) aclose(killctl[1]); safe_fd(-1, 0);#ifdef XFSDUMP#ifdef DUMP if (strcmp(fstype, "xfs") == 0)#else if (1)#endif if (is_rundump) execle(cmd, "rundump", config, "xfsdump", "-F", "-J", "-l", level_str, "-", device, (char *)0, safe_env()); else execle(cmd, "xfsdump", "-F", "-J", "-l", level_str, "-", device, (char *)0, safe_env()); else#endif#ifdef VXDUMP#ifdef DUMP if (strcmp(fstype, "vxfs") == 0)#else if (1)#endif if (is_rundump) execle(cmd, "rundump", config, "vxdump", dumpkeys, "1048576", "-", device, (char *)0, safe_env()); else execle(cmd, "vxdump", dumpkeys, "1048576", "-", device, (char *)0, safe_env()); else#endif#ifdef VDUMP#ifdef DUMP if (strcmp(fstype, "advfs") == 0)#else if (1)#endif if (is_rundump) execle(cmd, "rundump", config, "vdump", dumpkeys, "60", "-", device, (char *)0, safe_env()); else execle(cmd, "vdump", dumpkeys, "60", "-", device, (char *)0, safe_env()); else#endif#ifdef DUMP# ifdef AIX_BACKUP if (is_rundump) execle(cmd, "rundump", config, "backup", dumpkeys, "-", device, (char *)0, safe_env()); else execle(cmd, "backup", dumpkeys, "-", device, (char *)0, safe_env());# else if (is_rundump) { execle(cmd, "rundump", config, "dump", dumpkeys, #ifdef HAVE_HONOR_NODUMP "0",#endif "1048576", "-", device, (char *)0, safe_env()); } else { execle(cmd, "dump", dumpkeys, #ifdef HAVE_HONOR_NODUMP "0",#endif "1048576", "-", device, (char *)0, safe_env()); }# endif#endif { error(_("exec %s failed or no dump program available: %s"), cmd, strerror(errno)); /*NOTREACHED*/ } } amfree(dumpkeys); amfree(rundump_cmd); aclose(pipefd[1]); if (killctl[0] != -1) aclose(killctl[0]); dumpout = fdopen(pipefd[0],"r"); if (!dumpout) { error(_("Can't fdopen: %s"), strerror(errno)); /*NOTREACHED*/ } for(size = (off_t)-1; (line = agets(dumpout)) != NULL; free(line)) { if (line[0] == '\0') continue; dbprintf("%s\n", line); size = handle_dumpline(line); if(size > (off_t)-1) { amfree(line); while ((line = agets(dumpout)) != NULL) { if (line[0] != '\0') break; amfree(line); } if (line != NULL) { dbprintf("%s\n", line); } break; } } amfree(line); dbprintf(".....\n"); dbprintf(_("estimate time for %s level %d: %s\n"), qdisk, level, walltime_str(timessub(curclock(), start_time))); if(size == (off_t)-1) { *errmsg = vstrallocf(_("no size line match in %s%s output"), cmd, name); dbprintf(_("%s for %s\n"), *errmsg, qdisk); dbprintf(".....\n"); dbprintf(_("Run %s%s manually to check for errors\n"), cmd, name); } else if(size == (off_t)0 && level == 0) { dbprintf(_("possible %s%s problem -- is \"%s\" really empty?\n"), cmd, name, disk); dbprintf(".....\n"); } else { dbprintf(_("estimate size for %s level %d: %lld KB\n"), qdisk, level, (long long)size); } if (killctl[1] != -1) { dbprintf(_("asking killpgrp to terminate\n")); aclose(killctl[1]); for(s = 5; s > 0; --s) { sleep(1); if (waitpid(dumppid, NULL, WNOHANG) != -1) goto terminated; } } /* * First, try to kill the dump process nicely. If it ignores us * for several seconds, hit it harder. */ dbprintf(_("sending SIGTERM to process group %ld\n"), (long)dumppid); if (kill(-dumppid, SIGTERM) == -1) { dbprintf(_("kill failed: %s\n"), strerror(errno)); } /* Now check whether it dies */ for(s = 5; s > 0; --s) { sleep(1); if (waitpid(dumppid, NULL, WNOHANG) != -1) goto terminated; } dbprintf(_("sending SIGKILL to process group %ld\n"), (long)dumppid); if (kill(-dumppid, SIGKILL) == -1) { dbprintf(_("kill failed: %s\n"), strerror(errno)); } for(s = 5; s > 0; --s) { sleep(1); if (waitpid(dumppid, NULL, WNOHANG) != -1) goto terminated; } dbprintf(_("waiting for %s%s \"%s\" child\n"), cmd, name, qdisk); waitpid(dumppid, &wait_status, 0); if (WIFSIGNALED(wait_status)) { *errmsg = vstrallocf(_("%s terminated with signal %d: see %s"), cmd, WTERMSIG(wait_status), dbfn()); } else if (WIFEXITED(wait_status)) { if (WEXITSTATUS(wait_status) != 0) { *errmsg = vstrallocf(_("%s exited with status %d: see %s"), cmd, WEXITSTATUS(wait_status), dbfn()); } else { /* Normal exit */ } } else { *errmsg = vstrallocf(_("%s got bad exit: see %s"), cmd, dbfn()); } dbprintf(_("after %s%s %s wait\n"), cmd, name, qdisk); terminated: aclose(nullfd); afclose(dumpout); amfree(device); amfree(qdevice); amfree(qdisk); amfree(fstype); amfree(cmd); amfree(name); return size;}#ifdef SAMBA_CLIENToff_tgetsize_smbtar( char *disk, char *amdevice, int level, option_t *options, char **errmsg){ int pipefd = -1, nullfd = -1, passwdfd = -1; pid_t dumppid; off_t size; FILE *dumpout; char *tarkeys, *sharename, *user_and_password = NULL, *domain = NULL; char *share = NULL, *subdir = NULL; size_t lpass; char *pwtext; size_t pwtext_len; char *line; char *pw_fd_env; times_t start_time; char *error_pn = NULL; char *qdisk = quote_string(disk); amwait_t wait_status; (void)options; /* Quiet unused parameter warning */ error_pn = stralloc2(get_pname(), "-smbclient"); parsesharename(amdevice, &share, &subdir); if (!share) { amfree(share); amfree(subdir); set_pname(error_pn); amfree(error_pn); error(_("cannot parse disk entry %s for share/subdir"), qdisk); /*NOTREACHED*/ } if ((subdir) && (SAMBA_VERSION < 2)) { amfree(share); amfree(subdir); set_pname(error_pn); amfree(error_pn); error(_("subdirectory specified for share %s but samba not v2 or better"), qdisk); /*NOTREACHED*/ } if ((user_and_password = findpass(share, &domain)) == NULL) { if(domain) { memset(domain, '\0', strlen(domain)); amfree(domain); } set_pname(error_pn); amfree(error_pn); error(_("cannot find password for %s"), disk); /*NOTREACHED*/ } lpass = strlen(user_and_password); if ((pwtext = strchr(user_and_password, '%')) == NULL) { memset(user_and_password, '\0', (size_t)lpass); amfree(user_and_password); if(domain) { memset(domain, '\0', strlen(domain)); amfree(domain); } set_pname(error_pn); amfree(error_pn); error(_("password field not \'user%%pass\' for %s"), disk); /*NOTREACHED*/ } *pwtext++ = '\0'; pwtext_len = strlen(pwtext); if ((sharename = makesharename(share, 0)) == NULL) { memset(user_and_password, '\0', (size_t)lpass); amfree(user_and_password); if(domain) { memset(domain, '\0', strlen(domain)); amfree(domain); } set_pname(error_pn); amfree(error_pn); error(_("cannot make share name of %s"), share); /*NOTREACHED*/ } if ((nullfd = open("/dev/null", O_RDWR)) == -1) { memset(user_and_password, '\0', (size_t)lpass); amfree(user_and_password); if(domain) { memset(domain, '\0', strlen(domain)); amfree(domain); } set_pname(error_pn); amfree(error_pn); amfree(sharename); error(_("could not open /dev/null: %s\n"), strerror(errno)); /*NOTREACHED*/ }#if SAMBA_VERSION >= 2 if (level == 0) tarkeys = "archive 0;recurse;du"; else tarkeys = "archive 1;recurse;du";#else if (level == 0) tarkeys = "archive 0;recurse;dir"; else tarkeys = "archive 1;recurse;dir";#endif start_time = curclock(); if (pwtext_len > 0) { pw_fd_env = "PASSWD_FD"; } else { pw_fd_env = "dummy_PASSWD_FD"; } dumppid = pipespawn(SAMBA_CLIENT, STDERR_PIPE|PASSWD_PIPE, &nullfd, &nullfd, &pipefd, pw_fd_env, &passwdfd, "smbclient", sharename, "-d", SAMBA_DEBUG_LEVEL, *user_and_password ? "-U" : skip_argument, *user_and_password ? user_and_password : skip_argument, "-E", domain ? "-W" : skip_argument, domain ? domain : skip_argument,#if SAMBA_VERSION >= 2 subdir ? "-D" : skip_argument, subdir ? subdir : skip_argument,#endif "-c", tarkeys, NULL); if(domain) { memset(domain, '\0', strlen(domain)); amfree(domain); } aclose(nullfd); if(pwtext_len > 0 && fullwrite(passwdfd, pwtext, (size_t)pwtext_len) < 0) { int save_errno = errno; memset(user_and_password, '\0', (size_t)lpass); amfree(user_and_password); aclose(passwdfd); set_pname(error_pn); amfree(error_pn); error(_("password write failed: %s"), strerror(save_errno)); /*NOTREACHED*/ } memset(user_and_password, '\0', (size_t)lpass); amfree(user_and_password); aclose(passwdfd); amfree(sharename); amfree(share); amfree(subdir); amfree(error_pn); dumpout = fdopen(pipefd,"r"); if (!dumpout) { error(_("Can't fdopen: %s"), strerror(errno)); /*NOTREACHED*/ } for(size = (off_t)-1; (line = agets(dumpout)) != NULL; free(line)) { if (line[0] == '\0') continue; dbprintf("%s\n", line); size = handle_dumpline(line); if(size > -1) { amfree(line); while ((line = agets(dumpout)) != NULL) { if (line[0] != '\0') break; amfree(line); } if(line != NULL) { dbprintf("%s\n", line); } break; } } amfree(line); dbprintf(".....\n"); dbprintf(_("estimate time for %s level %d: %s\n"), qdisk, level, walltime_str(timessub(curclock(), start_time))); if(size == (off_t)-1) { *errmsg = vstrallocf(_("no size line match in %s output"), SAMBA_CLIENT); dbprintf(_("%s for %s\n"), *errmsg, qdisk); dbprintf(".....\n"); } else if(size == (off_t)0 && level == 0) { dbprintf(_("possible %s problem -- is \"%s\" really empty?\n"), SAMBA_CLIENT, disk); dbprintf(".....\n"); } dbprintf(_("estimate size for %s level %d: %lld KB\n"), qdisk, level, (long long)size); kill(-dumppid, SIGTERM); dbprintf(_("waiting for %s \"%s\" child\n"), SAMBA_CLIENT, qdisk); waitpid(dumppid, &wait_status, 0); if (WIFSIGNALED(wait_status)) { *errmsg = vstrallocf(_("%s terminated with signal %d: see %s"), SAMBA_CLIENT, WTERMSIG(wait_status), dbfn()); } else if (WIFEXITED(wait_status)) { if (WEXITSTATUS(wait_status) != 0) { *errmsg = vstrallocf(_("%s exited with status %d: see %s"), SAMBA_CLIENT, WEXITSTATUS(wait_status),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -