about summary refs log tree commit diff
path: root/src/legacy
diff options
context:
space:
mode:
Diffstat (limited to 'src/legacy')
-rw-r--r--src/legacy/cuserid.c14
-rw-r--r--src/legacy/daemon.c33
-rw-r--r--src/legacy/err.c60
-rw-r--r--src/legacy/ftw.c12
-rw-r--r--src/legacy/futimes.c13
-rw-r--r--src/legacy/getdtablesize.c9
-rw-r--r--src/legacy/getpagesize.c7
-rw-r--r--src/legacy/getpass.c39
-rw-r--r--src/legacy/getusershell.c33
-rw-r--r--src/legacy/isastream.c7
-rw-r--r--src/legacy/lutimes.c13
-rw-r--r--src/legacy/ulimit.c19
-rw-r--r--src/legacy/utmpx.c43
13 files changed, 302 insertions, 0 deletions
diff --git a/src/legacy/cuserid.c b/src/legacy/cuserid.c
new file mode 100644
index 00000000..4e78798d
--- /dev/null
+++ b/src/legacy/cuserid.c
@@ -0,0 +1,14 @@
+#define _GNU_SOURCE
+#include <pwd.h>
+#include <stdio.h>
+#include <unistd.h>
+
+char *cuserid(char *buf)
+{
+	struct passwd pw, *ppw;
+	long pwb[256];
+	if (getpwuid_r(geteuid(), &pw, (void *)pwb, sizeof pwb, &ppw))
+		return 0;
+	snprintf(buf, L_cuserid, "%s", pw.pw_name);
+	return buf;
+}
diff --git a/src/legacy/daemon.c b/src/legacy/daemon.c
new file mode 100644
index 00000000..1568b1dc
--- /dev/null
+++ b/src/legacy/daemon.c
@@ -0,0 +1,33 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include <unistd.h>
+
+int daemon(int nochdir, int noclose)
+{
+	if (!nochdir && chdir("/"))
+		return -1;
+	if (!noclose) {
+		int fd, failed = 0;
+		if ((fd = open("/dev/null", O_RDWR)) < 0) return -1;
+		if (dup2(fd, 0) < 0 || dup2(fd, 1) < 0 || dup2(fd, 2) < 0)
+			failed++;
+		if (fd > 2) close(fd);
+		if (failed) return -1;
+	}
+
+	switch(fork()) {
+	case 0: break;
+	case -1: return -1;
+	default: _exit(0);
+	}
+
+	if (setsid() < 0) return -1;
+
+	switch(fork()) {
+	case 0: break;
+	case -1: return -1;
+	default: _exit(0);
+	}
+
+	return 0;
+}
diff --git a/src/legacy/err.c b/src/legacy/err.c
new file mode 100644
index 00000000..0f748538
--- /dev/null
+++ b/src/legacy/err.c
@@ -0,0 +1,60 @@
+#include <err.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+void vwarn(const char *fmt, va_list ap)
+{
+	if (fmt) vfprintf(stderr, fmt, ap);
+	perror("");
+}
+
+void vwarnx(const char *fmt, va_list ap)
+{
+	if (fmt) vfprintf(stderr, fmt, ap);
+	putc('\n', stderr);
+}
+
+_Noreturn void verr(int status, const char *fmt, va_list ap)
+{
+	vwarn(fmt, ap);
+	exit(status);
+}
+
+_Noreturn void verrx(int status, const char *fmt, va_list ap)
+{
+	vwarnx(fmt, ap);
+	exit(status);
+}
+
+void warn(const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	vwarn(fmt, ap);
+	va_end(ap);
+}
+
+void warnx(const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	vwarnx(fmt, ap);
+	va_end(ap);
+}
+
+_Noreturn void err(int status, const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	verr(status, fmt, ap);
+	va_end(ap);
+}
+
+_Noreturn void errx(int status, const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	verrx(status, fmt, ap);
+	va_end(ap);
+}
diff --git a/src/legacy/ftw.c b/src/legacy/ftw.c
new file mode 100644
index 00000000..0429aba4
--- /dev/null
+++ b/src/legacy/ftw.c
@@ -0,0 +1,12 @@
+#include <ftw.h>
+#include "libc.h"
+
+int ftw(const char *path, int (*fn)(const char *, const struct stat *, int), int fd_limit)
+{
+	/* The following cast assumes that calling a function with one
+	 * argument more than it needs behaves as expected. This is
+	 * actually undefined, but works on all real-world machines. */
+	return nftw(path, (int (*)())fn, fd_limit, FTW_PHYS);
+}
+
+LFS64(ftw);
diff --git a/src/legacy/futimes.c b/src/legacy/futimes.c
new file mode 100644
index 00000000..f8fd1cde
--- /dev/null
+++ b/src/legacy/futimes.c
@@ -0,0 +1,13 @@
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <fcntl.h>
+
+int futimes(int fd, const struct timeval tv[2])
+{
+	struct timespec times[2];
+	times[0].tv_sec  = tv[0].tv_sec;
+	times[0].tv_nsec = tv[0].tv_usec * 1000;
+	times[1].tv_sec  = tv[1].tv_sec;
+	times[1].tv_nsec = tv[1].tv_usec * 1000;
+	return futimens(fd, times);
+}
diff --git a/src/legacy/getdtablesize.c b/src/legacy/getdtablesize.c
new file mode 100644
index 00000000..623a6af3
--- /dev/null
+++ b/src/legacy/getdtablesize.c
@@ -0,0 +1,9 @@
+#include <limits.h>
+#include <sys/resource.h>
+
+int getdtablesize(void)
+{
+	struct rlimit rl;
+	getrlimit(RLIMIT_NOFILE, &rl);
+	return rl.rlim_max < INT_MAX ? rl.rlim_max : INT_MAX;
+}
diff --git a/src/legacy/getpagesize.c b/src/legacy/getpagesize.c
new file mode 100644
index 00000000..5ede652b
--- /dev/null
+++ b/src/legacy/getpagesize.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include <limits.h>
+
+int getpagesize(void)
+{
+	return PAGE_SIZE;
+}
diff --git a/src/legacy/getpass.c b/src/legacy/getpass.c
new file mode 100644
index 00000000..d439a2a5
--- /dev/null
+++ b/src/legacy/getpass.c
@@ -0,0 +1,39 @@
+#include <stdio.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+char *getpass(const char *prompt)
+{
+	int fd;
+	struct termios s, t;
+	ssize_t l;
+	static char password[128];
+
+	if ((fd = open("/dev/tty", O_RDONLY|O_NOCTTY)) < 0) fd = 0;
+
+	tcgetattr(fd, &t);
+	s = t;
+	t.c_lflag &= ~(ECHO|ISIG);
+	t.c_lflag |= ICANON;
+	t.c_iflag &= ~(INLCR|IGNCR);
+	t.c_iflag |= ICRNL;
+	tcsetattr(fd, TCSAFLUSH, &t);
+	tcdrain(fd);
+
+	fputs(prompt, stderr);
+	fflush(stderr);
+
+	l = read(fd, password, sizeof password);
+	if (l >= 0) {
+		if (l > 0 && password[l-1] == '\n') l--;
+		password[l] = 0;
+	}
+
+	tcsetattr(fd, TCSAFLUSH, &s);
+
+	if (fd > 2) close(fd);
+
+	return password;
+}
diff --git a/src/legacy/getusershell.c b/src/legacy/getusershell.c
new file mode 100644
index 00000000..683158c8
--- /dev/null
+++ b/src/legacy/getusershell.c
@@ -0,0 +1,33 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+static const char defshells[] = "/bin/sh\n/bin/csh\n";
+
+static char *line;
+static size_t linesize;
+static FILE *f;
+
+void endusershell(void)
+{
+	if (f) fclose(f);
+	f = 0;
+}
+
+void setusershell(void)
+{
+	if (!f) f = fopen("/etc/shells", "rb");
+	if (!f) f = fmemopen((void *)defshells, sizeof defshells - 1, "rb");
+}
+
+char *getusershell(void)
+{
+	ssize_t l;
+	if (!f) setusershell();
+	if (!f) return 0;
+	l = getline(&line, &linesize, f);
+	if (l <= 0) return 0;
+	if (line[l-1]=='\n') line[l-1]=0;
+	return line;
+}
diff --git a/src/legacy/isastream.c b/src/legacy/isastream.c
new file mode 100644
index 00000000..4dafdb08
--- /dev/null
+++ b/src/legacy/isastream.c
@@ -0,0 +1,7 @@
+#include <stropts.h>
+#include <fcntl.h>
+
+int isastream(int fd)
+{
+	return fcntl(fd, F_GETFD) < 0 ? -1 : 0;
+}
diff --git a/src/legacy/lutimes.c b/src/legacy/lutimes.c
new file mode 100644
index 00000000..13dfe4ef
--- /dev/null
+++ b/src/legacy/lutimes.c
@@ -0,0 +1,13 @@
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <fcntl.h>
+
+int lutimes(const char *filename, const struct timeval tv[2])
+{
+	struct timespec times[2];
+	times[0].tv_sec  = tv[0].tv_sec;
+	times[0].tv_nsec = tv[0].tv_usec * 1000;
+	times[1].tv_sec  = tv[1].tv_sec;
+	times[1].tv_nsec = tv[1].tv_usec * 1000;
+	return utimensat(AT_FDCWD, filename, times, AT_SYMLINK_NOFOLLOW);
+}
diff --git a/src/legacy/ulimit.c b/src/legacy/ulimit.c
new file mode 100644
index 00000000..1f59e8e6
--- /dev/null
+++ b/src/legacy/ulimit.c
@@ -0,0 +1,19 @@
+#include <sys/resource.h>
+#include <ulimit.h>
+#include <stdarg.h>
+
+long ulimit(int cmd, ...)
+{
+	struct rlimit rl;
+	getrlimit(RLIMIT_FSIZE, &rl);
+	if (cmd == UL_SETFSIZE) {
+		long val;
+		va_list ap;
+		va_start(ap, cmd);
+		val = va_arg(ap, long);
+		va_end(ap);
+		rl.rlim_cur = 512ULL * val;
+		if (setrlimit(RLIMIT_FSIZE, &rl)) return -1;
+	}
+	return rl.rlim_cur / 512;
+}
diff --git a/src/legacy/utmpx.c b/src/legacy/utmpx.c
new file mode 100644
index 00000000..c483e4ed
--- /dev/null
+++ b/src/legacy/utmpx.c
@@ -0,0 +1,43 @@
+#include <utmpx.h>
+#include <stddef.h>
+#include "libc.h"
+
+void endutxent(void)
+{
+}
+
+void setutxent(void)
+{
+}
+
+struct utmpx *getutxent(void)
+{
+	return NULL;
+}
+
+struct utmpx *getutxid(const struct utmpx *ut)
+{
+	return NULL;
+}
+
+struct utmpx *getutxline(const struct utmpx *ut)
+{
+	return NULL;
+}
+
+struct utmpx *pututxline(const struct utmpx *ut)
+{
+	return NULL;
+}
+
+void updwtmpx(const char *f, const struct utmpx *u)
+{
+}
+
+weak_alias(endutxent, endutent);
+weak_alias(setutxent, setutent);
+weak_alias(getutxent, getutent);
+weak_alias(getutxid, getutid);
+weak_alias(getutxline, getutline);
+weak_alias(pututxline, pututline);
+weak_alias(updwtmpx, updwtmp);