fd = jcr->file_bsock;
fileset = jcr->fileset;
- msgsave = fd->msg;
-
fd->msglen = sprintf(fd->msg, inc);
bnet_send(fd);
for (i=0; i < fileset->num_includes; i++) {
- fd->msglen = strlen(fileset->include_array[i]);
+ BPIPE *bpipe;
+ FILE *ffd;
+ char buf[1000];
+ char *p;
+
Dmsg1(120, "dird>filed: include file: %s\n", fileset->include_array[i]);
- fd->msg = fileset->include_array[i];
- if (!bnet_send(fd)) {
- fd->msg = msgsave;
- Emsg0(M_FATAL, 0, _(">filed: write error on socket\n"));
- jcr->JobStatus = JS_ErrorTerminated;
- return 0;
+ p = fileset->include_array[i];
+ skip_nonspaces(&p);
+ skip_spaces(&p);
+ switch (*p++) {
+ case '|':
+ fd->msg = edit_job_codes(jcr, fd->msg, p, "");
+ Dmsg1(000, "Doing bopen: %s\n", fd->msg);
+ bpipe = open_bpipe(fd->msg, 0, "r");
+ if (!bpipe) {
+ Jmsg(jcr, M_FATAL, 0, _("Cannot run program: %s. ERR=%s\n"),
+ p, strerror(errno));
+ goto bail_out;
+ }
+ Dmsg0(000, "Call fgets\n");
+ while (fgets(buf, sizeof(buf), bpipe->rfd)) {
+ fd->msglen = Mmsg(&fd->msg, "%s", buf);
+ Dmsg2(000, "Including len=%d: %s", fd->msglen, fd->msg);
+ if (!bnet_send(fd)) {
+ Jmsg(jcr, M_FATAL, 0, _(">filed: write error on socket\n"));
+ goto bail_out;
+ }
+ }
+ Dmsg0(000, "Close bpipe\n");
+ close_bpipe(bpipe);
+ break;
+ case '<':
+ if ((ffd = fopen(p, "r")) == NULL) {
+ Jmsg(jcr, M_FATAL, 0, _("Cannot open included file: %s. ERR=%s\n"),
+ p, strerror(errno));
+ goto bail_out;
+ }
+ while (fgets(buf, sizeof(buf), ffd)) {
+ fd->msglen = Mmsg(&fd->msg, "%s", buf);
+ if (!bnet_send(fd)) {
+ Jmsg(jcr, M_FATAL, 0, _(">filed: write error on socket\n"));
+ goto bail_out;
+ }
+ }
+ fclose(ffd);
+ break;
+ default:
+ msgsave = fd->msg;
+ fd->msg = fileset->include_array[i];
+ fd->msglen = strlen(fileset->include_array[i]);
+ if (!bnet_send(fd)) {
+ Jmsg(jcr, M_FATAL, 0, _(">filed: write error on socket\n"));
+ goto bail_out;
+ }
+ fd->msg = msgsave;
+ break;
}
}
bnet_sig(fd, BNET_EOD); /* end of data */
- fd->msg = msgsave;
if (!response(fd, OKinc, "Include")) {
- jcr->JobStatus = JS_ErrorTerminated;
- return 0;
+ goto bail_out;
}
return 1;
+
+bail_out:
+ jcr->JobStatus = JS_ErrorTerminated;
+ return 0;
+
}
/*
Dmsg1(120, "dird>filed: exclude file: %s\n", fileset->exclude_array[i]);
fd->msg = fileset->exclude_array[i];
if (!bnet_send(fd)) {
- Emsg0(M_FATAL, 0, _(">filed: write error on socket\n"));
+ Jmsg(jcr, M_FATAL, 0, _(">filed: write error on socket\n"));
jcr->JobStatus = JS_ErrorTerminated;
return 0;
}
case FT_RAW:
Dmsg1(130, "FT_RAW saving: %s\n", ff_pkt->fname);
break;
+ case FT_FIFO:
+ Dmsg1(130, "FT_FIFO saving: %s\n", ff_pkt->fname);
+ break;
case FT_NOACCESS:
Jmsg(jcr, M_NOTSAVED, -1, _(" Could not access %s: ERR=%s\n"), ff_pkt->fname,
strerror(ff_pkt->ff_errno));
}
if (ff_pkt->type != FT_LNKSAVED && (S_ISREG(ff_pkt->statp.st_mode) &&
- ff_pkt->statp.st_size > 0) || ff_pkt->type == FT_RAW) {
+ ff_pkt->statp.st_size > 0) ||
+ ff_pkt->type == FT_RAW || ff_pkt->type == FT_FIFO) {
if ((ff_pkt->fid = open(ff_pkt->fname, O_RDONLY | O_BINARY)) < 0) {
ff_pkt->ff_errno = errno;
Jmsg(jcr, M_NOTSAVED, -1, _(" Cannot open %s: ERR=%s.\n"), ff_pkt->fname, strerror(ff_pkt->ff_errno));
case FT_DIR:
case FT_SPEC:
case FT_RAW:
+ case FT_FIFO:
break;
case FT_NOACCESS:
case FT_NOFOLLOW:
while (bnet_recv(dir) >= 0) {
dir->msg[dir->msglen] = 0;
strip_trailing_junk(dir->msg);
- Dmsg1(110, "filed<dird: include file %s\n", dir->msg);
+ Dmsg1(010, "include file: %s\n", dir->msg);
add_fname_to_include_list(jcr->ff, 1, dir->msg);
}
int32_t n;
int fid, stat;
struct MD5Context md5c;
- unsigned char signature[16];
+ unsigned char signature[20];
BSOCK *dir;
JCR *jcr = (JCR *)pkt;
case FT_RAW:
Dmsg1(30, "FT_RAW saving: %s\n", ff_pkt->fname);
break;
+ case FT_FIFO:
+ Dmsg1(30, "FT_FIFO saving: %s\n", ff_pkt->fname);
+ break;
case FT_NOACCESS:
Jmsg(jcr, M_NOTSAVED, -1, _(" Could not access %s: ERR=%s\n"), ff_pkt->fname, strerror(ff_pkt->ff_errno));
return 1;
Jmsg(jcr, M_NOTSAVED, -1, _(" Could not follow link %s: ERR=%s\n"), ff_pkt->fname, strerror(ff_pkt->ff_errno));
return 1;
case FT_NOSTAT:
- Jmsg(jcr, M_NOTSAVED, -1, _(" Could not stat %s: ERR=%s\n"), ff_pkt->fname, strerror(ff_pkt->ff_errno));
+ Jmsg(jcr, M_NOTSAVED, -1, _(" Could not stat %s: ERR=%s\n"), ff_pkt->fname, strerror(ff_pkt->ff_errno));
return 1;
case FT_DIRNOCHG:
case FT_NOCHG:
if (ff_pkt->type != FT_LNKSAVED && (S_ISREG(ff_pkt->statp.st_mode) &&
- ff_pkt->statp.st_size > 0) || ff_pkt->type == FT_RAW) {
+ ff_pkt->statp.st_size > 0) ||
+ ff_pkt->type == FT_RAW || ff_pkt->type == FT_FIFO) {
if ((fid = open(ff_pkt->fname, O_RDONLY | O_BINARY)) < 0) {
ff_pkt->ff_errno = errno;
Jmsg(jcr, M_NOTSAVED, -1, _(" Cannot open %s: ERR=%s.\n"), ff_pkt->fname, strerror(ff_pkt->ff_errno));
}
return CF_CREATED;
case FT_RAW:
+ case FT_FIFO:
case FT_SPEC:
if (S_ISFIFO(statp->st_mode)) {
Dmsg1(200, "Restore fifo: %s\n", ofile);
return CF_ERROR;
}
}
- if (type == FT_RAW) {
- Dmsg1(200, "FT_RAW %s\n", ofile);
+ if (type == FT_RAW || type == FT_FIFO) {
+ Dmsg1(200, "FT_RAW|FT_FIFO %s\n", ofile);
mode = O_WRONLY | O_BINARY;
if ((*ofd = open(ofile, mode)) < 0) {
Jmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"), ofile, strerror(errno));
#define FT_NOFSCHG 14 /* Different file system, prohibited */
#define FT_NOOPEN 15 /* Could not open directory */
#define FT_RAW 16 /* Raw block device */
+#define FT_FIFO 17 /* Raw fifo device */
/* Options saved in "flag" of ff packet */
#define FO_MD5 0x01 /* Do MD5 checksum */
/*
* If it is explicitly mentioned (i.e. top_level) and is
- * a block device, we do a raw backup of it.
+ * a block device, we do a raw backup of it or if it is
+ * a fifo, we simply read it.
*/
- if (top_level && S_ISBLK(ff_pkt->statp.st_mode)) {
+ if (top_level && S_ISBLK(ff_pkt->statp.st_mode) {
ff_pkt->type = FT_RAW; /* raw partition */
+ } else if (top_level && S_ISFIFO(ff_pkt->statp.st_mode) {
+ ff_pkt->type = FT_FIFO;
} else {
/* The only remaining types are special (character, ...) files */
ff_pkt->type = FT_SPEC;
-
-/*
- * Edit job codes into main command line
- * %% = %
- * %j = Job name
- * %t = Job type (Backup, ...)
- * %e = Job Exit code
- * %i = JobId
- * %l = job level
- * %c = Client's name
- * %r = Recipients
- * %d = Director's name
- *
- * omsg = edited output message
- * imsg = input string containing edit codes (%x)
- * to = recepients list
- *
- */
-static char *edit_job_codes(JCR *jcr, char *omsg, char *imsg, char *to)
-{
- char *p, *str;
- char add[20];
-
- *omsg = 0;
- Dmsg1(200, "edit_job_codes: %s\n", imsg);
- for (p=imsg; *p; p++) {
- if (*p == '%') {
- switch (*++p) {
- case '%':
- str = "%";
- break;
- case 'c':
- str = jcr->client_name;
- if (!str) {
- str = "";
- }
- break;
- case 'd':
- str = my_name; /* Director's name */
- break;
- case 'e':
- str = job_status_to_str(jcr->JobStatus);
- break;
- case 'i':
- sprintf(add, "%d", jcr->JobId);
- str = add;
- break;
- case 'j': /* Job name */
- str = jcr->Job;
- break;
- case 'l':
- str = job_level_to_str(jcr->JobLevel);
- break;
- case 'r':
- str = to;
- break;
- case 't':
- str = job_type_to_str(jcr->JobType);
- break;
- default:
- add[0] = '%';
- add[1] = *p;
- add[2] = 0;
- str = add;
- break;
- }
- } else {
- add[0] = *p;
- add[1] = 0;
- str = add;
- }
- Dmsg1(1200, "add_str %s\n", str);
- pm_strcat(&omsg, str);
- Dmsg1(1200, "omsg=%s\n", omsg);
- }
- return omsg;
-}
-
static void make_unique_spool_filename(JCR *jcr, POOLMEM **name, int fd)
{
Mmsg(name, "%s/%s.spool.%s.%d", working_directory, my_name,
POOLMEM *pool_buf;
pool_buf = get_pool_memory(PM_EMSG);
- sprintf(pool_buf, "%s:%d ", file, line);
- i = strlen(pool_buf);
+ i = sprintf(pool_buf, "%s:%d ", file, line);
again:
maxlen = sizeof_pool_memory(pool_buf) - i - 1;
BPIPE * open_bpipe(char *prog, int wait, char *mode);
int close_wpipe(BPIPE *bpipe);
int close_bpipe(BPIPE *bpipe);
+POOLMEM *edit_job_codes(void *jcr, char *omsg, char *imsg, char *to);
/* watchdog.c */
}
}
#undef nextrand
+
+
+
+/*
+ * Edit job codes into main command line
+ * %% = %
+ * %j = Job name
+ * %t = Job type (Backup, ...)
+ * %e = Job Exit code
+ * %i = JobId
+ * %l = job level
+ * %c = Client's name
+ * %r = Recipients
+ * %d = Director's name
+ *
+ * omsg = edited output message
+ * imsg = input string containing edit codes (%x)
+ * to = recepients list
+ *
+ */
+POOLMEM *edit_job_codes(void *mjcr, char *omsg, char *imsg, char *to)
+{
+ char *p, *str;
+ char add[20];
+ JCR *jcr = (JCR *)mjcr;
+
+ *omsg = 0;
+ Dmsg1(200, "edit_job_codes: %s\n", imsg);
+ for (p=imsg; *p; p++) {
+ if (*p == '%') {
+ switch (*++p) {
+ case '%':
+ str = "%";
+ break;
+ case 'c':
+ str = jcr->client_name;
+ if (!str) {
+ str = "";
+ }
+ break;
+ case 'd':
+ str = my_name; /* Director's name */
+ break;
+ case 'e':
+ str = job_status_to_str(jcr->JobStatus);
+ break;
+ case 'i':
+ sprintf(add, "%d", jcr->JobId);
+ str = add;
+ break;
+ case 'j': /* Job name */
+ str = jcr->Job;
+ break;
+ case 'l':
+ str = job_level_to_str(jcr->JobLevel);
+ break;
+ case 'r':
+ str = to;
+ break;
+ case 't':
+ str = job_type_to_str(jcr->JobType);
+ break;
+ default:
+ add[0] = '%';
+ add[1] = *p;
+ add[2] = 0;
+ str = add;
+ break;
+ }
+ } else {
+ add[0] = *p;
+ add[1] = 0;
+ str = add;
+ }
+ Dmsg1(1200, "add_str %s\n", str);
+ pm_strcat(&omsg, str);
+ Dmsg1(1200, "omsg=%s\n", omsg);
+ }
+ return omsg;
+}
+
/* */
-#define VERSION "1.29"
+#define VERSION "1.28b"
#define VSTRING "1"
#define DATE "6 January 2003"
#define LSMDATE "06Jan03"