stdio: puts() and vprintf()
[neatlibc.git] / stdlib.c
blob57b80e0c748036d3d2609be3e5db7e18f73bb947
1 #include <stdlib.h>
2 #include <string.h>
3 #include <sys/types.h>
4 #include <sys/wait.h>
5 #include <unistd.h>
7 #define ATEXIT_MAX 32
9 char **environ;
11 int abs(int n)
13 return n >= 0 ? n : -n;
16 long labs(long n)
18 return n >= 0 ? n : -n;
21 char *getenv(char *name)
23 char **p = environ;
24 int len = strlen(name);
25 for (; *p; p++)
26 if (!memcmp(name, *p, len) && (*p)[len] == '=')
27 return *p + len + 1;
28 return NULL;
31 int system(char *cmd)
33 char *argv[] = {"/bin/sh", "-c", cmd, NULL};
34 pid_t pid;
35 int ret;
36 pid = fork();
37 if (pid < 0)
38 return -1;
39 if (!pid) {
40 execv(argv[0], argv);
41 exit(1);
43 if (waitpid(pid, &ret, 0) != pid)
44 return -1;
45 return ret;
48 static void (*atexit_func[ATEXIT_MAX])(void);
49 static int atexit_cnt;
51 int atexit(void (*func)(void))
53 if (atexit_cnt >= ATEXIT_MAX)
54 return -1;
55 atexit_func[atexit_cnt++] = func;
56 return 0;
59 void __neatlibc_exit(void)
61 int i;
62 for (i = 0; i < atexit_cnt; i++)
63 atexit_func[i]();
66 void exit(int status)
68 __neatlibc_exit();
69 _exit(status);