SimpleOS

LXR

Navigation



Site hébergé par : enix

The LXR Cross Referencer for SOS

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Article:1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 6.5 ] [ 7 ] [ 7.5 ] [ 8 ] [ 9 ] [ 9.5 ]

Diff markup

Differences between /userland/crt.c (Article 9) and /userland/crt.c (Article 9.5)


001 /* Copyright (C) 2005 David Decotigny             001 /* Copyright (C) 2005 David Decotigny
002    Copyright (C) 2003 Thomas Petazzoni            002    Copyright (C) 2003 Thomas Petazzoni
003                                                   003 
004    This program is free software; you can redi    004    This program is free software; you can redistribute it and/or
005    modify it under the terms of the GNU Genera    005    modify it under the terms of the GNU General Public License
006    as published by the Free Software Foundatio    006    as published by the Free Software Foundation; either version 2
007    of the License, or (at your option) any lat    007    of the License, or (at your option) any later version.
008                                                   008    
009    This program is distributed in the hope tha    009    This program is distributed in the hope that it will be useful,
010    but WITHOUT ANY WARRANTY; without even the     010    but WITHOUT ANY WARRANTY; without even the implied warranty of
011    MERCHANTABILITY or FITNESS FOR A PARTICULAR    011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012    GNU General Public License for more details    012    GNU General Public License for more details.
013                                                   013    
014    You should have received a copy of the GNU     014    You should have received a copy of the GNU General Public License
015    along with this program; if not, write to t    015    along with this program; if not, write to the Free Software
016    Foundation, Inc., 59 Temple Place - Suite 3    016    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
017    USA.                                           017    USA. 
018 */                                                018 */
019                                                   019 
020                                                   020 
021 /**                                               021 /**
022  * @file crt.c                                    022  * @file crt.c
023  *                                                023  *
024  * The C RunTime environment for the basic sup    024  * The C RunTime environment for the basic support of SOS C user
025  * programs                                       025  * programs
026  */                                               026  */
027                                                   027 
028 #include <hwcore/swintr.h>                        028 #include <hwcore/swintr.h>
029 #include <string.h>                               029 #include <string.h>
030 #include "crt.h"                                  030 #include "crt.h"
031                                                   031 
032 /**                                               032 /**
033  * Starter function !                             033  * Starter function !
034  */                                               034  */
035 void _start() __attribute__((noreturn));       !! 035 void _start(void) __attribute__((noreturn));
036 void _start()                                  !! 036 void _start(void)
037 {                                                 037 {
038   /* This starter function expects a main() fu    038   /* This starter function expects a main() function somewhere */
039   extern int main();                           !! 039   extern int main(void);
040                                                   040 
041   /* Reset the bss section */                     041   /* Reset the bss section */
042   extern char _bbss, _ebss;                       042   extern char _bbss, _ebss;
043   memset(& _bbss, 0x0, (& _ebss) - (& _bbss));    043   memset(& _bbss, 0x0, (& _ebss) - (& _bbss));
044                                                   044 
045   _sos_exit(main());                              045   _sos_exit(main());
046 }                                                 046 }
047                                                   047 
048                                                   048 
049 /*                                                049 /*
050  * By convention, the USER SOS programs always    050  * By convention, the USER SOS programs always pass 4 arguments to the
051  * kernel syscall handler: in eax/../edx. For     051  * kernel syscall handler: in eax/../edx. For less arguments, the
052  * unused registers are filled with 0s. For mo    052  * unused registers are filled with 0s. For more arguments, the 4th
053  * syscall parameter gives the address of the     053  * syscall parameter gives the address of the array containing the
054  * remaining arguments. In any case, eax corre    054  * remaining arguments. In any case, eax corresponds to the syscall
055  * IDentifier.                                    055  * IDentifier.
056  */                                               056  */
057                                                   057 
058                                                   058 
059 inline                                            059 inline
060 int _sos_syscall3(int id,                         060 int _sos_syscall3(int id,
061                   unsigned int arg1,              061                   unsigned int arg1,
062                   unsigned int arg2,              062                   unsigned int arg2,
063                   unsigned int arg3)              063                   unsigned int arg3)
064 {                                                 064 {
065   int ret;                                        065   int ret;
066                                                   066   
067   asm volatile("movl %1,%%eax \n"                 067   asm volatile("movl %1,%%eax \n"
068                "movl %2,%%ebx \n"                 068                "movl %2,%%ebx \n"
069                "movl %3,%%ecx \n"                 069                "movl %3,%%ecx \n"
070                "movl %4,%%edx \n"                 070                "movl %4,%%edx \n"
071                "int  %5\n"                        071                "int  %5\n"
072                "movl %%eax, %0"                   072                "movl %%eax, %0"
073                :"=g"(ret)                         073                :"=g"(ret)
074                :"g"(id),"g"(arg1),"g"(arg2),"g    074                :"g"(id),"g"(arg1),"g"(arg2),"g"(arg3)
075                 ,"i"(SOS_SWINTR_SOS_SYSCALL)      075                 ,"i"(SOS_SWINTR_SOS_SYSCALL)
076                :"eax","ebx","ecx","edx","memor    076                :"eax","ebx","ecx","edx","memory");
077                                                   077 
078   return ret;                                     078   return ret;
079 }                                                 079 }
080                                                   080 
081                                                   081 
082 int _sos_syscall0(int id)                         082 int _sos_syscall0(int id)
083 {                                                 083 {
084   return _sos_syscall3(id, 0, 0, 0);              084   return _sos_syscall3(id, 0, 0, 0);
085 }                                                 085 }
086                                                   086 
087                                                   087 
088 int _sos_syscall1(int id,                         088 int _sos_syscall1(int id,
089              unsigned int arg1)                   089              unsigned int arg1)
090 {                                                 090 {
091   return _sos_syscall3(id, arg1, 0, 0);           091   return _sos_syscall3(id, arg1, 0, 0);
092 }                                                 092 }
093                                                   093 
094                                                   094 
095 int _sos_syscall2(int id,                         095 int _sos_syscall2(int id,
096                   unsigned int arg1,              096                   unsigned int arg1,
097                   unsigned int arg2)              097                   unsigned int arg2)
098 {                                                 098 {
099   return _sos_syscall3(id, arg1, arg2, 0);        099   return _sos_syscall3(id, arg1, arg2, 0);
100 }                                                 100 }
101                                                   101 
102                                                   102 
103 int _sos_syscall4(int id,                         103 int _sos_syscall4(int id,
104                   unsigned int arg1,              104                   unsigned int arg1,
105                   unsigned int arg2,              105                   unsigned int arg2,
106                   unsigned int arg3,              106                   unsigned int arg3,
107                   unsigned int arg4)              107                   unsigned int arg4)
108 {                                                 108 {
109   unsigned int args[] = { arg3, arg4 };           109   unsigned int args[] = { arg3, arg4 };
110   return _sos_syscall3(id, arg1, arg2, (unsign    110   return _sos_syscall3(id, arg1, arg2, (unsigned)args);
111 }                                                 111 }
112                                                   112 
113                                                   113 
114 int _sos_syscall5(int id,                         114 int _sos_syscall5(int id,
115                   unsigned int arg1,              115                   unsigned int arg1,
116                   unsigned int arg2,              116                   unsigned int arg2,
117                   unsigned int arg3,              117                   unsigned int arg3,
118                   unsigned int arg4,              118                   unsigned int arg4,
119                   unsigned int arg5)              119                   unsigned int arg5)
120 {                                                 120 {
121   unsigned int args[] = { arg3, arg4, arg5 };     121   unsigned int args[] = { arg3, arg4, arg5 };
122   return _sos_syscall3(id, arg1, arg2, (unsign    122   return _sos_syscall3(id, arg1, arg2, (unsigned)args);
123 }                                                 123 }
124                                                   124 
125                                                   125 
126 int _sos_syscall6(int id,                         126 int _sos_syscall6(int id,
127                   unsigned int arg1,              127                   unsigned int arg1,
128                   unsigned int arg2,              128                   unsigned int arg2,
129                   unsigned int arg3,              129                   unsigned int arg3,
130                   unsigned int arg4,              130                   unsigned int arg4,
131                   unsigned int arg5,              131                   unsigned int arg5,
132                   unsigned int arg6)              132                   unsigned int arg6)
133 {                                                 133 {
134   unsigned int args[] = { arg3, arg4, arg5, ar    134   unsigned int args[] = { arg3, arg4, arg5, arg6 };
135   return _sos_syscall3(id, arg1, arg2, (unsign    135   return _sos_syscall3(id, arg1, arg2, (unsigned)args);
136 }                                                 136 }
137                                                   137 
138                                                   138 
139 int _sos_syscall7(int id,                         139 int _sos_syscall7(int id,
140                   unsigned int arg1,              140                   unsigned int arg1,
141                   unsigned int arg2,              141                   unsigned int arg2,
142                   unsigned int arg3,              142                   unsigned int arg3,
143                   unsigned int arg4,              143                   unsigned int arg4,
144                   unsigned int arg5,              144                   unsigned int arg5,
145                   unsigned int arg6,              145                   unsigned int arg6,
146                   unsigned int arg7)              146                   unsigned int arg7)
147 {                                                 147 {
148   unsigned int args[] = { arg3, arg4, arg5, ar    148   unsigned int args[] = { arg3, arg4, arg5, arg6, arg7 };
149   return _sos_syscall3(id, arg1, arg2, (unsign    149   return _sos_syscall3(id, arg1, arg2, (unsigned)args);
150 }                                                 150 }
151                                                   151 
152                                                   152 
153 int _sos_syscall8(int id,                         153 int _sos_syscall8(int id,
154                   unsigned int arg1,              154                   unsigned int arg1,
155                   unsigned int arg2,              155                   unsigned int arg2,
156                   unsigned int arg3,              156                   unsigned int arg3,
157                   unsigned int arg4,              157                   unsigned int arg4,
158                   unsigned int arg5,              158                   unsigned int arg5,
159                   unsigned int arg6,              159                   unsigned int arg6,
160                   unsigned int arg7,              160                   unsigned int arg7,
161                   unsigned int arg8)              161                   unsigned int arg8)
162 {                                                 162 {
163   unsigned int args[] = { arg3, arg4, arg5, ar    163   unsigned int args[] = { arg3, arg4, arg5, arg6, arg7, arg8 };
164   return _sos_syscall3(id, arg1, arg2, (unsign    164   return _sos_syscall3(id, arg1, arg2, (unsigned)args);
165 }                                                 165 }
166                                                   166 
167                                                   167 
168 void _sos_exit(int status)                        168 void _sos_exit(int status)
169 {                                                 169 {
170   _sos_syscall1(SOS_SYSCALL_ID_EXIT, (unsigned    170   _sos_syscall1(SOS_SYSCALL_ID_EXIT, (unsigned)status);
171                                                   171   
172   /* Never reached ! */                           172   /* Never reached ! */
173   for ( ; ; )                                     173   for ( ; ; )
174     ;                                             174     ;
175 }                                                 175 }
176                                                   176 
177                                                   177 
178 int _sos_bochs_write(const char * str, unsigne    178 int _sos_bochs_write(const char * str, unsigned length)
179 {                                                 179 {
180   return _sos_syscall2(SOS_SYSCALL_ID_BOCHS_WR    180   return _sos_syscall2(SOS_SYSCALL_ID_BOCHS_WRITE,
181                        (unsigned)str,             181                        (unsigned)str,
182                        length);                   182                        length);
183 }                                                 183 }
184                                                   184 
185                                                   185 
186 int _sos_fork()                                   186 int _sos_fork()
187 {                                                 187 {
188   return _sos_syscall0(SOS_SYSCALL_ID_FORK);      188   return _sos_syscall0(SOS_SYSCALL_ID_FORK);
189 }                                                 189 }
190                                                   190 
191                                                   191 
192 int _sos_exec(const char * prog)                  192 int _sos_exec(const char * prog)
193 {                                                 193 {
194   return _sos_syscall2(SOS_SYSCALL_ID_EXEC, (u    194   return _sos_syscall2(SOS_SYSCALL_ID_EXEC, (unsigned int)prog,
195                        (unsigned int)strlen(pr    195                        (unsigned int)strlen(prog));
196 }                                                 196 }
197                                                   197 
198                                                   198 
199 int _sos_munmap(void * start, size_t length)      199 int _sos_munmap(void * start, size_t length)
200 {                                                 200 {
201   return _sos_syscall2(SOS_SYSCALL_ID_MUNMAP,     201   return _sos_syscall2(SOS_SYSCALL_ID_MUNMAP,
202                        (unsigned int)start,       202                        (unsigned int)start,
203                        length);                   203                        length);
204 }                                                 204 }
205                                                   205 
206                                                   206 
207 int _sos_mprotect(const void *addr, size_t len    207 int _sos_mprotect(const void *addr, size_t len, int prot)
208 {                                                 208 {
209   return _sos_syscall3(SOS_SYSCALL_ID_MPROTECT    209   return _sos_syscall3(SOS_SYSCALL_ID_MPROTECT,
210                        (unsigned int)addr,        210                        (unsigned int)addr,
211                        len,                       211                        len,
212                        (unsigned int)prot);       212                        (unsigned int)prot);
213 }                                                 213 }
214                                                   214 
215                                                   215 
216 int _sos_mresize(void * old_addr, size_t old_l    216 int _sos_mresize(void * old_addr, size_t old_len,
217                  void * *new_addr, size_t new_    217                  void * *new_addr, size_t new_len,
218                  unsigned long flags)             218                  unsigned long flags)
219 {                                                 219 {
220   return _sos_syscall5(SOS_SYSCALL_ID_MRESIZE,    220   return _sos_syscall5(SOS_SYSCALL_ID_MRESIZE,
221                        (unsigned int)old_addr,    221                        (unsigned int)old_addr,
222                        old_len,                   222                        old_len,
223                        (unsigned int)new_addr,    223                        (unsigned int)new_addr,
224                        new_len,                   224                        new_len,
225                        flags);                    225                        flags);
226 }                                                 226 }
227                                                   227 
228                                                   228 
                                                   >> 229 int _sos_msync(void *start, size_t length, int flags)
                                                   >> 230 {
                                                   >> 231   return _sos_syscall3(SOS_SYSCALL_ID_MSYNC,
                                                   >> 232                        (unsigned int)start,
                                                   >> 233                        length,
                                                   >> 234                        flags);  
                                                   >> 235 }
                                                   >> 236 
                                                   >> 237 
229 /**                                               238 /**
230  * Helper function that represents the start r    239  * Helper function that represents the start routine of a new user
231  * thread created from user space (syscall new    240  * thread created from user space (syscall new_thread). It takes 2
232  * arguments that are passsed in the eax/ebx r    241  * arguments that are passsed in the eax/ebx registers (@see
233  * cpu_ustate_init() in hwcore/cpu_context.c):    242  * cpu_ustate_init() in hwcore/cpu_context.c): the start function of
234  * the new thread (eax), the argument passed t    243  * the new thread (eax), the argument passed to it (ebx).
235  */                                               244  */
236 static void thread_routine()                   !! 245 static void thread_routine(void)
237 {                                                 246 {
238   /* NOTE: variables as named registers is a g    247   /* NOTE: variables as named registers is a gcc extension */
239   register unsigned long int reg_arg1 asm("%ea    248   register unsigned long int reg_arg1 asm("%eax");
240   register unsigned long int reg_arg2 asm("%eb    249   register unsigned long int reg_arg2 asm("%ebx");
241                                                   250 
242   sos_thread_func_t * func = (sos_thread_func_    251   sos_thread_func_t * func = (sos_thread_func_t*)reg_arg1;
243   unsigned long int arg = reg_arg2;               252   unsigned long int arg = reg_arg2;
244                                                   253 
245   func(arg);                                      254   func(arg);
246   _sos_exit(0);                                   255   _sos_exit(0);
247 }                                                 256 }
248                                                   257 
249                                                   258 
250 int _sos_new_thread(sos_thread_func_t *func,      259 int _sos_new_thread(sos_thread_func_t *func,
251                     void* arg,                    260                     void* arg,
252                     size_t stack_size)            261                     size_t stack_size)
253 {                                                 262 {
254   return _sos_syscall4(SOS_SYSCALL_ID_NEW_THRE    263   return _sos_syscall4(SOS_SYSCALL_ID_NEW_THREAD,
255                        (unsigned)thread_routin    264                        (unsigned)thread_routine,
256                        (unsigned)func, (unsign    265                        (unsigned)func, (unsigned)arg,
257                        stack_size);               266                        stack_size);
258 }                                                 267 }
259                                                   268 
260                                                   269 
261 int _sos_nanosleep(unsigned long int sec,         270 int _sos_nanosleep(unsigned long int sec,
262                    unsigned long int nanosec)     271                    unsigned long int nanosec)
263 {                                                 272 {
264   return _sos_syscall2(SOS_SYSCALL_ID_NANOSLEE    273   return _sos_syscall2(SOS_SYSCALL_ID_NANOSLEEP,
265                        sec, nanosec);             274                        sec, nanosec);
266 }                                                 275 }
267                                                   276 
268                                                   277 
269 void * _sos_brk(void * new_top_address)           278 void * _sos_brk(void * new_top_address)
270 {                                                 279 {
271   return (void*)_sos_syscall1(SOS_SYSCALL_ID_B    280   return (void*)_sos_syscall1(SOS_SYSCALL_ID_BRK,
272                               (unsigned)new_to    281                               (unsigned)new_top_address);
273 }                                                 282 }
274                                                   283 
275                                                   284 
276 int _sos_mount(const char *source, const char     285 int _sos_mount(const char *source, const char *target,
277                const char *filesystemtype, uns    286                const char *filesystemtype, unsigned long mountflags,
278                const char *args)                  287                const char *args)
279 {                                                 288 {
280   if (!target || !filesystemtype)                 289   if (!target || !filesystemtype)
281     return -1;                                    290     return -1;
282                                                   291 
283   return _sos_syscall7(SOS_SYSCALL_ID_MOUNT,      292   return _sos_syscall7(SOS_SYSCALL_ID_MOUNT,
284                        (unsigned int)source, s    293                        (unsigned int)source, source?strlen(source):0,
285                        (unsigned int)target, s    294                        (unsigned int)target, strlen(target),
286                        (unsigned int)filesyste    295                        (unsigned int)filesystemtype,
287                        mountflags,                296                        mountflags,
288                        (unsigned int)args);       297                        (unsigned int)args);
289 }                                                 298 }
290                                                   299 
291                                                   300 
292 int _sos_umount(const char *target)               301 int _sos_umount(const char *target)
293 {                                                 302 {
294   if (!target)                                    303   if (!target)
295     return -1;                                    304     return -1;
296                                                   305 
297   return _sos_syscall2(SOS_SYSCALL_ID_UMOUNT,     306   return _sos_syscall2(SOS_SYSCALL_ID_UMOUNT,
298                        (unsigned int)target,      307                        (unsigned int)target,
299                        strlen(target));           308                        strlen(target));
300 }                                                 309 }
301                                                   310 
302                                                   311 
303 void _sos_sync(void)                              312 void _sos_sync(void)
304 {                                                 313 {
305   _sos_syscall0(SOS_SYSCALL_ID_SYNC);             314   _sos_syscall0(SOS_SYSCALL_ID_SYNC);
306 }                                                 315 }
307                                                   316 
308                                                   317 
309 int _sos_statvfs(const char *path, struct stat    318 int _sos_statvfs(const char *path, struct statvfs *buf)
310 {                                                 319 {
311   if (! path)                                     320   if (! path)
312     return -1;                                    321     return -1;
313                                                   322     
314   return _sos_syscall3(SOS_SYSCALL_ID_VFSTAT64    323   return _sos_syscall3(SOS_SYSCALL_ID_VFSTAT64,
315                        (unsigned)path,            324                        (unsigned)path,
316                        strlen(path),              325                        strlen(path),
317                        (unsigned)buf);            326                        (unsigned)buf);
318 }                                                 327 }
319                                                   328 
320                                                   329 
321 int _sos_open(const char * pathname, int flags    330 int _sos_open(const char * pathname, int flags, int mode)
322 {                                                 331 {
323   if (! pathname)                                 332   if (! pathname)
324     return -1;                                    333     return -1;
325                                                   334 
326   return _sos_syscall4(SOS_SYSCALL_ID_OPEN,       335   return _sos_syscall4(SOS_SYSCALL_ID_OPEN,
327                        (unsigned)pathname,        336                        (unsigned)pathname,
328                        strlen(pathname),          337                        strlen(pathname),
329                        flags,                     338                        flags,
330                        mode);                     339                        mode);
331 }                                                 340 }
332                                                   341 
333                                                   342 
334 int _sos_close(int fd)                            343 int _sos_close(int fd)
335 {                                                 344 {
336   return _sos_syscall1(SOS_SYSCALL_ID_CLOSE, f    345   return _sos_syscall1(SOS_SYSCALL_ID_CLOSE, fd);
337 }                                                 346 }
338                                                   347 
339                                                   348 
340 int _sos_read(int fd, char * buf, size_t * len    349 int _sos_read(int fd, char * buf, size_t * len)
341 {                                                 350 {
342   return _sos_syscall3(SOS_SYSCALL_ID_READ, fd    351   return _sos_syscall3(SOS_SYSCALL_ID_READ, fd,
343                        (unsigned int) buf,        352                        (unsigned int) buf,
344                        (unsigned int) len);       353                        (unsigned int) len);
345 }                                                 354 }
346                                                   355 
347                                                   356 
348 int _sos_write(int fd, const char * buf, size_    357 int _sos_write(int fd, const char * buf, size_t * len)
349 {                                                 358 {
350   return _sos_syscall3(SOS_SYSCALL_ID_WRITE, f    359   return _sos_syscall3(SOS_SYSCALL_ID_WRITE, fd,
351                        (unsigned int) buf,        360                        (unsigned int) buf,
352                        (unsigned int) len);       361                        (unsigned int) len);
353 }                                                 362 }
354                                                   363 
355                                                   364 
356 int _sos_seek64(int fd, loff_t * offset, int w    365 int _sos_seek64(int fd, loff_t * offset, int whence)
357 {                                                 366 {
358   return _sos_syscall3(SOS_SYSCALL_ID_SEEK64,     367   return _sos_syscall3(SOS_SYSCALL_ID_SEEK64, fd,
359                        (unsigned int)offset,      368                        (unsigned int)offset,
360                        (unsigned int)whence);     369                        (unsigned int)whence);
361 }                                                 370 }
362                                                   371 
363                                                   372 
364 int _sos_fmmap(void ** ptr_hint_addr, size_t l    373 int _sos_fmmap(void ** ptr_hint_addr, size_t len, int prot, int flags,
365                int fd, loff_t offset)             374                int fd, loff_t offset)
366 {                                                 375 {
367   return _sos_syscall7(SOS_SYSCALL_ID_FSMMAP,     376   return _sos_syscall7(SOS_SYSCALL_ID_FSMMAP,
368                        (unsigned int)ptr_hint_    377                        (unsigned int)ptr_hint_addr, len, prot, flags,
369                        (unsigned int)fd,          378                        (unsigned int)fd,
370                        /* offs64_hi */(offset     379                        /* offs64_hi */(offset >> 32),
371                        /* offs64_lo */(offset     380                        /* offs64_lo */(offset & 0xffffffff));
372 }                                                 381 }
373                                                   382 
374                                                   383 
375 int _sos_ftruncate64(int fd, loff_t length)       384 int _sos_ftruncate64(int fd, loff_t length)
376 {                                                 385 {
377   return _sos_syscall2(SOS_SYSCALL_ID_FTRUNCAT    386   return _sos_syscall2(SOS_SYSCALL_ID_FTRUNCATE64, fd,
378                        (unsigned int)length);     387                        (unsigned int)length);  
379 }                                                 388 }
380                                                   389 
381                                                   390 
382 int _sos_fcntl(int fd, int cmd, int arg)          391 int _sos_fcntl(int fd, int cmd, int arg)
383 {                                                 392 {
384   return _sos_syscall3(SOS_SYSCALL_ID_FCNTL, f    393   return _sos_syscall3(SOS_SYSCALL_ID_FCNTL, fd,
385                        (unsigned int)cmd,         394                        (unsigned int)cmd,
386                        (unsigned int)arg);        395                        (unsigned int)arg);
387 }                                                 396 }
388                                                   397 
389                                                   398 
390 int _sos_ioctl(int fd, int cmd, int arg)          399 int _sos_ioctl(int fd, int cmd, int arg)
391 {                                                 400 {
392   return _sos_syscall3(SOS_SYSCALL_ID_IOCTL, f    401   return _sos_syscall3(SOS_SYSCALL_ID_IOCTL, fd,
393                        (unsigned int)cmd,         402                        (unsigned int)cmd,
394                        (unsigned int)arg);        403                        (unsigned int)arg);
395 }                                                 404 }
396                                                   405 
397                                                   406 
398 int _sos_creat(const char *pathname, int mode)    407 int _sos_creat(const char *pathname, int mode)
399 {                                                 408 {
400   if (! pathname)                                 409   if (! pathname)
401     return -1;                                    410     return -1;
402                                                   411 
403   return _sos_syscall3(SOS_SYSCALL_ID_CREAT,      412   return _sos_syscall3(SOS_SYSCALL_ID_CREAT,
404                        (unsigned int)pathname,    413                        (unsigned int)pathname,
405                        strlen(pathname),          414                        strlen(pathname),
406                        mode);                     415                        mode);
407 }                                                 416 }
408                                                   417 
409                                                   418 
410 int _sos_link (const char *oldpath, const char    419 int _sos_link (const char *oldpath, const char *newpath)
411 {                                                 420 {
412   if (!oldpath || !newpath)                       421   if (!oldpath || !newpath)
413     return -1;                                    422     return -1;
414                                                   423 
415   return _sos_syscall4(SOS_SYSCALL_ID_LINK,       424   return _sos_syscall4(SOS_SYSCALL_ID_LINK,
416                        (unsigned int)oldpath,     425                        (unsigned int)oldpath,
417                        strlen(oldpath),           426                        strlen(oldpath),
418                        (unsigned int)newpath,     427                        (unsigned int)newpath,
419                        strlen(newpath));          428                        strlen(newpath));
420 }                                                 429 }
421                                                   430 
422                                                   431 
423 int _sos_unlink(const char *pathname)             432 int _sos_unlink(const char *pathname)
424 {                                                 433 {
425   if (! pathname)                                 434   if (! pathname)
426     return -1;                                    435     return -1;
427                                                   436 
428   return _sos_syscall2(SOS_SYSCALL_ID_UNLINK,     437   return _sos_syscall2(SOS_SYSCALL_ID_UNLINK,
429                        (unsigned int)pathname,    438                        (unsigned int)pathname,
430                        strlen(pathname));         439                        strlen(pathname));
431 }                                                 440 }
432                                                   441 
433                                                   442 
434 int _sos_rename (const char *oldpath, const ch    443 int _sos_rename (const char *oldpath, const char *newpath)
435 {                                                 444 {
436   if (!oldpath || !newpath)                       445   if (!oldpath || !newpath)
437     return -1;                                    446     return -1;
438                                                   447 
439   return _sos_syscall4(SOS_SYSCALL_ID_RENAME,     448   return _sos_syscall4(SOS_SYSCALL_ID_RENAME,
440                        (unsigned int)oldpath,     449                        (unsigned int)oldpath,
441                        strlen(oldpath),           450                        strlen(oldpath),
442                        (unsigned int)newpath,     451                        (unsigned int)newpath,
443                        strlen(newpath));          452                        strlen(newpath));
444 }                                                 453 }
445                                                   454 
446                                                   455 
447 int _sos_symlink(const char *target, const cha    456 int _sos_symlink(const char *target, const char *path)
448 {                                                 457 {
449   if (!path || !target)                           458   if (!path || !target)
450     return -1;                                    459     return -1;
451                                                   460 
452   return _sos_syscall4(SOS_SYSCALL_ID_SYMLINK,    461   return _sos_syscall4(SOS_SYSCALL_ID_SYMLINK,
453                        (unsigned int)path,        462                        (unsigned int)path,
454                        strlen(path),              463                        strlen(path),
455                        (unsigned int)target,      464                        (unsigned int)target,
456                        strlen(target));           465                        strlen(target));
457 }                                                 466 }
458                                                   467 
459                                                   468 
460 int _sos_mknod(const char *pathname, mode_t mo    469 int _sos_mknod(const char *pathname, mode_t mode,
461                int type,                          470                int type,
462                unsigned int major, unsigned mi    471                unsigned int major, unsigned minor)
463 {                                                 472 {
464   if (!pathname)                                  473   if (!pathname)
465     return -1;                                    474     return -1;
466                                                   475 
467   return _sos_syscall6(SOS_SYSCALL_ID_MKNOD,      476   return _sos_syscall6(SOS_SYSCALL_ID_MKNOD,
468                        (unsigned int)pathname,    477                        (unsigned int)pathname,
469                        strlen(pathname),          478                        strlen(pathname),
470                        type, mode, major, mino    479                        type, mode, major, minor);
471 }                                                 480 }
472                                                   481 
473                                                   482 
474 struct dirent; /* Forward declaration */          483 struct dirent; /* Forward declaration */
475 int _sos_readdir(int fd, struct dirent * diren    484 int _sos_readdir(int fd, struct dirent * dirent)
476 {                                                 485 {
477   return _sos_syscall2(SOS_SYSCALL_ID_READDIR,    486   return _sos_syscall2(SOS_SYSCALL_ID_READDIR,
478                        fd,                        487                        fd,
479                        (unsigned int)dirent);     488                        (unsigned int)dirent);
480 }                                                 489 }
481                                                   490 
482                                                   491 
483 int _sos_mkdir(const char *pathname, mode_t mo    492 int _sos_mkdir(const char *pathname, mode_t mode)
484 {                                                 493 {
485   if (!pathname)                                  494   if (!pathname)
486     return -1;                                    495     return -1;
487                                                   496 
488   return _sos_syscall3(SOS_SYSCALL_ID_MKDIR,      497   return _sos_syscall3(SOS_SYSCALL_ID_MKDIR,
489                        (unsigned int)pathname,    498                        (unsigned int)pathname,
490                        strlen(pathname),          499                        strlen(pathname),
491                        mode);                     500                        mode);
492 }                                                 501 }
493                                                   502 
494                                                   503 
495 int _sos_rmdir(const char *pathname)              504 int _sos_rmdir(const char *pathname)
496 {                                                 505 {
497   if (!pathname)                                  506   if (!pathname)
498     return -1;                                    507     return -1;
499                                                   508 
500   return _sos_syscall2(SOS_SYSCALL_ID_RMDIR,      509   return _sos_syscall2(SOS_SYSCALL_ID_RMDIR,
501                        (unsigned int)pathname,    510                        (unsigned int)pathname,
502                        strlen(pathname));         511                        strlen(pathname));
503 }                                                 512 }
504                                                   513 
505                                                   514 
506 int _sos_chmod(const char *pathname, mode_t mo    515 int _sos_chmod(const char *pathname, mode_t mode)
507 {                                                 516 {
508   if (!pathname)                                  517   if (!pathname)
509     return -1;                                    518     return -1;
510                                                   519 
511   return _sos_syscall3(SOS_SYSCALL_ID_CHMOD,      520   return _sos_syscall3(SOS_SYSCALL_ID_CHMOD,
512                        (unsigned int)pathname,    521                        (unsigned int)pathname,
513                        strlen(pathname),          522                        strlen(pathname),
514                        mode);                     523                        mode);
515 }                                                 524 }
516                                                   525 
517                                                   526 
518 int _sos_stat(const char *pathname, int nofoll    527 int _sos_stat(const char *pathname, int nofollow, struct stat * st)
519 {                                                 528 {
520   if (!pathname || !st)                           529   if (!pathname || !st)
521     return -1;                                    530     return -1;
522                                                   531 
523   return _sos_syscall4(SOS_SYSCALL_ID_STAT64,     532   return _sos_syscall4(SOS_SYSCALL_ID_STAT64,
524                        (unsigned int)pathname,    533                        (unsigned int)pathname,
525                        strlen(pathname),          534                        strlen(pathname),
526                        nofollow,                  535                        nofollow,
527                        (unsigned int)st);         536                        (unsigned int)st);
528 }                                                 537 }
529                                                   538 
530                                                   539 
531 int _sos_chroot(const char *dirname)              540 int _sos_chroot(const char *dirname)
532 {                                                 541 {
533   if (!dirname)                                   542   if (!dirname)
534     return -1;                                    543     return -1;
535                                                   544 
536   return _sos_syscall2(SOS_SYSCALL_ID_CHROOT,     545   return _sos_syscall2(SOS_SYSCALL_ID_CHROOT,
537                        (unsigned int)dirname,     546                        (unsigned int)dirname,
538                        strlen(dirname));          547                        strlen(dirname));
539 }                                                 548 }
540                                                   549 
541                                                   550 
542 int _sos_chdir(const char *dirname)               551 int _sos_chdir(const char *dirname)
543 {                                                 552 {
544   if (!dirname)                                   553   if (!dirname)
545     return -1;                                    554     return -1;
546                                                   555 
547   return _sos_syscall2(SOS_SYSCALL_ID_CHDIR,      556   return _sos_syscall2(SOS_SYSCALL_ID_CHDIR,
548                        (unsigned int)dirname,     557                        (unsigned int)dirname,
549                        strlen(dirname));          558                        strlen(dirname));
550 }                                                 559 }
551                                                   560 
552                                                   561 
553 int _sos_fchdir(int fd)                           562 int _sos_fchdir(int fd)
554 {                                                 563 {
555   return _sos_syscall1(SOS_SYSCALL_ID_FCHDIR,     564   return _sos_syscall1(SOS_SYSCALL_ID_FCHDIR,
556                        (unsigned int)fd);         565                        (unsigned int)fd);
557 }                                                 566 }
                                                      

source navigation ] diff markup ] identifier search ] general search ]