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.5) and /userland/crt.c (Article 8)


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(void) __attribute__((noreturn));   !! 035 void _start() __attribute__((noreturn));
036 void _start(void)                              !! 036 void _start()
037 {                                                 037 {
038   /* This starter function expects a main() fu    038   /* This starter function expects a main() function somewhere */
039   extern int main(void);                       !! 039   extern int main();
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");
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_fakemmap(void ** ptr_hint_addr, size_t len, int prot, int flags,
                                                   >> 200                   const char *resource_path, loff_t offset)
                                                   >> 201 {
                                                   >> 202   return _sos_syscall7(SOS_SYSCALL_ID_FAKEMMAP,
                                                   >> 203                        (unsigned int)ptr_hint_addr, len, prot, flags,
                                                   >> 204                        (unsigned int)resource_path,
                                                   >> 205                        /* offs64_hi */(offset >> 32),
                                                   >> 206                        /* offs64_lo */(offset & 0xffffffff));
                                                   >> 207 }
                                                   >> 208 
                                                   >> 209 
199 int _sos_munmap(void * start, size_t length)      210 int _sos_munmap(void * start, size_t length)
200 {                                                 211 {
201   return _sos_syscall2(SOS_SYSCALL_ID_MUNMAP,     212   return _sos_syscall2(SOS_SYSCALL_ID_MUNMAP,
202                        (unsigned int)start,       213                        (unsigned int)start,
203                        length);                   214                        length);
204 }                                                 215 }
205                                                   216 
206                                                   217 
207 int _sos_mprotect(const void *addr, size_t len    218 int _sos_mprotect(const void *addr, size_t len, int prot)
208 {                                                 219 {
209   return _sos_syscall3(SOS_SYSCALL_ID_MPROTECT    220   return _sos_syscall3(SOS_SYSCALL_ID_MPROTECT,
210                        (unsigned int)addr,        221                        (unsigned int)addr,
211                        len,                       222                        len,
212                        (unsigned int)prot);       223                        (unsigned int)prot);
213 }                                                 224 }
214                                                   225 
215                                                   226 
216 int _sos_mresize(void * old_addr, size_t old_l    227 int _sos_mresize(void * old_addr, size_t old_len,
217                  void * *new_addr, size_t new_    228                  void * *new_addr, size_t new_len,
218                  unsigned long flags)             229                  unsigned long flags)
219 {                                                 230 {
220   return _sos_syscall5(SOS_SYSCALL_ID_MRESIZE,    231   return _sos_syscall5(SOS_SYSCALL_ID_MRESIZE,
221                        (unsigned int)old_addr,    232                        (unsigned int)old_addr,
222                        old_len,                   233                        old_len,
223                        (unsigned int)new_addr,    234                        (unsigned int)new_addr,
224                        new_len,                   235                        new_len,
225                        flags);                    236                        flags);
226 }                                                 237 }
227                                                   238 
228                                                   239 
229 int _sos_msync(void *start, size_t length, int << 
230 {                                              << 
231   return _sos_syscall3(SOS_SYSCALL_ID_MSYNC,   << 
232                        (unsigned int)start,    << 
233                        length,                 << 
234                        flags);                 << 
235 }                                              << 
236                                                << 
237                                                << 
238 /**                                               240 /**
239  * Helper function that represents the start r    241  * Helper function that represents the start routine of a new user
240  * thread created from user space (syscall new    242  * thread created from user space (syscall new_thread). It takes 2
241  * arguments that are passsed in the eax/ebx r    243  * arguments that are passsed in the eax/ebx registers (@see
242  * cpu_ustate_init() in hwcore/cpu_context.c):    244  * cpu_ustate_init() in hwcore/cpu_context.c): the start function of
243  * the new thread (eax), the argument passed t    245  * the new thread (eax), the argument passed to it (ebx).
244  */                                               246  */
245 static void thread_routine(void)               !! 247 static void thread_routine()
246 {                                                 248 {
247   /* NOTE: variables as named registers is a g    249   /* NOTE: variables as named registers is a gcc extension */
248   register unsigned long int reg_arg1 asm("%ea    250   register unsigned long int reg_arg1 asm("%eax");
249   register unsigned long int reg_arg2 asm("%eb    251   register unsigned long int reg_arg2 asm("%ebx");
250                                                   252 
251   sos_thread_func_t * func = (sos_thread_func_    253   sos_thread_func_t * func = (sos_thread_func_t*)reg_arg1;
252   unsigned long int arg = reg_arg2;               254   unsigned long int arg = reg_arg2;
253                                                   255 
254   func(arg);                                      256   func(arg);
255   _sos_exit(0);                                   257   _sos_exit(0);
256 }                                                 258 }
257                                                   259 
258                                                   260 
259 int _sos_new_thread(sos_thread_func_t *func,      261 int _sos_new_thread(sos_thread_func_t *func,
260                     void* arg,                    262                     void* arg,
261                     size_t stack_size)            263                     size_t stack_size)
262 {                                                 264 {
263   return _sos_syscall4(SOS_SYSCALL_ID_NEW_THRE    265   return _sos_syscall4(SOS_SYSCALL_ID_NEW_THREAD,
264                        (unsigned)thread_routin    266                        (unsigned)thread_routine,
265                        (unsigned)func, (unsign    267                        (unsigned)func, (unsigned)arg,
266                        stack_size);               268                        stack_size);
267 }                                                 269 }
268                                                   270 
269                                                   271 
270 int _sos_nanosleep(unsigned long int sec,         272 int _sos_nanosleep(unsigned long int sec,
271                    unsigned long int nanosec)     273                    unsigned long int nanosec)
272 {                                                 274 {
273   return _sos_syscall2(SOS_SYSCALL_ID_NANOSLEE    275   return _sos_syscall2(SOS_SYSCALL_ID_NANOSLEEP,
274                        sec, nanosec);             276                        sec, nanosec);
275 }                                                 277 }
276                                                   278 
277                                                   279 
278 void * _sos_brk(void * new_top_address)           280 void * _sos_brk(void * new_top_address)
279 {                                                 281 {
280   return (void*)_sos_syscall1(SOS_SYSCALL_ID_B    282   return (void*)_sos_syscall1(SOS_SYSCALL_ID_BRK,
281                               (unsigned)new_to    283                               (unsigned)new_top_address);
282 }                                                 284 }
283                                                   285 
284                                                   286 
285 int _sos_mount(const char *source, const char     287 int _sos_mount(const char *source, const char *target,
286                const char *filesystemtype, uns    288                const char *filesystemtype, unsigned long mountflags,
287                const char *args)                  289                const char *args)
288 {                                                 290 {
289   if (!target || !filesystemtype)                 291   if (!target || !filesystemtype)
290     return -1;                                    292     return -1;
291                                                   293 
292   return _sos_syscall7(SOS_SYSCALL_ID_MOUNT,      294   return _sos_syscall7(SOS_SYSCALL_ID_MOUNT,
293                        (unsigned int)source, s    295                        (unsigned int)source, source?strlen(source):0,
294                        (unsigned int)target, s    296                        (unsigned int)target, strlen(target),
295                        (unsigned int)filesyste    297                        (unsigned int)filesystemtype,
296                        mountflags,                298                        mountflags,
297                        (unsigned int)args);       299                        (unsigned int)args);
298 }                                                 300 }
299                                                   301 
300                                                   302 
301 int _sos_umount(const char *target)               303 int _sos_umount(const char *target)
302 {                                                 304 {
303   if (!target)                                    305   if (!target)
304     return -1;                                    306     return -1;
305                                                   307 
306   return _sos_syscall2(SOS_SYSCALL_ID_UMOUNT,     308   return _sos_syscall2(SOS_SYSCALL_ID_UMOUNT,
307                        (unsigned int)target,      309                        (unsigned int)target,
308                        strlen(target));           310                        strlen(target));
309 }                                                 311 }
310                                                   312 
311                                                   313 
312 void _sos_sync(void)                              314 void _sos_sync(void)
313 {                                                 315 {
314   _sos_syscall0(SOS_SYSCALL_ID_SYNC);             316   _sos_syscall0(SOS_SYSCALL_ID_SYNC);
315 }                                                 317 }
316                                                   318 
317                                                   319 
318 int _sos_statvfs(const char *path, struct stat    320 int _sos_statvfs(const char *path, struct statvfs *buf)
319 {                                                 321 {
320   if (! path)                                     322   if (! path)
321     return -1;                                    323     return -1;
322                                                   324     
323   return _sos_syscall3(SOS_SYSCALL_ID_VFSTAT64    325   return _sos_syscall3(SOS_SYSCALL_ID_VFSTAT64,
324                        (unsigned)path,            326                        (unsigned)path,
325                        strlen(path),              327                        strlen(path),
326                        (unsigned)buf);            328                        (unsigned)buf);
327 }                                                 329 }
328                                                   330 
329                                                   331 
330 int _sos_open(const char * pathname, int flags    332 int _sos_open(const char * pathname, int flags, int mode)
331 {                                                 333 {
332   if (! pathname)                                 334   if (! pathname)
333     return -1;                                    335     return -1;
334                                                !! 336     
335   return _sos_syscall4(SOS_SYSCALL_ID_OPEN,       337   return _sos_syscall4(SOS_SYSCALL_ID_OPEN,
336                        (unsigned)pathname,        338                        (unsigned)pathname,
337                        strlen(pathname),          339                        strlen(pathname),
338                        flags,                     340                        flags,
339                        mode);                     341                        mode);
340 }                                                 342 }
341                                                   343 
342                                                   344 
343 int _sos_close(int fd)                            345 int _sos_close(int fd)
344 {                                                 346 {
345   return _sos_syscall1(SOS_SYSCALL_ID_CLOSE, f    347   return _sos_syscall1(SOS_SYSCALL_ID_CLOSE, fd);
346 }                                                 348 }
347                                                   349 
348                                                   350 
349 int _sos_read(int fd, char * buf, size_t * len    351 int _sos_read(int fd, char * buf, size_t * len)
350 {                                                 352 {
351   return _sos_syscall3(SOS_SYSCALL_ID_READ, fd    353   return _sos_syscall3(SOS_SYSCALL_ID_READ, fd,
352                        (unsigned int) buf,        354                        (unsigned int) buf,
353                        (unsigned int) len);       355                        (unsigned int) len);
354 }                                                 356 }
355                                                   357 
356                                                   358 
357 int _sos_write(int fd, const char * buf, size_    359 int _sos_write(int fd, const char * buf, size_t * len)
358 {                                                 360 {
359   return _sos_syscall3(SOS_SYSCALL_ID_WRITE, f    361   return _sos_syscall3(SOS_SYSCALL_ID_WRITE, fd,
360                        (unsigned int) buf,        362                        (unsigned int) buf,
361                        (unsigned int) len);       363                        (unsigned int) len);
362 }                                                 364 }
363                                                   365 
364                                                   366 
365 int _sos_seek64(int fd, loff_t * offset, int w    367 int _sos_seek64(int fd, loff_t * offset, int whence)
366 {                                                 368 {
367   return _sos_syscall3(SOS_SYSCALL_ID_SEEK64,     369   return _sos_syscall3(SOS_SYSCALL_ID_SEEK64, fd,
368                        (unsigned int)offset,      370                        (unsigned int)offset,
369                        (unsigned int)whence);     371                        (unsigned int)whence);
370 }                                                 372 }
371                                                   373 
372                                                   374 
373 int _sos_fmmap(void ** ptr_hint_addr, size_t l    375 int _sos_fmmap(void ** ptr_hint_addr, size_t len, int prot, int flags,
374                int fd, loff_t offset)             376                int fd, loff_t offset)
375 {                                                 377 {
376   return _sos_syscall7(SOS_SYSCALL_ID_FSMMAP,     378   return _sos_syscall7(SOS_SYSCALL_ID_FSMMAP,
377                        (unsigned int)ptr_hint_    379                        (unsigned int)ptr_hint_addr, len, prot, flags,
378                        (unsigned int)fd,          380                        (unsigned int)fd,
379                        /* offs64_hi */(offset     381                        /* offs64_hi */(offset >> 32),
380                        /* offs64_lo */(offset     382                        /* offs64_lo */(offset & 0xffffffff));
381 }                                                 383 }
382                                                   384 
383                                                   385 
384 int _sos_ftruncate64(int fd, loff_t length)       386 int _sos_ftruncate64(int fd, loff_t length)
385 {                                                 387 {
386   return _sos_syscall2(SOS_SYSCALL_ID_FTRUNCAT    388   return _sos_syscall2(SOS_SYSCALL_ID_FTRUNCATE64, fd,
387                        (unsigned int)length);     389                        (unsigned int)length);  
388 }                                                 390 }
389                                                   391 
390                                                   392 
391 int _sos_fcntl(int fd, int cmd, int arg)          393 int _sos_fcntl(int fd, int cmd, int arg)
392 {                                                 394 {
393   return _sos_syscall3(SOS_SYSCALL_ID_FCNTL, f    395   return _sos_syscall3(SOS_SYSCALL_ID_FCNTL, fd,
394                        (unsigned int)cmd,         396                        (unsigned int)cmd,
395                        (unsigned int)arg);        397                        (unsigned int)arg);
396 }                                                 398 }
397                                                   399 
398                                                   400 
399 int _sos_ioctl(int fd, int cmd, int arg)       << 
400 {                                              << 
401   return _sos_syscall3(SOS_SYSCALL_ID_IOCTL, f << 
402                        (unsigned int)cmd,      << 
403                        (unsigned int)arg);     << 
404 }                                              << 
405                                                << 
406                                                << 
407 int _sos_creat(const char *pathname, int mode)    401 int _sos_creat(const char *pathname, int mode)
408 {                                                 402 {
409   if (! pathname)                                 403   if (! pathname)
410     return -1;                                    404     return -1;
411                                                   405 
412   return _sos_syscall3(SOS_SYSCALL_ID_CREAT,      406   return _sos_syscall3(SOS_SYSCALL_ID_CREAT,
413                        (unsigned int)pathname,    407                        (unsigned int)pathname,
414                        strlen(pathname),          408                        strlen(pathname),
415                        mode);                     409                        mode);
416 }                                                 410 }
417                                                   411 
418                                                   412 
419 int _sos_link (const char *oldpath, const char    413 int _sos_link (const char *oldpath, const char *newpath)
420 {                                                 414 {
421   if (!oldpath || !newpath)                       415   if (!oldpath || !newpath)
422     return -1;                                    416     return -1;
423                                                   417 
424   return _sos_syscall4(SOS_SYSCALL_ID_LINK,       418   return _sos_syscall4(SOS_SYSCALL_ID_LINK,
425                        (unsigned int)oldpath,     419                        (unsigned int)oldpath,
426                        strlen(oldpath),           420                        strlen(oldpath),
427                        (unsigned int)newpath,     421                        (unsigned int)newpath,
428                        strlen(newpath));          422                        strlen(newpath));
429 }                                                 423 }
430                                                   424 
431                                                   425 
432 int _sos_unlink(const char *pathname)             426 int _sos_unlink(const char *pathname)
433 {                                                 427 {
434   if (! pathname)                                 428   if (! pathname)
435     return -1;                                    429     return -1;
436                                                   430 
437   return _sos_syscall2(SOS_SYSCALL_ID_UNLINK,     431   return _sos_syscall2(SOS_SYSCALL_ID_UNLINK,
438                        (unsigned int)pathname,    432                        (unsigned int)pathname,
439                        strlen(pathname));         433                        strlen(pathname));
440 }                                                 434 }
441                                                   435 
442                                                   436 
443 int _sos_rename (const char *oldpath, const ch    437 int _sos_rename (const char *oldpath, const char *newpath)
444 {                                                 438 {
445   if (!oldpath || !newpath)                       439   if (!oldpath || !newpath)
446     return -1;                                    440     return -1;
447                                                   441 
448   return _sos_syscall4(SOS_SYSCALL_ID_RENAME,     442   return _sos_syscall4(SOS_SYSCALL_ID_RENAME,
449                        (unsigned int)oldpath,     443                        (unsigned int)oldpath,
450                        strlen(oldpath),           444                        strlen(oldpath),
451                        (unsigned int)newpath,     445                        (unsigned int)newpath,
452                        strlen(newpath));          446                        strlen(newpath));
453 }                                                 447 }
454                                                   448 
455                                                   449 
456 int _sos_symlink(const char *target, const cha    450 int _sos_symlink(const char *target, const char *path)
457 {                                                 451 {
458   if (!path || !target)                           452   if (!path || !target)
459     return -1;                                    453     return -1;
460                                                   454 
461   return _sos_syscall4(SOS_SYSCALL_ID_SYMLINK,    455   return _sos_syscall4(SOS_SYSCALL_ID_SYMLINK,
462                        (unsigned int)path,        456                        (unsigned int)path,
463                        strlen(path),              457                        strlen(path),
464                        (unsigned int)target,      458                        (unsigned int)target,
465                        strlen(target));           459                        strlen(target));
466 }                                              << 
467                                                << 
468                                                << 
469 int _sos_mknod(const char *pathname, mode_t mo << 
470                int type,                       << 
471                unsigned int major, unsigned mi << 
472 {                                              << 
473   if (!pathname)                               << 
474     return -1;                                 << 
475                                                << 
476   return _sos_syscall6(SOS_SYSCALL_ID_MKNOD,   << 
477                        (unsigned int)pathname, << 
478                        strlen(pathname),       << 
479                        type, mode, major, mino << 
480 }                                                 460 }
481                                                   461 
482                                                   462 
483 struct dirent; /* Forward declaration */          463 struct dirent; /* Forward declaration */
484 int _sos_readdir(int fd, struct dirent * diren    464 int _sos_readdir(int fd, struct dirent * dirent)
485 {                                                 465 {
486   return _sos_syscall2(SOS_SYSCALL_ID_READDIR,    466   return _sos_syscall2(SOS_SYSCALL_ID_READDIR,
487                        fd,                        467                        fd,
488                        (unsigned int)dirent);     468                        (unsigned int)dirent);
489 }                                                 469 }
490                                                   470 
491                                                   471 
492 int _sos_mkdir(const char *pathname, mode_t mo    472 int _sos_mkdir(const char *pathname, mode_t mode)
493 {                                                 473 {
494   if (!pathname)                                  474   if (!pathname)
495     return -1;                                    475     return -1;
496                                                   476 
497   return _sos_syscall3(SOS_SYSCALL_ID_MKDIR,      477   return _sos_syscall3(SOS_SYSCALL_ID_MKDIR,
498                        (unsigned int)pathname,    478                        (unsigned int)pathname,
499                        strlen(pathname),          479                        strlen(pathname),
500                        mode);                     480                        mode);
501 }                                                 481 }
502                                                   482 
503                                                   483 
504 int _sos_rmdir(const char *pathname)              484 int _sos_rmdir(const char *pathname)
505 {                                                 485 {
506   if (!pathname)                                  486   if (!pathname)
507     return -1;                                    487     return -1;
508                                                   488 
509   return _sos_syscall2(SOS_SYSCALL_ID_RMDIR,      489   return _sos_syscall2(SOS_SYSCALL_ID_RMDIR,
510                        (unsigned int)pathname,    490                        (unsigned int)pathname,
511                        strlen(pathname));         491                        strlen(pathname));
512 }                                                 492 }
513                                                   493 
514                                                   494 
515 int _sos_chmod(const char *pathname, mode_t mo    495 int _sos_chmod(const char *pathname, mode_t mode)
516 {                                                 496 {
517   if (!pathname)                                  497   if (!pathname)
518     return -1;                                    498     return -1;
519                                                   499 
520   return _sos_syscall3(SOS_SYSCALL_ID_CHMOD,      500   return _sos_syscall3(SOS_SYSCALL_ID_CHMOD,
521                        (unsigned int)pathname,    501                        (unsigned int)pathname,
522                        strlen(pathname),          502                        strlen(pathname),
523                        mode);                     503                        mode);
524 }                                                 504 }
525                                                   505 
526                                                   506 
527 int _sos_stat(const char *pathname, int nofoll    507 int _sos_stat(const char *pathname, int nofollow, struct stat * st)
528 {                                                 508 {
529   if (!pathname || !st)                           509   if (!pathname || !st)
530     return -1;                                    510     return -1;
531                                                   511 
532   return _sos_syscall4(SOS_SYSCALL_ID_STAT64,     512   return _sos_syscall4(SOS_SYSCALL_ID_STAT64,
533                        (unsigned int)pathname,    513                        (unsigned int)pathname,
534                        strlen(pathname),          514                        strlen(pathname),
535                        nofollow,                  515                        nofollow,
536                        (unsigned int)st);         516                        (unsigned int)st);
537 }                                                 517 }
538                                                   518 
539                                                   519 
540 int _sos_chroot(const char *dirname)              520 int _sos_chroot(const char *dirname)
541 {                                                 521 {
542   if (!dirname)                                   522   if (!dirname)
543     return -1;                                    523     return -1;
544                                                   524 
545   return _sos_syscall2(SOS_SYSCALL_ID_CHROOT,     525   return _sos_syscall2(SOS_SYSCALL_ID_CHROOT,
546                        (unsigned int)dirname,     526                        (unsigned int)dirname,
547                        strlen(dirname));          527                        strlen(dirname));
548 }                                                 528 }
549                                                   529 
550                                                   530 
551 int _sos_chdir(const char *dirname)               531 int _sos_chdir(const char *dirname)
552 {                                                 532 {
553   if (!dirname)                                   533   if (!dirname)
554     return -1;                                    534     return -1;
555                                                   535 
556   return _sos_syscall2(SOS_SYSCALL_ID_CHDIR,      536   return _sos_syscall2(SOS_SYSCALL_ID_CHDIR,
557                        (unsigned int)dirname,     537                        (unsigned int)dirname,
558                        strlen(dirname));          538                        strlen(dirname));
559 }                                                 539 }
560                                                   540 
561                                                   541 
562 int _sos_fchdir(int fd)                           542 int _sos_fchdir(int fd)
563 {                                                 543 {
564   return _sos_syscall1(SOS_SYSCALL_ID_FCHDIR,     544   return _sos_syscall1(SOS_SYSCALL_ID_FCHDIR,
565                        (unsigned int)fd);         545                        (unsigned int)fd);
566 }                                                 546 }
                                                      

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