All programs should die gracefully now since fixing sbrk to return -1
[akaros.git] / newlib / libc_wrappers.c
1 /* See COPYRIGHT for copyright information. */
2 /* Kevin Klues <klueska@cs.berkeley.edu>        */
3
4 #include <inc/lib.h>
5 #include <newlib/libc_wrappers.h>
6
7 /* environ
8  * A pointer to a list of environment variables and their values. 
9  * For a minimal environment, this empty list is adequate.
10  */
11 char *__env[1] = { 0 };
12 char **environ = __env;
13 extern env_t* env;
14
15 /* _exit()
16  * Exit a program without cleaning up files. 
17  * If your system doesn't provide this, it is best to avoid linking 
18  * with subroutines that require it (exit, system).
19  */
20 void _exit() 
21 {
22         sys_env_destroy(env->env_id);
23 }
24     
25 /* close()
26  * Close a file. 
27  * Minimal implementation.
28  */
29 int close(int file) 
30 {
31         return -1;
32 }
33
34 /* execve()
35  * Transfer control to a new process. 
36  * Minimal implementation (for a system without processes).
37  */
38
39 int execve(char *name, char **argv, char **env) 
40 {
41         errno = ENOMEM;
42         return -1;
43 }
44
45 /* fork()
46  * Create a new process. 
47  * Minimal implementation (for a system without processes).
48  */
49 int fork(void) 
50 {
51         errno = EAGAIN;
52     return -1;
53 }
54
55 /* fstat()
56  * Status of an open file. 
57  * For consistency with other minimal implementations in these stubs, 
58  * all files are regarded as character special devices. 
59  * The sys/stat.h header file required is distributed in the include 
60  * subdirectory for the newlib C library.
61  */
62 int fstat(int file, struct stat *st) 
63 {
64         st->st_mode = S_IFCHR;
65         return 0;
66 }
67
68 /* getpid()
69  * Process-ID; this is sometimes used to generate strings unlikely to 
70  * conflict with other processes. Minimal implementation, for a system 
71  * without processes.
72  */
73 int getpid(void) 
74 {
75         return env->env_id;
76 }
77
78 /* isatty()
79  * Query whether output stream is a terminal. 
80  * For consistency with the other minimal implementations, 
81  * which only support output to stdout, this minimal 
82  * implementation is suggested.
83  */
84 int isatty(int file) 
85 {
86         return 1;
87 }
88
89 /* kill()
90  * Send a signal. 
91  * Minimal implementation.
92  */
93 int kill(int pid, int sig) 
94 {
95         errno = EINVAL;
96     return -1;
97 }
98
99 /* link()
100  * Establish a new name for an existing file. 
101  * Minimal implementation.
102  */
103 int link(char *old, char *new) 
104 {
105         errno = EMLINK;
106         return -1;
107 }
108
109 /* lseek()
110  * Set position in a file. 
111  * Minimal implementation.
112  */
113 int lseek(int file, int ptr, int dir) 
114 {
115         return 0;
116 }
117
118 /* __sseek64()
119  * Set position in a file. 
120  * Minimal implementation.
121  */
122 int __sseek64(int file, int ptr, int dir) 
123 {
124         return 0;
125 }
126
127 /* open()
128  * Open a file. 
129  * Minimal implementation.
130  */
131 int open(const char *name, int flags, int mode) 
132 {
133         return -1;
134 }
135
136 /* read()
137  * Read from a file. 
138  * Minimal implementation.
139  */
140 int read(int file, char *ptr, int len) 
141 {
142         return 0;
143 }
144
145 /* sbrk()
146  * Increase program data space. 
147  * As malloc and related functions depend on this, it is 
148  * useful to have a working implementation. 
149  * The following suffices for a standalone system; it exploits the 
150  * symbol _end automatically defined by the GNU linker.
151  */
152 caddr_t sbrk(int incr) 
153 {
154         errno = ENOMEM;
155         return (void*)-1;
156 }
157
158 /* stat()
159  * Status of a file (by name). 
160  * Minimal implementation.
161  */
162 int stat(char *file, struct stat *st) 
163 {
164         st->st_mode = S_IFCHR;
165         return 0;
166 }
167
168 /* times()
169  * Timing information for current process. 
170  * Minimal implementation.
171  */
172 int times(struct tms *buf) 
173 {
174         return -1;
175 }
176
177 /* unlink()
178  * Remove a file's directory entry. 
179  * Minimal implementation.
180  */
181 int unlink(char *name) 
182 {
183         errno = ENOENT;
184         return -1;
185 }
186
187 /* wait()
188  * Wait for a child process. 
189  * Minimal implementation.
190  */
191 int wait(int *status) 
192 {
193         errno = ECHILD;
194         return -1;
195 }
196
197 /* write()
198  * Write to a file. 
199  * libc subroutines will use this system routine for output 
200  * to all files, including stdout—so if you need to generate 
201  * any output, for example to a serial port for debugging, 
202  * you should make your minimal write capable of doing this. 
203  * The following minimal implementation is an incomplete example; 
204  * it relies on a outbyte subroutine (not shown; typically, you must 
205  * write this in assembler from examples provided by your hardware 
206  * manufacturer) to actually perform the output.
207  */
208 #define outbyte(arg)
209 int write(int file, char *ptr, int len) {
210         return 0;
211 }
212
213 /* __swrite64()
214  * Write to a file. 
215  */
216 int __swrite64(int file, char *ptr, int len) {
217         return 0;
218 }