stdlib: call __neatlibc_exit() in exit()
[neatlibc.git] / stdlib.c
blob4c198a60214d42db9a48a4ec78347164f73ec486
1 #include <stdlib.h>
2 #include <string.h>
3 #include <sys/types.h>
4 #include <sys/wait.h>
6 #define ATEXIT_MAX 32
8 char **environ;
10 int abs(int n)
12 return n >= 0 ? n : -n;
15 long labs(long n)
17 return n >= 0 ? n : -n;
20 char *getenv(char *name)
22 char **p = environ;
23 int len = strlen(name);
24 for (; *p; p++)
25 if (!memcmp(name, *p, len) && (*p)[len] == '=')
26 return *p + len + 1;
27 return NULL;
30 int system(char *cmd)
32 char *argv[] = {"/bin/sh", "-c", cmd, NULL};
33 pid_t pid;
34 int ret;
35 pid = fork();
36 if (pid < 0)
37 return -1;
38 if (!pid) {
39 execv(argv[0], argv);
40 exit(1);
42 if (waitpid(pid, &ret, 0) != pid)
43 return -1;
44 return ret;
47 static void (*atexit_func[ATEXIT_MAX])(void);
48 static int atexit_cnt;
50 int atexit(void (*func)(void))
52 if (atexit_cnt >= ATEXIT_MAX)
53 return -1;
54 atexit_func[atexit_cnt++] = func;
55 return 0;
58 void __neatlibc_exit(void)
60 int i;
61 for (i = 0; i < atexit_cnt; i++)
62 atexit_func[i]();
65 void exit(int status)
67 __neatlibc_exit();
68 _exit(status);