/** ** @file ulibc.c ** ** @author CSCI-452 class of 20245 ** ** @brief C implementations of user-level library functions */ #include /* ** PRIVATE DEFINITIONS */ /* ** PRIVATE DATA TYPES */ /* ** PRIVATE GLOBAL VARIABLES */ /* ** PUBLIC GLOBAL VARIABLES */ /* ** PRIVATE FUNCTIONS */ /* ** PUBLIC FUNCTIONS */ /* ********************************************** ** CONVENIENT "SHORTHAND" VERSIONS OF SYSCALLS ********************************************** */ /** ** wait - wait for any child to exit ** ** usage: pid = wait(&status) ** ** Calls waitpid(0,status) ** ** @param status Pointer to int32_t into which the child's status is placed, ** or NULL ** ** @returns The PID of the terminated child, or an error code */ int wait( int32_t *status ) { return( waitpid(0,status) ); } /** ** spawn - create a new process running a different program ** ** usage: pid = spawn(what,args); ** ** Creates a new process and then execs 'what' ** ** @param what The program table index of the program to spawn ** @param args The command-line argument vector for the new process ** ** @returns PID of the new process, or an error code */ int32_t spawn( uint_t what, char **args ) { int32_t pid; char buf[256]; pid = fork(); if( pid != 0 ) { // failure, or we are the parent return( pid ); } // we are the child pid = getpid(); // child inherits parent's priority level exec( what, args ); // uh-oh.... sprint( buf, "Child %d exec() #%u failed\n", pid, what ); cwrites( buf ); exit( EXIT_FAILURE ); return( 0 ); // shut the compiler up } /** ** cwritech(ch) - write a single character to the console ** ** @param ch The character to write ** ** @returns The return value from calling write() */ int cwritech( char ch ) { return( write(CHAN_CIO,&ch,1) ); } /** ** cwrites(str) - write a NUL-terminated string to the console ** ** @param str The string to write ** */ int cwrites( const char *str ) { int len = strlen(str); return( write(CHAN_CIO,str,len) ); } /** ** cwrite(buf,size) - write a sized buffer to the console ** ** @param buf The buffer to write ** @param size The number of bytes to write ** ** @returns The return value from calling write() */ int cwrite( const char *buf, uint32_t size ) { return( write(CHAN_CIO,buf,size) ); } /** ** swritech(ch) - write a single character to the SIO ** ** @param ch The character to write ** ** @returns The return value from calling write() */ int swritech( char ch ) { return( write(CHAN_SIO,&ch,1) ); } /** ** swrites(str) - write a NUL-terminated string to the SIO ** ** @param str The string to write ** ** @returns The return value from calling write() */ int swrites( const char *str ) { int len = strlen(str); return( write(CHAN_SIO,str,len) ); } /** ** swrite(buf,size) - write a sized buffer to the SIO ** ** @param buf The buffer to write ** @param size The number of bytes to write ** ** @returns The return value from calling write() */ int swrite( const char *buf, uint32_t size ) { return( write(CHAN_SIO,buf,size) ); }