/*
* 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
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));
}
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);
}
}
+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,
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;
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:
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;
}
}
}
FILE *dumpout = NULL;
int dumpsince;
char *errmsg = NULL;
- off_t size = (off_t)1;
char *line = NULL;
amwait_t wait_status;
int len;
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;
dbprintf(_("estimate size for %s level %d: %lld KB\n"),
qdisk, level, size_);
}
- size = (off_t)size_;
}
amfree(match_expr);
amfree(errmsg);
g_ptr_array_free_full(argv_ptr);
amfree(cmd);
-
}
-void
+gboolean
check_access(
char * filename,
int mode)
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)
quoted = quote_string(filename);
g_printf(_("ERROR [%s is not a file]\n"), quoted);
amfree(quoted);
+ return FALSE;
}
} else {
int save_errno = errno;
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)
quoted = quote_string(dirname);
g_printf(_("ERROR [%s is not a directory]\n"), quoted);
amfree(quoted);
+ return FALSE;
}
} else {
int save_errno = errno;
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)
{
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;
}
/*