[comp.os.minix] popen,pclose,ctime,fdopen functions

tsp@killer.UUCP (06/09/87)

The following functions are quick hacks to get Larry Wall's cdiff.c
running under Minix.  [I couldn't find them on any diskette.]


I have done very little testing with each, so
feel free to examine the code and make the appropriate changes.

Included are:

  char * ctime(long_time_ptr) 

  FILE * popen(sh_cmd, mode) 

  int    pclose(popen_file_ptr)

  FILE * fdopen(open_fd, mode) 


Tom Poindexter        uucp: ihnp4!killer!tsp
		Compuserve: 76117,1453

------cut here------------
echo x - popen.c
gres '^X' '' > popen.c << '/'
X/* popen and pclose for minix */
X/* needs fdopen.c (missing from minix stdio) */
X/* this code was found in an old unix programming guide */
X/* and hacked for stdio */
X
X#include <stdio.h>
X#include <signal.h>
X
X#define READ   0
X#define WRITE  1
X#define tst(a,b)  (mode == READ ? (b) : (a))
X
Xstatic int popen_pid;
X
XFILE *popen(cmd, type)
Xchar *cmd;
Xchar *type;
X{
X  int p[2];
X  int mode;
X  FILE *fdopen();
X
X  switch (*type) {
X    case 'r':
X            mode = READ;
X            break;
X    case 'w':
X            mode = WRITE;
X            break;
X    default:
X            return (NULL);  
X  }
X
X  if (pipe(p) < 0)
X    return (NULL);
X
X  if ((popen_pid = fork()) == 0) {
X    close(tst(p[WRITE],p[READ]));
X    close(tst(0,1));
X    dup  (tst(p[READ],p[WRITE]));
X    close(tst(p[READ],p[WRITE]));
X    execl("/bin/sh",    "sh","-c",cmd,(char *) 0);  /* normal try at sh */
X    execl("/usr/bin/sh","sh","-c",cmd,(char *) 0);  /* 2nd try */
X    exit(1);         				    /* oops !! */
X  }
X
X  if (popen_pid == -1)
X    return (NULL);
X
X  close(tst(p[READ],p[WRITE]));
X  
X  return( fdopen(tst(p[WRITE],p[READ]),type) );
X}
X
X
Xint pclose(f)
XFILE *f;
X{
X  int r, (*hstat)(), (*istat)(), (*qstat)();
X  int status;
X
X  fclose(f);
X
X  istat = signal(SIGINT, SIG_IGN);
X  qstat = signal(SIGQUIT,SIG_IGN);
X  hstat = signal(SIGHUP, SIG_IGN);
X
X  while ((r = wait(&status)) != popen_pid && r != -1) ;
X
X  if (r == -1)
X    status = -1;
X
X  signal(SIGINT, istat);
X  signal(SIGQUIT,qstat);
X  signal(SIGHUP, hstat);
X
X  return(status);
X }
X
X/* finis */
X
X
X
X
X
/
echo x - fdopen.c
gres '^X' '' > fdopen.c << '/'
X/* fdopen - YAH (yet another hack)  hacked from fopen.c */
X
X#include <stdio.h>
X
X#define  PMODE    0644
X
X
XFILE *fdopen(fd,mode)
Xint  fd;
Xchar *mode;
X{
X	register int i;
X	FILE *fp;
X	char *malloc();
X	int flags = 0;
X
X	for (i = 0; _io_table[i] != 0 ; i++) 
X		if ( i >= NFILES )
X			return(NULL);
X
X	switch(*mode){
X
X	case 'w':
X		flags |= WRITEMODE;
X		break;
X
X        case 'a':
X                flags |= WRITEMODE;
X                lseek(fd,0L,2);
X                break;
X
X	case 'r':
X		flags |= READMODE;	
X		break;
X
X	default:
X		return(NULL);
X	}
X
X
X	if (( fp = (FILE *) malloc (sizeof( FILE))) == NULL )
X		return(NULL);
X
X
X	fp->_count = 0;
X	fp->_fd = fd;
X	fp->_flags = flags;
X	fp->_buf = malloc( BUFSIZ );
X	if ( fp->_buf == NULL )
X		fp->_flags |=  UNBUFF;
X	else 
X		fp->_flags |= IOMYBUF;
X
X	fp->_ptr = fp->_buf;
X	_io_table[i] = fp;
X	return(fp);
X}
/
echo x - ctime.c
gres '^X' '' > ctime.c << '/'
X/* ctime.c   yah (yet another hack) from date.c */
X
X
Xint days_per_month[] =
X  { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
Xchar *months[] =
X  { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
X    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
Xchar *days[] =
X  { "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed" };
X
Xstruct {
X	int year, month, day, hour, min, sec;
X} tm;
X
Xlong s_p_min;
Xlong s_p_hour;
Xlong s_p_day;
Xlong s_p_year;
X
Xchar t_buf[26];
X
Xchar *ctime(t) 
Xlong *t;
X{
X  long tt;
X
X  s_p_min  = 60L;
X  s_p_hour = 60L * 60L;
X  s_p_day  = 60L * 60L * 24L;
X  s_p_year = 60L * 60L * 60L * 365L;
X
X  tt = *t;
X  cv_time(tt);
X
X  sprintf(t_buf,"%s %s %02d %02d:%02d:%02d %04d\n", days[(tt / s_p_day) % 7], 
X           months[tm.month], tm.day, tm.hour, tm.min, tm.sec, tm.year); 
X  return(t_buf);
X}
X
Xcv_time(t)
Xlong t;
X{
X  tm.year = 0;
X  tm.month = 0;
X  tm.day = 1;
X  tm.hour = 0;
X  tm.min = 0;
X  tm.sec = 0;
X  while (t >= s_p_year) {
X	if (((tm.year + 2) % 4) == 0)
X		t -= s_p_day;
X	tm.year += 1;
X	t -= s_p_year;
X  }
X  if (((tm.year + 2) % 4) == 0)
X	days_per_month[1]++;
X  tm.year += 1970;
X  while ( t >= (days_per_month[tm.month] * s_p_day))
X	t -= days_per_month[tm.month++] * s_p_day;
X  while (t >= s_p_day) {
X	t -= s_p_day;
X	tm.day++;
X  }
X  while (t >= s_p_hour) {
X	t -= s_p_hour;
X	tm.hour++;
X  }
X  while (t >= s_p_min) {
X	t -= s_p_min;
X	tm.min++;
X  }
X  tm.sec = (int) t;
X}
X
X/* finis */
/