forked from Imagelibrary/rtems
With this in place, it is possible to fdopen a TCP stream socket and getc/fprintf/etc. on the STDIO stream!
120 lines
2.3 KiB
C
120 lines
2.3 KiB
C
/*
|
|
* RTEMS Fake System Calls
|
|
*
|
|
* This file contains "fake" versions of the system call routines
|
|
* which are reference by many libc implementations. Once a routine
|
|
* has been implemented in terms of RTEMS services, it should be
|
|
* taken out of this file.
|
|
*
|
|
* COPYRIGHT (c) 1989-1997.
|
|
* On-Line Applications Research Corporation (OAR).
|
|
* Copyright assigned to U.S. Government, 1994.
|
|
*
|
|
* The license and distribution terms for this file may be
|
|
* found in the file LICENSE in this distribution or at
|
|
* http://www.OARcorp.com/rtems/license.html.
|
|
*
|
|
* $Id$
|
|
*
|
|
*/
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <assert.h>
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
#include <stdio.h> /* only for puts */
|
|
|
|
#include <rtems.h>
|
|
#include <rtems/libio.h>
|
|
|
|
#ifdef RTEMS_NEWLIB
|
|
/*
|
|
* fstat, stat, and isatty must lie consistently and report that everything
|
|
* is a tty or stdout will not be line buffered.
|
|
*/
|
|
|
|
int __rtems_fstat(int _fd, struct stat* _sbuf)
|
|
{
|
|
#ifdef HAVE_BLKSIZE
|
|
_sbuf->st_blksize = 0;
|
|
#endif
|
|
|
|
/*
|
|
* For now assume stdin/stdout/stderr are always a TTY line
|
|
*/
|
|
if (_fd <= 2) {
|
|
_sbuf->st_mode = S_IFCHR;
|
|
} else {
|
|
switch (rtems_file_descriptor_type (_fd)) {
|
|
case RTEMS_FILE_DESCRIPTOR_TYPE_SOCKET:
|
|
_sbuf->st_mode = S_IFSOCK;
|
|
break;
|
|
|
|
default:
|
|
puts( "__rtems_fstat -- unknown socket type" );
|
|
assert( 0 );
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int __rtems_isatty(int _fd)
|
|
{
|
|
struct stat st;
|
|
|
|
if (__rtems_fstat(_fd, &st) < 0)
|
|
return 0;
|
|
return S_ISCHR (st.st_mode);
|
|
}
|
|
|
|
#if !defined(RTEMS_UNIX)
|
|
int stat( const char *path, struct stat *buf )
|
|
{
|
|
if ( strncmp( "/dev/", path, 5 ) ) {
|
|
return -1;
|
|
}
|
|
return __rtems_fstat( 0, buf );
|
|
}
|
|
|
|
int link( const char *existing, const char *new )
|
|
{
|
|
/* always fail */
|
|
return -1;
|
|
}
|
|
|
|
int unlink( const char *path )
|
|
{
|
|
/* always fail */
|
|
return -1;
|
|
}
|
|
|
|
char *getcwd( char *_buf, size_t _size)
|
|
{
|
|
|
|
/* assert( FALSE ); */
|
|
errno = ENOSYS;
|
|
return 0;
|
|
}
|
|
int fork() {
|
|
puts( "fork -- not supported!!!" );
|
|
assert( 0 );
|
|
errno = ENOSYS;
|
|
return -1;
|
|
}
|
|
int execv(const char *_path, char * const _argv[] ) {
|
|
puts( "execv -- not supported!!!" );
|
|
assert( 0 );
|
|
errno = ENOSYS;
|
|
return -1;
|
|
}
|
|
int wait() {
|
|
puts( "wait -- not supported!!!" );
|
|
assert( 0 );
|
|
errno = ENOSYS;
|
|
return -1;
|
|
}
|
|
#endif
|
|
|
|
#endif
|