Blame ndmp-src/ndma_data_pfe.c

Packit Service 392537
/*
Packit Service 392537
 * Copyright (c) 1998,1999,2000
Packit Service 392537
 *	Traakan, Inc., Los Altos, CA
Packit Service 392537
 *	All rights reserved.
Packit Service 392537
 *
Packit Service 392537
 * Redistribution and use in source and binary forms, with or without
Packit Service 392537
 * modification, are permitted provided that the following conditions
Packit Service 392537
 * are met:
Packit Service 392537
 * 1. Redistributions of source code must retain the above copyright
Packit Service 392537
 *    notice unmodified, this list of conditions, and the following
Packit Service 392537
 *    disclaimer.
Packit Service 392537
 * 2. Redistributions in binary form must reproduce the above copyright
Packit Service 392537
 *    notice, this list of conditions and the following disclaimer in the
Packit Service 392537
 *    documentation and/or other materials provided with the distribution.
Packit Service 392537
 *
Packit Service 392537
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
Packit Service 392537
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit Service 392537
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit Service 392537
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
Packit Service 392537
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit Service 392537
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit Service 392537
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit Service 392537
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
Packit Service 392537
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
Packit Service 392537
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
Packit Service 392537
 * SUCH DAMAGE.
Packit Service 392537
 */
Packit Service 392537
Packit Service 392537
/*
Packit Service 392537
 * Project:  NDMJOB
Packit Service 392537
 * Ident:    $Id: $
Packit Service 392537
 *
Packit Service 392537
 * Description:
Packit Service 392537
 *
Packit Service 392537
 */
Packit Service 392537
Packit Service 392537
Packit Service 392537
#include "ndmagents.h"
Packit Service 392537
Packit Service 392537
#ifndef NDMOS_OPTION_NO_DATA_AGENT
Packit Service 392537
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmda_pipe_fork_exec (struct ndm_session *sess, char *cmd, int is_backup)
Packit Service 392537
{
Packit Service 392537
	struct ndm_data_agent *	da = &sess->data_acb;
Packit Service 392537
	struct ndmchan *	ch;
Packit Service 392537
	int			errpipe[2];
Packit Service 392537
	int			datpipe[2];
Packit Service 392537
	int			wrppipe[2];
Packit Service 392537
	int			nullfd;
Packit Service 392537
	int			rc = -1;
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 2, "Starting %s", cmd);
Packit Service 392537
Packit Service 392537
	nullfd = open ("/dev/null", 2);
Packit Service 392537
	if (nullfd < 0) {
Packit Service 392537
		return rc;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	rc = pipe (errpipe);
Packit Service 392537
	if (rc < 0) {
Packit Service 392537
		close (nullfd);
Packit Service 392537
		return rc;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	rc = pipe (datpipe);
Packit Service 392537
	if (rc < 0) {
Packit Service 392537
		close (nullfd);
Packit Service 392537
		close (errpipe[0]);
Packit Service 392537
		close (errpipe[1]);
Packit Service 392537
		return rc;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	rc = pipe (wrppipe);
Packit Service 392537
	if (rc < 0) {
Packit Service 392537
		close (nullfd);
Packit Service 392537
		close (errpipe[0]);
Packit Service 392537
		close (errpipe[1]);
Packit Service 392537
		close (datpipe[0]);
Packit Service 392537
		close (datpipe[1]);
Packit Service 392537
		return rc;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	rc = fork();
Packit Service 392537
	if (rc < 0) {
Packit Service 392537
		close (nullfd);
Packit Service 392537
		close (errpipe[0]);
Packit Service 392537
		close (errpipe[1]);
Packit Service 392537
		close (datpipe[0]);
Packit Service 392537
		close (datpipe[1]);
Packit Service 392537
		close (wrppipe[0]);
Packit Service 392537
		close (wrppipe[1]);
Packit Service 392537
		return rc;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (rc == 0) {
Packit Service 392537
		/* child */
Packit Service 392537
		dup2 (errpipe[1], 2);
Packit Service 392537
		dup2 (wrppipe[1], 3);
Packit Service 392537
		close (errpipe[0]);
Packit Service 392537
		close (wrppipe[0]);
Packit Service 392537
Packit Service 392537
		if (is_backup) {
Packit Service 392537
			dup2 (nullfd, 0);
Packit Service 392537
			dup2 (datpipe[1], 1);
Packit Service 392537
			close (datpipe[0]);
Packit Service 392537
		} else {
Packit Service 392537
			dup2 (datpipe[0], 0);
Packit Service 392537
			dup2 (nullfd, 1);
Packit Service 392537
			close (datpipe[1]);
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		/*
Packit Service 392537
		 * 0 -- formatter stdin
Packit Service 392537
		 * 1 -- formatter stdout
Packit Service 392537
		 * 2 -- formatter stderr
Packit Service 392537
		 * 3 -- formatter wrap chan (wraplib.c)
Packit Service 392537
		 */
Packit Service 392537
		for (rc = 4; rc < 100; rc++) {
Packit Service 392537
			close(rc);
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		execl ("/bin/sh", "sh", "-c", cmd, NULL);
Packit Service 392537
Packit Service 392537
		fprintf (stderr, "EXEC FAILED %s\n", cmd);
Packit Service 392537
		exit(127);
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	/* parent */
Packit Service 392537
	close (nullfd);
Packit Service 392537
Packit Service 392537
	ch = &da->formatter_error;
Packit Service 392537
	ndmchan_initialize (ch, "dfp-error");
Packit Service 392537
	ndmchan_setbuf (ch, da->fmt_error_buf, sizeof da->fmt_error_buf);
Packit Service 392537
	close (errpipe[1]);
Packit Service 392537
	ndmos_condition_pipe_fd (sess, errpipe[0]);
Packit Service 392537
	ndmchan_start_read (ch, errpipe[0]);
Packit Service 392537
Packit Service 392537
	ch = &da->formatter_wrap;
Packit Service 392537
	ndmchan_initialize (ch, "dfp-wrap");
Packit Service 392537
	ndmchan_setbuf (ch, da->fmt_wrap_buf, sizeof da->fmt_wrap_buf);
Packit Service 392537
	close (wrppipe[1]);
Packit Service 392537
	ndmos_condition_pipe_fd (sess, wrppipe[0]);
Packit Service 392537
	ndmchan_start_read (ch, wrppipe[0]);
Packit Service 392537
Packit Service 392537
	ch = &da->formatter_image;
Packit Service 392537
	ndmchan_initialize (ch, "dfp-image");
Packit Service 392537
	ndmchan_setbuf (ch, da->fmt_image_buf, sizeof da->fmt_image_buf);
Packit Service 392537
Packit Service 392537
	if (is_backup) {
Packit Service 392537
		ndmalogf (sess, 0, 2, "backup...");
Packit Service 392537
		close (datpipe[1]);
Packit Service 392537
		ndmos_condition_pipe_fd (sess, datpipe[0]);
Packit Service 392537
		ndmchan_start_read (ch, datpipe[0]);
Packit Service 392537
	} else {
Packit Service 392537
		ndmalogf (sess, 0, 2, "recover...");
Packit Service 392537
		close (datpipe[0]);
Packit Service 392537
		ndmos_condition_pipe_fd (sess, datpipe[1]);
Packit Service 392537
		ndmchan_start_write (ch, datpipe[1]);
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	da->formatter_pid = rc;
Packit Service 392537
Packit Service 392537
	return rc;	/* PID */
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmda_add_to_cmd_with_escapes (char *cmd, char *word, char *special)
Packit Service 392537
{
Packit Service 392537
	char *		cmd_lim = &cmd[NDMDA_MAX_CMD-3];
Packit Service 392537
	char *		p;
Packit Service 392537
	int		c;
Packit Service 392537
Packit Service 392537
	p = cmd;
Packit Service 392537
	while (*p) p++;
Packit Service 392537
	if (p != cmd) *p++ = ' ';
Packit Service 392537
Packit Service 392537
	while ((c = *word++) != 0) {
Packit Service 392537
		if (p >= cmd_lim)
Packit Service 392537
			return -1;	/* overflow */
Packit Service 392537
		if (c == '\\' || strchr (special, c))
Packit Service 392537
			*p++ = '\\';
Packit Service 392537
		*p++ = c;
Packit Service 392537
	}
Packit Service 392537
	*p = 0;
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmda_add_to_cmd (char *cmd, char *word)
Packit Service 392537
{
Packit Service 392537
	return ndmda_add_to_cmd_with_escapes (cmd, word, " \t`'\"*?[]$");
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmda_add_to_cmd_allow_file_wildcards (char *cmd, char *word)
Packit Service 392537
{
Packit Service 392537
	return ndmda_add_to_cmd_with_escapes (cmd, word, " \t`'\"$");
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
#endif /* !NDMOS_OPTION_NO_DATA_AGENT */