DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T p

⟦2f8cd5c41⟧ TextFile

    Length: 8330 (0x208a)
    Types: TextFile
    Names: »pipe.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« 
        └─⟦de7628f85⟧ 
            └─⟦this⟧ »isode-6.0/others/quipu/uips/dish/pipe.c« 

TextFile

/* pipe.c - Dish shell command handler */

#ifndef	lint
static char *rcsid = "$Header: /f/osi/others/quipu/uips/dish/RCS/pipe.c,v 7.0 89/11/23 22:08:32 mrose Rel $";
#endif

/* 
 * $Header: /f/osi/others/quipu/uips/dish/RCS/pipe.c,v 7.0 89/11/23 22:08:32 mrose Rel $
 *
 *
 * $Log:	pipe.c,v $
 * Revision 7.0  89/11/23  22:08:32  mrose
 * Release 6.0
 * 
 */

/*
 *				  NOTICE
 *
 *    Acquisition, use, and distribution of this module and related
 *    materials are subject to the restrictions of a license agreement.
 *    Consult the Preface in the User's Manual for the full terms of
 *    this agreement.
 *
 */


#include <stdio.h>
#include "quipu/util.h"
#include "tailor.h"
#include "general.h"
#include "usr.dirent.h"

extern int      errno;

#ifdef SOCKETS   	/* USE INTERNET SOCKETS */

#include "internet.h"

main(argc,argv)
int	argc;
char	*argv[];
{
	int 			sd,res;
	struct sockaddr_in	sin_buf;
	struct sockaddr_in	* sin = &sin_buf;
	char			buffer [BUFSIZ];
	char			dishname [BUFSIZ];
	
	isodetailor (argv[0], 1);

	if ((sd = start_tcp_client ((struct sockaddr_in *) 0, 0)) == NOTOK) {
		perror("start_tcp_client");
		exit(-20);
	}

	if (get_dish_sock (sin, 0) != 0)
		exit (-21);

	if (join_tcp_server (sd, sin) == NOTOK) {
	        int	pid;
		(void) close_tcp_socket (sd);

fork_again: ;
		switch (pid = vfork ()) {
		case 0:
			/* child */
			(void) close_tcp_socket (sd);
			(void) strcpy (dishname,
				       _isodefile (isodebinpath, "dish"));
 			execl (dishname, "dish","-pipe",NULLCP);
 			(void) fprintf (stderr, "unable to exec ");
 			perror (dishname);
			_exit (-21);
		case -1:
			perror ("fork");
			(void) close_tcp_socket (sd);
			exit (-22);
		default:
			/* parent */
			for (;;) {
			    if ((sd = start_tcp_client ((struct sockaddr_in *) 0,
							0)) == NOTOK) {
				perror("start_tcp_client");
				exit(-23);
			    }
			    if (join_tcp_server (sd, sin) != NOTOK)
				break;

			    /* need to introduce a timeout !!! */
			    (void) close_tcp_socket (sd);

			    sleep (5);

			    if (kill (pid, 0) == NOTOK) {
				(void) fprintf (stderr,"Trying again...\n");
				goto fork_again;
			    }
			}
			break;
		}
	}

	(void) strcpy (buffer,*argv++);
	argc--;

	while (argc--) {
		(void) strcat (buffer, " \"");
		(void) strcat (buffer, *argv++);
		(void) strcat (buffer, "\"");
	}

	if (send(sd, buffer, strlen(buffer), 0) == -1) {
		perror("send");
		(void) close_tcp_socket (sd);
		exit (-25);
	}

	for (;;) {
		if ((res = recv(sd, buffer, BUFSIZ - 1, 0)) == -1) {
			perror ("recv");
			(void) close_tcp_socket (sd);
			exit (-26);
		}
		*(buffer + res) = 0;
		if (res == 0) {
			(void) close_tcp_socket (sd);
			exit (0);
		}

		if (*buffer == '2') {
			if (res > 1)
				(void) write (2,&buffer[1],--res);
			while ( (res = recv(sd, buffer, BUFSIZ, 0)) > 0)
				(void) write (2,buffer,res);
			(void) close_tcp_socket (sd);
			exit (1);			
		} else if ((*buffer == '1') || (*buffer == '3')) {
			int eval;
			eval = (*buffer == '1' ? 0 : 2);
			if (res > 1)
	                        (void) write (1,&buffer[1],--res);
                        while ( (res = recv(sd, buffer, BUFSIZ, 0)) > 0)
                                (void) write (1,buffer,res);
                        (void) close_tcp_socket (sd);
                        exit (eval);
                } else {		/* 'e', 'y', or 'p' */
			char            where[BUFSIZ];

			if (*buffer == 'e') {
				if (system (&buffer[1]))
				    (void) strcpy (where, "e");
				else
				    (void) getcwd (where, sizeof where);
			} else if (*buffer == 'y') {
				(void) fprintf (stderr,"%s",buffer + 1);
				(void) fgets (where, sizeof where, stdin);
			} else {
				(void) sprintf (where,
					        "Enter password for \"%s\": ",
						buffer + 1);
				(void) strcpy (where, getpassword (where));
			}

			if (send(sd, where, strlen(where), 0) == -1) {
				perror("send");
				(void) close_tcp_socket (sd);
				exit (-27);
			}

		}

	}
}


#else	/* USE UNIX NAMED PIPES */

#include <signal.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

char            retfile[BUFSIZ];
int             fd;
int		wfd;

main (argc, argv)
int             argc;
char          **argv;
{
	int             res;
	char            buffer[BUFSIZ];
	char            sendfile[BUFSIZ];
	char            dishname[BUFSIZ];
	int             i;
	char           *ptr, *getenv(), *sprintf(), *getpassword ();
	void            pipe_quit ();


	(void) umask (0);
	(void) sprintf (retfile, "/tmp/dish%d", getpid ());
	if ((ptr = getenv ("DISHPROC")) == NULLCP) {
	    (void) sprintf (sendfile, "/tmp/dish-%d", getppid ());
	    (void) setenv ("DISHPROC", sendfile);
	}
	else
	    (void) strcpy (sendfile, ptr);

	setbuf (stdout,NULLCP);
	setbuf (stderr,NULLCP);

	if (mknod (retfile, S_IFIFO | 0600, 0) == -1) {
		(void) fprintf (stderr,"Can't create pipe '%s'\n",retfile);
		exit (-12);
	}
	
	for (i = 1; i <= 15; i++)
		(void) signal (i, pipe_quit);

	if ((fd = open (sendfile, O_WRONLY | O_NDELAY)) == -1) {
		(void) fprintf (stderr, "(Dish starting)\n");
		if (mknod (sendfile, S_IFIFO | 0600, 0) == -1) {
			(void) fprintf (stderr,"Can't create pipe '%s'\n",sendfile);
			exit (-11);
		}
		(void) strcpy (dishname, _isodefile (isodebinpath, "dish"));
		if (vfork () == 0) {
			/* child */
			execl (dishname, "dish","-pipe",NULLCP);
			(void) fprintf (stderr, "unable to exec ");
			perror (dishname);
			(void) unlink (retfile);
			_exit (-2);
		} else {
			fd = open (sendfile, O_WRONLY);
			setbuf (stderr,NULLCP);
		}
	}
	argc--;
	if ((ptr = rindex (argv[0], '/')) == NULLCP)
		(void) sprintf (buffer, "%s:%s", retfile, argv[0]);
	else
		(void) sprintf (buffer, "%s:%s", retfile, ++ptr);
	argv++;

	while (argc--) {
		(void) strcat (buffer, " \"");
		(void) strcat (buffer, *argv++);
		(void) strcat (buffer, "\"");
	}

	if ((res = write (fd, buffer, strlen (buffer))) == -1) {
		(void) fprintf (stderr, "Write to DUA failed... Please retry\n");
		(void) close (fd);
		(void) unlink (retfile);
		exit (-3);
	}
	(void) close (fd);

	/* get results */
	if ((fd = open (retfile, O_RDONLY)) < 0) {
		(void) fprintf (stderr, "Can't read results\n");
		(void) unlink (retfile);
		exit (-4);
	}

	if ((wfd = open (retfile, O_WRONLY)) < 0) {
		(void) fprintf (stderr, "Can't lock results failed\n");
		(void) unlink (retfile);
		(void) close (fd);
		exit (-5);
	}

	for (;;) {
		if ((res = read (fd, buffer, BUFSIZ - 1)) == -1) {
			(void) fprintf (stderr, "Read failed (%d)\n", errno);
			(void) unlink (retfile);
			(void) close (fd);
			(void) close (wfd);
			exit (-6);
		}
		*(buffer + res) = 0;

		if (*buffer == '2') {
			(void) write (2,&buffer[1],--res);
			while ( (res = read (fd, buffer, BUFSIZ)) > 0)
				(void) write (2,buffer,res);
			(void) close (fd);
			(void) close (wfd);
			(void) unlink (retfile);
			exit (-1);			
		} else if ((*buffer == '1') || (*buffer == '3')) {
			int eval;
			eval = (*buffer == '1' ? 0 : 2);
                        (void) write (1,&buffer[1],--res);
                        while ( (res = read (fd, buffer, BUFSIZ)) > 0)
                                (void) write (1,buffer,res);
			(void) close (fd);
			(void) close (wfd);
			(void) unlink (retfile);
                        exit (eval);
		else {		/* 'e', 'y' or 'p' */
			int             res2,
			                nfd;
			char            where[BUFSIZ];

			if (*buffer == 'e') {
				(void) getwd (where);
				(void) system (&buffer[1]);
			} else if (*buffer == 'y') {
				(void) fprintf (stderr,"%s",buffer + 1);
				(void) fgets (where, sizeof where, stdin);
			} else {
				(void) sprintf (where,
					        "Enter password for \"%s\": ",
						buffer + 1);
				(void) strcpy (where, getpassword (where));
			}


			if ((nfd = open (sendfile, O_WRONLY)) == -1) {
				(void) fprintf (stderr, "re-write open error\n");
				(void) close (wfd);
				(void) close (fd);
				(void) unlink (retfile);
				exit (-9);
			}
			if ((res2 = write (nfd, where, strlen (where))) == -1) {
				(void) fprintf (stderr, "Write to DUA failed (%d)... Please retry\n", res2);
				(void) close (fd);
				(void) close (nfd);
				(void) close (wfd);
				(void) unlink (retfile);
				exit (-10);
			}
			(void) close (nfd);
		}
	}
}

void pipe_quit (sig)
int     sig;
{
	(void) unlink (retfile);
	(void) fprintf (stderr,"(signal %d) exiting...\n",sig);
	exit(0);
}
#endif