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