#include "sys_defs.h"
#ifdef MISSING_STRERROR
extern int errno;
extern char *sys_errlist[];
extern int sys_nerr;
#include <vstring.h>
const char *strerror(int err)
{
static VSTRING *buf;
if (err < 0 || err >= sys_nerr) {
if (buf == 0)
buf = vstring_alloc(10);
vstring_sprintf(buf, "Unknown error %d", err);
return (vstring_str(buf));
} else {
return (sys_errlist[errno]);
}
}
#endif
#ifdef MISSING_SETENV
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int setenv(const char *name, const char *value, int clobber)
{
size_t size;
char *cp;
if (clobber == 0 && getenv(name) != 0)
return (0);
size = strlen(name) + strlen(value) + 2;
if ((cp = malloc(size)) == 0)
return (1);
snprintf(cp, size, "%s=%s", name, value);
return (putenv(cp));
}
#endif
#ifdef MISSING_SETEUID
#ifdef HAVE_SETRESUID
#include <unistd.h>
int seteuid(uid_t euid)
{
return setresuid(-1, euid, -1);
}
#else
#error MISSING_SETEUID
#endif
#endif
#ifdef MISSING_SETEGID
#ifdef HAVE_SETRESGID
#include <unistd.h>
int setegid(gid_t egid)
{
return setresgid(-1, egid, -1);
}
#else
#error MISSING_SETEGID
#endif
#endif
#ifdef MISSING_MKFIFO
#include <sys/stat.h>
int mkfifo(char *path, int mode)
{
return mknod(path, (mode & ~_S_IFMT) | _S_IFIFO, 0);
}
#endif
#ifdef MISSING_WAITPID
#ifdef HAS_WAIT4
#include <sys/wait.h>
#include <errno.h>
int waitpid(int pid, WAIT_STATUS_T *status, int options)
{
if (pid == -1)
pid = 0;
return wait4(pid, status, options, (struct rusage *) 0);
}
#else
#error MISSING_WAITPID
#endif
#endif
#ifdef MISSING_SETSID
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#ifdef TIOCNOTTY
#include <msg.h>
int setsid(void)
{
int p = getpid();
int fd;
if (setpgrp(p, p))
return -1;
fd = open("/dev/tty", O_RDONLY, 0);
if (fd >= 0 || errno != ENXIO) {
if (fd < 0) {
msg_warn("open /dev/tty: %m");
return -1;
}
if (ioctl(fd, TIOCNOTTY, 0)) {
msg_warn("ioctl TIOCNOTTY: %m");
return -1;
}
close(fd);
}
return 0;
}
#else
#error MISSING_SETSID
#endif
#endif
#ifdef DUP2_DUPS_CLOSE_ON_EXEC
#include "iostuff.h"
int dup2_pass_on_exec(int oldd, int newd)
{
int res;
if ((res = dup2(oldd, newd)) >= 0)
close_on_exec(newd, PASS_ON_EXEC);
return res;
}
#endif
#ifndef HAS_CLOSEFROM
#include <unistd.h>
#include <errno.h>
#include <iostuff.h>
int closefrom(int lowfd)
{
int fd_limit = open_limit(0);
int fd;
if (lowfd < 0) {
errno = EBADF;
return (-1);
}
if (fd_limit > 500)
fd_limit = 500;
for (fd = lowfd; fd < fd_limit; fd++)
(void) close(fd);
return (0);
}
#endif
#ifdef MISSING_INET_NTOP
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
const char *inet_ntop(int af, const void *src, char *dst, size_t size)
{
const unsigned char *addr;
char buffer[sizeof("255.255.255.255")];
int len;
if (af != AF_INET) {
errno = EAFNOSUPPORT;
return (0);
}
addr = (const unsigned char *) src;
#if (CHAR_BIT > 8)
snprintf(buffer, sizeof buffer, "%d.%d.%d.%d", addr[0] & 0xff,
addr[1] & 0xff, addr[2] & 0xff, addr[3] & 0xff);
#else
snprintf(buffer, sizeof buffer, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
#endif
if ((len = strlen(buffer)) >= size) {
errno = ENOSPC;
return (0);
} else {
memcpy(dst, buffer, len + 1);
return (dst);
}
}
#endif
#ifdef MISSING_INET_PTON
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <errno.h>
#ifndef INADDR_NONE
#define INADDR_NONE 0xffffffff
#endif
int inet_pton(int af, const char *src, void *dst)
{
struct in_addr addr;
if (af != AF_INET) {
errno = EAFNOSUPPORT;
return (-1);
} else if ((addr.s_addr = inet_addr(src)) == INADDR_NONE
&& strcmp(src, "255.255.255.255") != 0) {
return (0);
} else {
memcpy(dst, (char *) &addr, sizeof(addr));
return (1);
}
}
#endif