+static bool send_list_item(JCR *jcr, const char *code, char *item, BSOCK *fd)
+{
+ BPIPE *bpipe;
+ FILE *ffd;
+ char buf[2000];
+ int optlen, stat;
+ char *p = item;
+
+ switch (*p) {
+ case '|':
+ p++; /* skip over the | */
+ fd->msg = edit_job_codes(jcr, fd->msg, p, "");
+ bpipe = open_bpipe(fd->msg, 0, "r");
+ if (!bpipe) {
+ berrno be;
+ Jmsg(jcr, M_FATAL, 0, _("Cannot run program: %s. ERR=%s\n"),
+ p, be.bstrerror());
+ return false;
+ }
+ bstrncpy(buf, code, sizeof(buf));
+ Dmsg1(500, "code=%s\n", buf);
+ optlen = strlen(buf);
+ while (fgets(buf+optlen, sizeof(buf)-optlen, bpipe->rfd)) {
+ fd->msglen = Mmsg(fd->msg, "%s", buf);
+ Dmsg2(500, "Inc/exc len=%d: %s", fd->msglen, fd->msg);
+ if (!bnet_send(fd)) {
+ Jmsg(jcr, M_FATAL, 0, _(">filed: write error on socket\n"));
+ return false;
+ }
+ }
+ if ((stat=close_bpipe(bpipe)) != 0) {
+ berrno be;
+ Jmsg(jcr, M_FATAL, 0, _("Error running program: %s. ERR=%s\n"),
+ p, be.bstrerror(stat));
+ return false;
+ }
+ break;
+ case '<':
+ p++; /* skip over < */
+ if ((ffd = fopen(p, "rb")) == NULL) {
+ berrno be;
+ Jmsg(jcr, M_FATAL, 0, _("Cannot open included file: %s. ERR=%s\n"),
+ p, be.bstrerror());
+ return false;
+ }
+ bstrncpy(buf, code, sizeof(buf));
+ Dmsg1(500, "code=%s\n", buf);
+ optlen = strlen(buf);
+ while (fgets(buf+optlen, sizeof(buf)-optlen, ffd)) {
+ fd->msglen = Mmsg(fd->msg, "%s", buf);
+ if (!bnet_send(fd)) {
+ Jmsg(jcr, M_FATAL, 0, _(">filed: write error on socket\n"));
+ return false;
+ }
+ }
+ fclose(ffd);
+ break;
+ case '\\':
+ p++; /* skip over \ */
+ /* Note, fall through wanted */
+ default:
+ pm_strcpy(fd->msg, code);
+ fd->msglen = pm_strcat(fd->msg, p);
+ Dmsg1(500, "Inc/Exc name=%s\n", fd->msg);
+ if (!fd->send()) {
+ Jmsg(jcr, M_FATAL, 0, _(">filed: write error on socket\n"));
+ return false;
+ }
+ break;
+ }
+ return true;
+}
+