X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=client-src%2Fclient_util.c;h=bbd94b5e8667dcd684903bf8894d32efcac29123;hb=e7c9810a75f51ad43cc8e18f92099d7f717d6da7;hp=89365ce44aab90e3a69c312f5615f227885396cb;hpb=b221e8dc16f345f8c8d7df8df71f4d36daaabb4c;p=debian%2Famanda diff --git a/client-src/client_util.c b/client-src/client_util.c index 89365ce..bbd94b5 100644 --- a/client-src/client_util.c +++ b/client-src/client_util.c @@ -1,6 +1,7 @@ /* * Amanda, The Advanced Maryland Automatic Network Disk Archiver * Copyright (c) 1991-1998 University of Maryland at College Park + * Copyright (c) 2007-2012 Zmanda, Inc. All Rights Reserved. * All Rights Reserved. * * Permission to use, copy, modify, distribute, and sell this software and its @@ -1166,7 +1167,7 @@ run_client_script( levellist_t levellist; char number[NUM_STR_SIZE]; for (levellist=dle->levellist; levellist; levellist=levellist->next) { - level_t *alevel = (level_t *)levellist->data; + am_level_t *alevel = (am_level_t *)levellist->data; g_ptr_array_add(argv_ptr, stralloc("--level")); g_snprintf(number, SIZEOF(number), "%d", alevel->level); g_ptr_array_add(argv_ptr, stralloc(number)); @@ -1258,6 +1259,7 @@ run_client_script( } void run_client_script_output(gpointer data, gpointer user_data); +void run_client_script_output_backup(gpointer data, gpointer user_data); void run_client_script_err_amcheck(gpointer data, gpointer user_data); void run_client_script_err_estimate(gpointer data, gpointer user_data); void run_client_script_err_backup(gpointer data, gpointer user_data); @@ -1281,6 +1283,19 @@ run_client_script_output( } } +void +run_client_script_output_backup( + gpointer data, + gpointer user_data) +{ + char *line = data; + script_output_t *so = user_data; + + if (line && so->stream) { + g_fprintf(so->stream, "| %s\n", line); + } +} + void run_client_script_err_amcheck( gpointer data, @@ -1345,31 +1360,27 @@ run_client_scripts( GSList *scriptlist; script_t *script; GFunc client_script_err = NULL; + GFunc client_script_out = NULL; script_output_t so = { streamout, dle }; for (scriptlist = dle->scriptlist; scriptlist != NULL; scriptlist = scriptlist->next) { script = (script_t *)scriptlist->data; run_client_script(script, execute_on, g_options, dle); - if (script->result && script->result->output) { - g_ptr_array_foreach(script->result->output, - run_client_script_output, - &so); - g_ptr_array_free(script->result->output, TRUE); - script->result->output = NULL; - } - if (script->result && script->result->err) { + if (script->result) { switch (execute_on) { case EXECUTE_ON_PRE_DLE_AMCHECK: case EXECUTE_ON_PRE_HOST_AMCHECK: case EXECUTE_ON_POST_DLE_AMCHECK: case EXECUTE_ON_POST_HOST_AMCHECK: + client_script_out = run_client_script_output; client_script_err = run_client_script_err_amcheck; break; case EXECUTE_ON_PRE_DLE_ESTIMATE: case EXECUTE_ON_PRE_HOST_ESTIMATE: case EXECUTE_ON_POST_DLE_ESTIMATE: case EXECUTE_ON_POST_HOST_ESTIMATE: + client_script_out = run_client_script_output; if (am_has_feature(g_options->features, fe_sendsize_rep_warning)) { client_script_err = run_client_script_err_estimate; @@ -1379,6 +1390,7 @@ run_client_scripts( case EXECUTE_ON_PRE_HOST_BACKUP: case EXECUTE_ON_POST_DLE_BACKUP: case EXECUTE_ON_POST_HOST_BACKUP: + client_script_out = run_client_script_output_backup; client_script_err = run_client_script_err_backup; break; case EXECUTE_ON_PRE_RECOVER: @@ -1386,15 +1398,27 @@ run_client_scripts( case EXECUTE_ON_PRE_LEVEL_RECOVER: case EXECUTE_ON_POST_LEVEL_RECOVER: case EXECUTE_ON_INTER_LEVEL_RECOVER: + client_script_out = run_client_script_output; client_script_err = run_client_script_err_recover; } - if (client_script_err != NULL) { - g_ptr_array_foreach(script->result->err, - client_script_err, - &so); + if (script->result->output) { + if (client_script_out) { + g_ptr_array_foreach(script->result->output, + client_script_out, + &so); + } + g_ptr_array_free(script->result->output, TRUE); + script->result->output = NULL; + } + if (script->result->err) { + if (client_script_err != NULL) { + g_ptr_array_foreach(script->result->err, + client_script_err, + &so); + } + g_ptr_array_free(script->result->err, TRUE); + script->result->err = NULL; } - g_ptr_array_free(script->result->err, TRUE); - script->result->err = NULL; } } } @@ -1425,7 +1449,6 @@ run_calcsize( FILE *dumpout = NULL; int dumpsince; char *errmsg = NULL; - off_t size = (off_t)1; char *line = NULL; amwait_t wait_status; int len; @@ -1521,7 +1544,7 @@ run_calcsize( match_expr = vstralloc(" %d SIZE %lld", NULL); len = strlen(qdisk); - for(size = (off_t)-1; (line = agets(dumpout)) != NULL; free(line)) { + for(; (line = agets(dumpout)) != NULL; free(line)) { long long size_ = (long long)0; if (line[0] == '\0' || (int)strlen(line) <= len) continue; @@ -1532,7 +1555,6 @@ run_calcsize( dbprintf(_("estimate size for %s level %d: %lld KB\n"), qdisk, level, size_); } - size = (off_t)size_; } amfree(match_expr); @@ -1576,11 +1598,10 @@ common_exit: amfree(errmsg); g_ptr_array_free_full(argv_ptr); amfree(cmd); - } -void +gboolean check_access( char * filename, int mode) @@ -1597,14 +1618,18 @@ check_access( else noun = "access", adjective = "accessible"; - if(access(filename, mode) == -1) + if(access(filename, mode) == -1) { g_printf(_("ERROR [can not %s %s: %s]\n"), noun, quoted, strerror(errno)); - else + amfree(quoted); + return FALSE; + } else { g_printf(_("OK %s %s\n"), quoted, adjective); + } amfree(quoted); + return TRUE; } -void +gboolean check_file( char * filename, int mode) @@ -1617,6 +1642,7 @@ check_file( quoted = quote_string(filename); g_printf(_("ERROR [%s is not a file]\n"), quoted); amfree(quoted); + return FALSE; } } else { int save_errno = errno; @@ -1624,13 +1650,19 @@ check_file( g_printf(_("ERROR [can not stat %s: %s]\n"), quoted, strerror(save_errno)); amfree(quoted); + return FALSE; } if (getuid() == geteuid()) { - check_access(filename, mode); + return check_access(filename, mode); + } else { + quoted = quote_string(filename); + g_printf("OK %s\n", quoted); + amfree(quoted); } + return TRUE; } -void +gboolean check_dir( char * dirname, int mode) @@ -1644,6 +1676,7 @@ check_dir( quoted = quote_string(dirname); g_printf(_("ERROR [%s is not a directory]\n"), quoted); amfree(quoted); + return FALSE; } } else { int save_errno = errno; @@ -1651,15 +1684,23 @@ check_dir( g_printf(_("ERROR [can not stat %s: %s]\n"), quoted, strerror(save_errno)); amfree(quoted); + return FALSE; } if (getuid() == geteuid()) { + gboolean result; dir = stralloc2(dirname, "/."); - check_access(dir, mode); + result = check_access(dir, mode); amfree(dir); + return result; + } else { + quoted = quote_string(dirname); + g_printf("OK %s\n", quoted); + amfree(quoted); } + return TRUE; } -void +gboolean check_suid( char * filename) { @@ -1670,18 +1711,25 @@ check_suid( if(!stat(filename, &stat_buf)) { if(stat_buf.st_uid != 0 ) { g_printf(_("ERROR [%s is not owned by root]\n"), quoted); + amfree(quoted); + return FALSE; } if((stat_buf.st_mode & S_ISUID) != S_ISUID) { g_printf(_("ERROR [%s is not SUID root]\n"), quoted); + amfree(quoted); + return FALSE; } } else { g_printf(_("ERROR [can not stat %s: %s]\n"), quoted, strerror(errno)); + amfree(quoted); + return FALSE; } amfree(quoted); #else (void)filename; /* Quiet unused parameter warning */ #endif + return TRUE; } /*