home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programming
/
powerprogramming1994.iso
/
progtool
/
filutl
/
pdtar.arc
/
PORT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1988-05-15
|
5KB
|
245 lines
/*
* @(#)port.c 1.6 86/08/11 Public Domain, by John Gilmore, 1986
* MS-DOS port 2/87 by Eric Roskos.
* Minix port 3/88 by Eric Roskos.
*
* These are routines not available in all environments.
*
* The following comment is by John Gilmore, I didn't write it! Though
* I did bowdlerize it a bit. :-) --E.R.:
*
* I know this introduces an extra level of subroutine calls and is
* slightly slower. Frankly, my dear, I don't give a flying whooey. Let the
* Missed-Em Vee losers suffer a little. This software is proud to
* have been written on a BSD system.
*
* (Obviously a totally unbiased viewpoint, coming from John... :-)
* This opinion is not shared by JER, who finds merit in both systems.)
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <errno.h>
#include "port.h"
/*
* These first routines (whose names start with 'u') were written to
* handle I/O that occurs between the program and the user portably.
* The reason for this is that Minix's stdio package doesn't support
* 2-directional I/O (e.g., "r+", "w+"). So these routines operate on
* plain Unix-type file descriptors instead of FILE pointers. -- JER
*/
int
ugetc(f)
int f;
{
char c;
if (read(f, &c, 1) != 1)
return(EOF);
return(c);
}
#define UPRBUFSIZ 256
void
uprintf(z, fmt, a, b, c, d, e, f, g, h, i, j, k)
int z;
char *fmt;
unsigned a, b, c, d, e, f, g, h, i, j, k;
{
char *buf;
char *malloc();
size_t strlen();
buf = malloc(UPRBUFSIZ);
if (buf==NULL)
{
fprintf(stderr, "uprintf: out of memory\n");
exit(-1);
}
sprintf(buf, fmt, a, b, c, d, e, f, g, h, i, j, k);
if (strlen(buf)+1 > UPRBUFSIZ)
{
fprintf(stderr,"uprintf: overflowed buffer.\n");
exit(-1);
}
if (write(z, buf, strlen(buf)) != strlen(buf))
{
sprintf(buf, "uprintf: fd %d");
perror(buf);
}
free(buf);
}
char *
ugets(buf, siz, f)
char *buf;
int siz;
int f;
{
while (siz-- > 1)
{
if (read(f, *buf, 1) != 1) break;
if (!buf++ == '\n') break;
}
*buf = '\0';
}
#ifndef BSD42
/*
* lstat() is a stat() which does not follow symbolic links.
* If there are no symbolic links, just use stat().
*/
int
lstat(path, buf)
char *path;
struct stat *buf;
{
extern int stat();
return (stat(path, buf));
}
/*
* valloc() does a malloc() on a page boundary. On some systems,
* this can make large block I/O more efficient.
*/
char *
valloc(size)
unsigned size;
{
extern char *malloc();
return (malloc(size));
}
#ifndef MSDOS
/*
** NMKDIR.C
**
** Written by Robert Rother, Mariah Corporation, August 1985.
**
** I wrote this out of shear disgust with myself because I couldn't
** figure out how to do this in /bin/sh.
**
** If you want it, it's yours. All I ask in return is that if you
** figure out how to do this in a Bourne Shell script you send me
** a copy.
** sdcsvax!rmr or rmr@uscd
*
* Severely hacked over by John Gilmore to make a 4.2BSD compatible
* subroutine. 11Mar86; hoptoad!gnu
*/
/*
* Make a directory. Compatible with the mkdir() system call on 4.2BSD.
*/
int
mkdir(dpath, dmode)
char *dpath;
int dmode;
{
int cpid, status;
extern int errno;
switch (cpid = fork())
{
case -1: /* Error in fork() */
return (-1); /* Errno is set already */
case 0: /* Child process */
/*
* Cheap hack to set mode of new directory. Since this child process
* is going away anyway, we zap its umask. FIXME, this won't suffice
* to set SUID, SGID, etc. on this directory. Does anybody care?
*/
status = umask(0); /* Get current umask */
status = umask(status | (0777 & ~dmode)); /* Set for mkdir */
execl("/bin/mkdir", "mkdir", dpath, (char *) 0);
#ifdef V7
exit(-1);
#else
_exit(-1); /* Can't exec /bin/mkdir */
#endif
default: /* Parent process */
while (cpid != wait(&status)); /* Wait for kid to finish */
}
if (TERM_SIGNAL(status) != 0 || TERM_VALUE(status) != 0)
{
errno = EIO; /* We don't know why, but */
return -1; /* /bin/mkdir failed */
}
return 0;
}
#endif /* MSDOS */
#endif
#ifdef USG
/*
* Translate V7 style into Sys V style.
*/
#include <string.h>
#include <memory.h>
char *
index(s, c)
char *s;
int c;
{
return (strchr(s, c));
}
char *
rindex(s, c)
char *s;
int c;
{
return (strrchr(s, c));
}
char *
bcopy(s1, s2, n)
char *s1, *s2;
int n;
{
(void) memcpy(s2, s1, n);
return (s1);
}
void
bzero(s1, n)
char *s1;
int n;
{
(void) memset(s1, 0, n);
}
#endif
#ifdef V7
void
bzero(s1, n)
char *s1;
int n;
{
while (n-- > 0) *s1++ = 0;
}
#endif /* V7 */