*/
/* base64.c */
-void base64_init (void);
-int to_base64 (intmax_t value, char *where);
-int from_base64 (intmax_t *value, char *where);
-void encode_stat (char *buf, struct stat *statp);
-void decode_stat (char *buf, struct stat *statp);
-int bin_to_base64 (char *buf, char *bin, int len);
+void base64_init (void);
+int to_base64 (intmax_t value, char *where);
+int from_base64 (intmax_t *value, char *where);
+void encode_stat (char *buf, struct stat *statp);
+void decode_stat (char *buf, struct stat *statp);
+int bin_to_base64 (char *buf, char *bin, int len);
/* bmisc.c */
-void *b_malloc (char *file, int line, size_t size);
+void *b_malloc (char *file, int line, size_t size);
#ifndef DEBUG
-void *bmalloc (size_t size);
+void *bmalloc (size_t size);
#endif
-void *brealloc (void *buf, size_t size);
-void *bcalloc (size_t size1, size_t size2);
-int bsnprintf (char *str, size_t size, const char *format, ...);
-int bvsnprintf (char *str, size_t size, const char *format, va_list ap);
-int pool_sprintf (char *pool_buf, char *fmt, ...);
-void create_pid_file (char *dir, char *progname, int port);
-int delete_pid_file (char *dir, char *progname, int port);
+void *brealloc (void *buf, size_t size);
+void *bcalloc (size_t size1, size_t size2);
+int bsnprintf (char *str, size_t size, const char *format, ...);
+int bvsnprintf (char *str, size_t size, const char *format, va_list ap);
+int pool_sprintf (char *pool_buf, char *fmt, ...);
+void create_pid_file (char *dir, char *progname, int port);
+int delete_pid_file (char *dir, char *progname, int port);
#ifndef HAVE_STRERROR_R
-int strerror_r (int errnum, char *buf, size_t bufsiz);
+int strerror_r (int errnum, char *buf, size_t bufsiz);
#endif
/* bnet.c */
-int32_t bnet_recv (BSOCK *bsock);
-int bnet_send (BSOCK *bsock);
-int bnet_fsend (BSOCK *bs, char *fmt, ...);
-int bnet_set_buffer_size (BSOCK *bs, uint32_t size, int rw);
-int bnet_sig (BSOCK *bs, int sig);
-BSOCK * bnet_connect (void *jcr, int retry_interval,
- int max_retry_time, char *name, char *host, char *service,
- int port, int verbose);
-int bnet_wait_data (BSOCK *bsock, int sec);
-void bnet_close (BSOCK *bsock);
-BSOCK * init_bsock (int sockfd, char *who, char *ip, int port);
-BSOCK * dup_bsock (BSOCK *bsock);
-void term_bsock (BSOCK *bsock);
-char * bnet_strerror (BSOCK *bsock);
-char * bnet_sig_to_ascii (BSOCK *bsock);
-int bnet_wait_data (BSOCK *bsock, int sec);
+int32_t bnet_recv (BSOCK *bsock);
+int bnet_send (BSOCK *bsock);
+int bnet_fsend (BSOCK *bs, char *fmt, ...);
+int bnet_set_buffer_size (BSOCK *bs, uint32_t size, int rw);
+int bnet_sig (BSOCK *bs, int sig);
+BSOCK * bnet_connect (void *jcr, int retry_interval,
+ int max_retry_time, char *name, char *host, char *service,
+ int port, int verbose);
+int bnet_wait_data (BSOCK *bsock, int sec);
+void bnet_close (BSOCK *bsock);
+BSOCK * init_bsock (int sockfd, char *who, char *ip, int port);
+BSOCK * dup_bsock (BSOCK *bsock);
+void term_bsock (BSOCK *bsock);
+char * bnet_strerror (BSOCK *bsock);
+char * bnet_sig_to_ascii (BSOCK *bsock);
+int bnet_wait_data (BSOCK *bsock, int sec);
/* cram-md5.c */
int cram_md5_get_auth(BSOCK *bs, char *password);
int cram_md5_auth(BSOCK *bs, char *password);
void hmac_md5(uint8_t* text, int text_len, uint8_t* key,
- int key_len, uint8_t *hmac);
+ int key_len, uint8_t *hmac);
/* create_file.c */
int create_file(void *jcr, char *fname, char *ofile, char *lname,
- int type, struct stat *statp, int *ofd);
+ int type, struct stat *statp, int *ofd);
int set_statp(void *jcr, char *fname, char *ofile, char *lname, int type,
- struct stat *statp);
+ struct stat *statp);
/* crc32.c */
uint32_t bcrc32(uint8_t *buf, int len);
/* daemon.c */
-void daemon_start ();
+void daemon_start ();
/* lex.c */
-LEX * lex_close_file (LEX *lf);
-LEX * lex_open_file (LEX *lf, char *fname, LEX_ERROR_HANDLER *scan_error);
-int lex_get_char (LEX *lf);
-void lex_unget_char (LEX *lf);
-char * lex_tok_to_str (int token);
-int lex_get_token (LEX *lf, int expect);
+LEX * lex_close_file (LEX *lf);
+LEX * lex_open_file (LEX *lf, char *fname, LEX_ERROR_HANDLER *scan_error);
+int lex_get_char (LEX *lf);
+void lex_unget_char (LEX *lf);
+char * lex_tok_to_str (int token);
+int lex_get_token (LEX *lf, int expect);
/* makepath.c */
int make_path(
- void *jcr,
- const char *argpath,
- int mode,
- int parent_mode,
- uid_t owner,
- gid_t group,
- int preserve_existing,
- char *verbose_fmt_string);
+ void *jcr,
+ const char *argpath,
+ int mode,
+ int parent_mode,
+ uid_t owner,
+ gid_t group,
+ int preserve_existing,
+ char *verbose_fmt_string);
/* message.c */
-void my_name_is (int argc, char *argv[], char *name);
-void init_msg (void *jcr, MSGS *msg);
-void term_msg (void);
-void close_msg (void *jcr);
-void add_msg_dest (MSGS *msg, int dest, int type, char *where, char *dest_code);
-void rem_msg_dest (MSGS *msg, int dest, int type, char *where);
-void Jmsg (void *jcr, int type, int level, char *fmt, ...);
-void dispatch_message (void *jcr, int type, int level, char *buf);
-void init_console_msg (char *wd);
-void free_msgs_res (MSGS *msgs);
+void my_name_is (int argc, char *argv[], char *name);
+void init_msg (void *jcr, MSGS *msg);
+void term_msg (void);
+void close_msg (void *jcr);
+void add_msg_dest (MSGS *msg, int dest, int type, char *where, char *dest_code);
+void rem_msg_dest (MSGS *msg, int dest, int type, char *where);
+void Jmsg (void *jcr, int type, int level, char *fmt, ...);
+void dispatch_message (void *jcr, int type, int level, char *buf);
+void init_console_msg (char *wd);
+void free_msgs_res (MSGS *msgs);
/* bnet_server.c */
-void bnet_thread_server(int port, int max_clients, workq_t *client_wq,
- void handle_client_request(void *bsock));
-void bnet_server (int port, void handle_client_request(BSOCK *bsock));
-int net_connect (int port);
-BSOCK * bnet_bind (int port);
-BSOCK * bnet_accept (BSOCK *bsock, char *who);
+void bnet_thread_server(int port, int max_clients, workq_t *client_wq,
+ void handle_client_request(void *bsock));
+void bnet_server (int port, void handle_client_request(BSOCK *bsock));
+int net_connect (int port);
+BSOCK * bnet_bind (int port);
+BSOCK * bnet_accept (BSOCK *bsock, char *who);
/* signal.c */
-void init_signals (void terminate(int sig));
-void init_stack_dump (void);
+void init_signals (void terminate(int sig));
+void init_stack_dump (void);
/* util.c */
-void lcase (char *str);
-void bash_spaces (char *str);
-void unbash_spaces (char *str);
-void strip_trailing_junk (char *str);
-void strip_trailing_slashes (char *dir);
-int skip_spaces (char **msg);
-int skip_nonspaces (char **msg);
-int fstrsch (char *a, char *b);
-char * encode_time (time_t time, char *buf);
-char * encode_mode (mode_t mode, char *buf);
-char * edit_uint64_with_commas (uint64_t val, char *buf);
-char * add_commas (char *val, char *buf);
-char * edit_uint64 (uint64_t val, char *buf);
-int do_shell_expansion (char *name);
-int is_a_number (const char *num);
-int string_to_btime (char *str, btime_t *value);
-char *edit_btime (btime_t val, char *buf);
-void jobstatus_to_ascii (int JobStatus, char *msg, int maxlen);
-void add_str_to_pool_mem (POOLMEM **base, char **msg, char *str);
-int run_program (char *prog, int wait, POOLMEM *results);
+void lcase (char *str);
+void bash_spaces (char *str);
+void unbash_spaces (char *str);
+void strip_trailing_junk (char *str);
+void strip_trailing_slashes (char *dir);
+int skip_spaces (char **msg);
+int skip_nonspaces (char **msg);
+int fstrsch (char *a, char *b);
+char * encode_time (time_t time, char *buf);
+char * encode_mode (mode_t mode, char *buf);
+char * edit_uint64_with_commas (uint64_t val, char *buf);
+char * add_commas (char *val, char *buf);
+char * edit_uint64 (uint64_t val, char *buf);
+int do_shell_expansion (char *name);
+int is_a_number (const char *num);
+int string_to_btime (char *str, btime_t *value);
+char *edit_btime (btime_t val, char *buf);
+void jobstatus_to_ascii (int JobStatus, char *msg, int maxlen);
+void add_str_to_pool_mem (POOLMEM **base, char **msg, char *str);
+int run_program (char *prog, int wait, POOLMEM *results);
+char * job_type_to_str (int type);
+char * job_status_to_str (int stat);
+char * job_level_to_str (int level);
/*
- *void print_ls_output (char *fname, char *lname, int type, struct stat *statp);
+ *void print_ls_output (char *fname, char *lname, int type, struct stat *statp);
*/
/* watchdog.c */
msg[maxlen-1] = 0;
}
+/*
+ * Convert Job Termination Status into a string
+ */
+char *job_status_to_str(int stat)
+{
+ char *str;
+
+ switch (stat) {
+ case JS_Terminated:
+ str = "OK";
+ break;
+ case JS_ErrorTerminated:
+ case JS_Error:
+ str = "Error";
+ break;
+ case JS_FatalError:
+ str = "Fatal Error";
+ break;
+ case JS_Cancelled:
+ str = "Cancelled";
+ break;
+ case JS_Differences:
+ str = "Differences";
+ break;
+ default:
+ str = "Unknown term code";
+ break;
+ }
+ return str;
+}
+
+
+/*
+ * Convert Job Type into a string
+ */
+char *job_type_to_str(int type)
+{
+ char *str;
+
+ switch (type) {
+ case JT_BACKUP:
+ str = "Backup";
+ break;
+ case JT_VERIFY:
+ str = "Verify";
+ break;
+ case JT_RESTORE:
+ str = "Restore";
+ break;
+ default:
+ str = "Unknown Job Type";
+ break;
+ }
+ return str;
+}
+
+/*
+ * Convert Job Level into a string
+ */
+char *job_level_to_str(int level)
+{
+ char *str;
+
+ switch (level) {
+ case L_FULL:
+ str = "full";
+ break;
+ case L_INCREMENTAL:
+ str = "incremental";
+ break;
+ case L_DIFFERENTIAL:
+ str = "differential";
+ break;
+ case L_LEVEL:
+ str = "level";
+ break;
+ case L_SINCE:
+ str = "since";
+ break;
+ case L_VERIFY_CATALOG:
+ str = "verify catalog";
+ break;
+ case L_VERIFY_INIT:
+ str = "verify init";
+ break;
+ case L_VERIFY_VOLUME_TO_CATALOG:
+ str = "verify volume to catalog";
+ break;
+ case L_VERIFY_DATA:
+ str = "verify data";
+ break;
+ default:
+ str = "Unknown Job level";
+ break;
+ }
+ return str;
+}
+
+
/***********************************************************************
* Encode the mode bits into a 10 character string like LS does
***********************************************************************/
}
#define MAX_ARGV 100
-static char *bargv[MAX_ARGV];
-static int bargc;
-static void build_argc_argv(char *cmd);
+static void build_argc_argv(char *cmd, int *bargc, char *bargv[], int max_arg);
+/*
+ * Run an external program. Optionally wait a specified number
+ * of seconds. Program killed if wait exceeded. Optionally
+ * return the output from the program (normally a single line).
+ */
int run_program(char *prog, int wait, POOLMEM *results)
{
int stat = ETIME;
int chldstatus = 0;
pid_t pid1, pid2;
int pfd[2];
+ char *bargv[MAX_ARGV];
+ int bargc;
- build_argc_argv(prog);
-#ifdef xxxxxxxxxxx
+ build_argc_argv(prog, &bargc, bargv, MAX_ARGV);
+#ifdef xxxxxxxxxx
printf("argc=%d\n", bargc);
int i;
for (i=0; i<bargc; i++) {
default: /* parent */
/* start timer process */
- switch (pid2=fork()) {
- case -1:
- break;
- case 0: /* child 2 */
- /* Time the worker process */
- sleep(wait);
- if (kill(pid1, SIGTERM) == 0) { /* time expired kill it */
+ if (wait > 0) {
+ switch (pid2=fork()) {
+ case -1:
+ break;
+ case 0: /* child 2 */
+ /* Time the worker process */
+ sleep(wait);
+ if (kill(pid1, SIGTERM) == 0) { /* time expired kill it */
+ exit(0);
+ }
+ sleep(3);
+ kill(pid1, SIGKILL);
exit(0);
+ default: /* parent */
+ break;
}
- sleep(3);
- kill(pid1, SIGKILL);
- exit(0);
- default: /* parent */
- int i;
- if (results) {
- i = read(pfd[0], results, sizeof_pool_memory(results) - 1);
- if (--i < 0) {
- i = 0;
- }
- results[i] = 0; /* set end of string */
+ }
+
+ /* Parent continues here */
+ int i;
+ if (results) {
+ i = read(pfd[0], results, sizeof_pool_memory(results) - 1);
+ if (--i < 0) {
+ i = 0;
}
- /* wait for worker child to exit */
- for ( ;; ) {
- pid_t wpid;
- wpid = waitpid(pid1, &chldstatus, 0);
- if (wpid == pid1 || (errno != EINTR)) {
- break;
- }
+ results[i] = 0; /* set end of string */
+ }
+ /* wait for worker child to exit */
+ for ( ;; ) {
+ pid_t wpid;
+ wpid = waitpid(pid1, &chldstatus, 0);
+ if (wpid == pid1 || (errno != EINTR)) {
+ break;
}
- if (WIFEXITED(chldstatus))
- stat = WEXITSTATUS(chldstatus);
+ }
+ if (WIFEXITED(chldstatus))
+ stat = WEXITSTATUS(chldstatus);
+ if (wait > 0) {
kill(pid2, SIGKILL); /* kill off timer process */
waitpid(pid2, &chldstatus, 0); /* reap timer process */
- if (results) {
- close(pfd[0]); /* close pipe */
- close(pfd[1]);
- }
- break;
+ }
+ if (results) {
+ close(pfd[0]); /* close pipe */
+ close(pfd[1]);
}
break;
}
/*
* Build argc and argv from a string
*/
-static void build_argc_argv(char *cmd)
+static void build_argc_argv(char *cmd, int *bargc, char *bargv[], int max_argv)
{
int i, quote;
char *p, *q;
+ int argc = 0;
- bargc = 0;
- for (i=0; i<MAX_ARGV; i++)
+ argc = 0;
+ for (i=0; i<max_argv; i++)
bargv[i] = NULL;
p = cmd;
p++;
}
if (*p) {
- while (*p && bargc < MAX_ARGV) {
+ while (*p && argc < MAX_ARGV) {
q = p;
if (quote) {
while (*q && *q != '\"')
}
if (*q)
*(q++) = '\0';
- bargv[bargc++] = p;
+ bargv[argc++] = p;
p = q;
while (*p && (*p == ' ' || *p == '\t'))
p++;
}
}
}
+ *bargc = argc;
}