1@c -*- Texinfo -*- 2@node Syscalls 3@chapter System Calls 4 5@cindex linking the C library 6The C subroutine library depends on a handful of subroutine calls for 7operating system services. If you use the C library on a system that 8complies with the POSIX.1 standard (also known as IEEE 1003.1), most of 9these subroutines are supplied with your operating system. 10 11If some of these subroutines are not provided with your system---in 12the extreme case, if you are developing software for a ``bare board'' 13system, without an OS---you will at least need to provide do-nothing 14stubs (or subroutines with minimal functionality) to allow your 15programs to link with the subroutines in @code{libc.a}. 16 17@menu 18* Stubs:: Definitions for OS interface 19* Reentrant Syscalls:: Reentrant covers for OS subroutines 20@end menu 21 22@node Stubs 23@section Definitions for OS interface 24@cindex stubs 25 26@cindex subroutines for OS interface 27@cindex OS interface subroutines 28This is the complete set of system definitions (primarily subroutines) 29required; the examples shown implement the minimal functionality 30required to allow @code{libc} to link, and fail gracefully where OS 31services are not available. 32 33Graceful failure is permitted by returning an error code. A minor 34complication arises here: the C library must be compatible with 35development environments that supply fully functional versions of these 36subroutines. Such environments usually return error codes in a global 37@code{errno}. However, the Red Hat newlib C library provides a @emph{macro} 38definition for @code{errno} in the header file @file{errno.h}, as part 39of its support for reentrant routines (@pxref{Reentrancy,,Reentrancy}). 40 41@cindex @code{errno} global vs macro 42The bridge between these two interpretations of @code{errno} is 43straightforward: the C library routines with OS interface calls 44capture the @code{errno} values returned globally, and record them in 45the appropriate field of the reentrancy structure (so that you can query 46them using the @code{errno} macro from @file{errno.h}). 47 48This mechanism becomes visible when you write stub routines for OS 49interfaces. You must include @file{errno.h}, then disable the macro, 50like this: 51 52@example 53#include <errno.h> 54#undef errno 55extern int errno; 56@end example 57 58@noindent 59The examples in this chapter include this treatment of @code{errno}. 60 61@ftable @code 62@item _exit 63Exit a program without cleaning up files. If your system doesn't 64provide this, it is best to avoid linking with subroutines that require 65it (@code{exit}, @code{system}). 66 67@item close 68Close a file. Minimal implementation: 69 70@example 71int close(int file) @{ 72 return -1; 73@} 74@end example 75 76@item environ 77A pointer to a list of environment variables and their values. For a 78minimal environment, this empty list is adequate: 79 80@example 81char *__env[1] = @{ 0 @}; 82char **environ = __env; 83@end example 84 85@item execve 86Transfer control to a new process. Minimal implementation (for a system 87without processes): 88 89@example 90#include <errno.h> 91#undef errno 92extern int errno; 93int execve(char *name, char **argv, char **env) @{ 94 errno = ENOMEM; 95 return -1; 96@} 97@end example 98 99@item fork 100Create a new process. Minimal implementation (for a system without processes): 101 102@example 103#include <errno.h> 104#undef errno 105extern int errno; 106int fork(void) @{ 107 errno = EAGAIN; 108 return -1; 109@} 110@end example 111 112@item fstat 113Status of an open file. For consistency with other minimal 114implementations in these examples, all files are regarded as character 115special devices. The @file{sys/stat.h} header file required is 116distributed in the @file{include} subdirectory for this C library. 117 118@example 119#include <sys/stat.h> 120int fstat(int file, struct stat *st) @{ 121 st->st_mode = S_IFCHR; 122 return 0; 123@} 124@end example 125 126@item getpid 127Process-ID; this is sometimes used to generate strings unlikely to 128conflict with other processes. Minimal implementation, for a system 129without processes: 130 131@example 132int getpid(void) @{ 133 return 1; 134@} 135@end example 136 137@item isatty 138Query whether output stream is a terminal. For consistency with the 139other minimal implementations, which only support output to 140@code{stdout}, this minimal implementation is suggested: 141 142@example 143int isatty(int file) @{ 144 return 1; 145@} 146@end example 147 148@item kill 149Send a signal. Minimal implementation: 150 151@example 152#include <errno.h> 153#undef errno 154extern int errno; 155int kill(int pid, int sig) @{ 156 errno = EINVAL; 157 return -1; 158@} 159@end example 160 161@item link 162Establish a new name for an existing file. Minimal implementation: 163 164@example 165#include <errno.h> 166#undef errno 167extern int errno; 168int link(char *old, char *new) @{ 169 errno = EMLINK; 170 return -1; 171@} 172@end example 173 174@item lseek 175Set position in a file. Minimal implementation: 176 177@example 178int lseek(int file, int ptr, int dir) @{ 179 return 0; 180@} 181@end example 182 183@item open 184Open a file. Minimal implementation: 185 186@example 187int open(const char *name, int flags, int mode) @{ 188 return -1; 189@} 190@end example 191 192@item read 193Read from a file. Minimal implementation: 194 195@example 196int read(int file, char *ptr, int len) @{ 197 return 0; 198@} 199@end example 200 201@item sbrk 202Increase program data space. As @code{malloc} and related functions 203depend on this, it is useful to have a working implementation. The 204following suffices for a standalone system; it exploits the symbol 205@code{_end} automatically defined by the GNU linker. 206 207@example 208@group 209caddr_t sbrk(int incr) @{ 210 extern char _end; /* @r{Defined by the linker} */ 211 static char *heap_end; 212 char *prev_heap_end; 213 214 if (heap_end == 0) @{ 215 heap_end = &_end; 216 @} 217 prev_heap_end = heap_end; 218 if (heap_end + incr > stack_ptr) @{ 219 write (1, "Heap and stack collision\n", 25); 220 abort (); 221 @} 222 223 heap_end += incr; 224 return (caddr_t) prev_heap_end; 225@} 226@end group 227@end example 228 229@item stat 230Status of a file (by name). Minimal implementation: 231 232@example 233int stat(char *file, struct stat *st) @{ 234 st->st_mode = S_IFCHR; 235 return 0; 236@} 237@end example 238 239@item times 240Timing information for current process. Minimal implementation: 241 242@example 243int times(struct tms *buf) @{ 244 return -1; 245@} 246@end example 247 248@item unlink 249Remove a file's directory entry. Minimal implementation: 250 251@example 252#include <errno.h> 253#undef errno 254extern int errno; 255int unlink(char *name) @{ 256 errno = ENOENT; 257 return -1; 258@} 259@end example 260 261@item wait 262Wait for a child process. Minimal implementation: 263@example 264#include <errno.h> 265#undef errno 266extern int errno; 267int wait(int *status) @{ 268 errno = ECHILD; 269 return -1; 270@} 271@end example 272 273@item write 274Write to a file. @file{libc} subroutines will use this 275system routine for output to all files, @emph{including} 276@code{stdout}---so if you need to generate any output, for example to a 277serial port for debugging, you should make your minimal @code{write} 278capable of doing this. The following minimal implementation is an 279incomplete example; it relies on a @code{outbyte} subroutine (not 280shown; typically, you must write this in assembler from examples 281provided by your hardware manufacturer) to actually perform the output. 282 283@example 284@group 285int write(int file, char *ptr, int len) @{ 286 int todo; 287 288 for (todo = 0; todo < len; todo++) @{ 289 outbyte (*ptr++); 290 @} 291 return len; 292@} 293@end group 294@end example 295 296@end ftable 297 298@page 299@node Reentrant Syscalls 300@section Reentrant covers for OS subroutines 301 302Since the system subroutines are used by other library routines that 303require reentrancy, @file{libc.a} provides cover routines (for example, 304the reentrant version of @code{fork} is @code{_fork_r}). These cover 305routines are consistent with the other reentrant subroutines in this 306library, and achieve reentrancy by using a reserved global data block 307(@pxref{Reentrancy,,Reentrancy}). 308 309@menu 310* _close_r:: Reentrant version of close 311* _execve_r:: Reentrant version of execve 312* _fork_r:: Reentrant version of fork 313@ifset STDIO64 314* _fstat64_r:: Reentrant version of fstat64 315@end ifset 316* _fstat_r:: Reentrant version of fstat 317* _getpid_r:: Reentrant version of getpid 318* _kill_r:: Reentrant version of kill 319* _link_r:: Reentrant version of link 320@ifset STDIO64 321* _lseek64_r:: Reentrant version of lseek64 322@end ifset 323* _lseek_r:: Reentrant version of lseek 324@ifset STDIO64 325* _open64_r:: Reentrant version of open64 326@end ifset 327* _open_r:: Reentrant version of open 328* _read_r:: Reentrant version of read 329* _sbrk_r:: Reentrant version of sbrk 330@ifset STDIO64 331* _stat64_r:: Reentrant version of stat64 332@end ifset 333* _stat_r:: Reentrant version of stat 334* _times_r:: Reentrant version of times 335* _unlink_r:: Reentrant version of unlink 336* _wait_r:: Reentrant version of wait 337* _write_r:: Reentrant version of write 338@end menu 339 340@lowersections 341@page 342@include reent/closer.def 343 344@page 345@include reent/execr.def 346 347@ifset STDIO64 348@page 349@include reent/fstat64r.def 350@end ifset 351 352@page 353@include reent/fstatr.def 354 355@page 356@include reent/linkr.def 357 358@ifset STDIO64 359@page 360@include reent/lseek64r.def 361@end ifset 362 363@page 364@include reent/lseekr.def 365 366@ifset STDIO64 367@page 368@include reent/open64r.def 369@end ifset 370 371@page 372@include reent/openr.def 373 374@page 375@include reent/readr.def 376 377@page 378@include reent/sbrkr.def 379 380@page 381@include reent/signalr.def 382 383@ifset STDIO64 384@page 385@include reent/stat64r.def 386@end ifset 387 388@page 389@include reent/statr.def 390 391@page 392@include reent/timesr.def 393 394@page 395@include reent/unlinkr.def 396 397@page 398@include reent/writer.def 399@raisesections 400