[PD] pipes
david casal
D.Casal at uea.ac.uk
Sat Mar 9 02:10:01 CET 2002
Hi all,
I'm tinkering with some fuzzy logic code generators, and though they
produce ANSI-C, my skills as a programmer aren't quite up to the job of
making generated code wrap around PD-ways. I thought of maybe doing the
pipe thing, so I wrote (with help from local LUG) the bit of C below...any
advice on how to wrap this in PD? Also, is this something I should be able
to do from within PD, say with 'shell' (and BTW, where -can- I find the
shell object)
cheers,
dc
/* a bit of c to do pipes, by dc
* bi-pipe.c
* -xs
*
* practical usage:
*
* % bi-pipe 'ls /' 'cat >~/tmp/output'
* % bi-pipe 'ls /adsadsa' 'cat >~/tmp/output'
* % bi-pipe -d 'ls /adsadsa' 'cat >~/tmp/output'
* ls: /adsadsa: No such file or directory
* %
*/
#include <sys/param.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h> /* needed by some glibc versions, remove if trouble */
enum
{
DEBUG = 0x1
};
void myerr(int, char *);
void usage(void);
void do_half(int, char *);
extern char **environ;
int flags;
int
main(int argc, char *argv[])
{
int fd[2], x;
while ((x = getopt(argc, argv, "dh")) != -1)
{
switch (x)
{
case 'd':
flags |= DEBUG;
break;
case 'h':
default:
usage();
}
}
argc -= optind;
argv += optind;
if (argc == 0)
usage();
if (socketpair(PF_UNIX, SOCK_STREAM, 0, fd) == -1)
myerr(1, "pipe");
switch (fork())
{
case -1:
myerr(1, "fork");
case 0:
close(fd[1]);
do_half(fd[0], argv[0]);
break;
default:
close(fd[0]);
do_half(fd[1], argv[1]);
break;
}
return 1;
}
void
do_half(int fd, char *prog)
{
char *argv[4];
int x;
if (flags & DEBUG)
x = 1;
else
x = 2;
for (; x >= 0; x--)
if (dup2(fd, x) == -1)
myerr(1, "dup2");
close(fd);
argv[0] = "/bin/sh";
argv[1] = "-c";
argv[2] = prog;
argv[3] = NULL;
execve(argv[0], argv, environ);
myerr(1, "execve");
}
void
myerr(int status, char *str)
{
perror(str);
exit(status);
}
void
usage(void)
{
fprintf(stderr, "usage: bi-pipe [-d] <cmd one> <cmd two>\n\n");
exit(1);
}
david casal --0+
---
d.casal at uea.ac.uk --9+
---
www.ariada.uea.ac.uk/~dcasal --)+
More information about the Pd-list
mailing list