diff options
author | Ranjith Kumaran <ranjith@cygnus.com> | 2000-03-17 22:48:54 +0000 |
---|---|---|
committer | Ranjith Kumaran <ranjith@cygnus.com> | 2000-03-17 22:48:54 +0000 |
commit | 03261851a10dd2d6900a0a00a7515a0a46fb5d76 (patch) | |
tree | 7c22ac6cbbc99fd5cd1b5426853be8d4fd7bfcf1 /libgloss/rs6000/sol-cfuncs.c | |
parent | fae4c299f14fc23e2829c8656992eba21f79242a (diff) | |
download | cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.tar.gz cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.tar.bz2 cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.zip |
20000317 sourceware import
Diffstat (limited to 'libgloss/rs6000/sol-cfuncs.c')
-rw-r--r-- | libgloss/rs6000/sol-cfuncs.c | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/libgloss/rs6000/sol-cfuncs.c b/libgloss/rs6000/sol-cfuncs.c new file mode 100644 index 000000000..982716746 --- /dev/null +++ b/libgloss/rs6000/sol-cfuncs.c @@ -0,0 +1,277 @@ +/* + * solaris-cfuncs.S -- C functions for Solaris. + * + * Copyright (c) 1996 Cygnus Support + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/unistd.h> + +#ifndef __STDC__ +#define const +#endif + +/* Solaris stat packet */ +typedef long solaris_off_t; +typedef long solaris_uid_t; +typedef long solaris_gid_t; +typedef long unsigned solaris_mode_t; +typedef long unsigned solaris_nlink_t; +typedef long unsigned solaris_dev_t; +typedef long unsigned solaris_ino_t; +typedef long solaris_time_t; + +typedef struct { + solaris_time_t tv_sec; + long tv_nsec; +} solaris_timestruc_t; + +#define _ST_FSTYPSZ 16 + +struct solaris_stat { + solaris_dev_t st_dev; + long st_pad1[3]; + solaris_ino_t st_ino; + solaris_mode_t st_mode; + solaris_nlink_t st_nlink; + solaris_uid_t st_uid; + solaris_gid_t st_gid; + solaris_dev_t st_rdev; + long st_pad2[2]; + solaris_off_t st_size; + long st_pad3; + solaris_timestruc_t st_atim; + solaris_timestruc_t st_mtim; + solaris_timestruc_t st_ctim; + long st_blksize; + long st_blocks; + char st_fstype[_ST_FSTYPSZ]; + long st_pad4[8]; +}; + +/* Solaris termios packet */ +#define SOLARIS_NCCS 19 +typedef unsigned long solaris_tcflag_t; +typedef unsigned char solaris_cc_t; +typedef unsigned long solaris_speed_t; + +struct solaris_termios { + solaris_tcflag_t c_iflag; + solaris_tcflag_t c_oflag; + solaris_tcflag_t c_cflag; + solaris_tcflag_t c_lflag; + solaris_cc_t c_cc[SOLARIS_NCCS]; +}; + +#define SOLARIS_TIOC ('T'<<8) +#define SOLARIS_TCGETS (SOLARIS_TIOC|13) + + + +/* Debug support */ +#ifdef DEBUG +#define TRACE(msg) trace (msg) +#define TRACE1(msg,num) trace1 (msg,(unsigned)num) + +static void +trace (msg) + const char *msg; +{ + const char *p; + + for (p = msg; *p != '\0'; p++) + ; + + (void) write (2, msg, p-msg); +} + +static void +trace1 (msg, num) + const char *msg; + unsigned int num; +{ + char buffer[16]; + char *p = &buffer[ sizeof(buffer) ]; + + trace (msg); + *--p = '\0'; + *--p = '\n'; + do { + *--p = '0' + (num % 10); + num /= 10; + } while (num != 0); + trace (p); +} + +#else +#define TRACE(msg) +#define TRACE1(msg,num) +#endif + + +/* Errno support */ + +int errno; + +int * +__errno () +{ + return &errno; +} + +/* syscall handler branches here to set errno. Error codes + that are common between newlib and Solaris are the same. */ + +int +_cerror (e) + int e; +{ + TRACE1("got to _cerror ",e); + errno = e; + return -1; +} + + +/* Sbrk support */ + +extern char _end[]; +static char *curbrk = _end; + +void * +sbrk (incr) + size_t incr; +{ + char *oldbrk = curbrk; + TRACE("got to sbrk\n"); + curbrk += incr; + if (brk (curbrk) == -1) + return (char *) -1; + + return (void *)oldbrk; +} + + +/* Isatty support */ + +int +isatty (fd) + int fd; +{ + struct solaris_termios t; + int ret; + + ret = (ioctl (fd, SOLARIS_TCGETS, &t) == 0); + + TRACE1("got to isatty, returned ", ret); + return ret; +} + + +/* Convert Solaris {,f}stat to newlib. + Fortunately, the st_mode bits are the same. */ + +static void +solaris_to_newlib_stat (solaris, newlib) + struct solaris_stat *solaris; + struct stat *newlib; +{ + static struct stat zero_stat; + + *newlib = zero_stat; + newlib->st_dev = solaris->st_dev; + newlib->st_ino = solaris->st_ino; + newlib->st_mode = solaris->st_mode; + newlib->st_nlink = solaris->st_nlink; + newlib->st_uid = solaris->st_uid; + newlib->st_gid = solaris->st_gid; + newlib->st_rdev = solaris->st_rdev; + newlib->st_size = solaris->st_size; + newlib->st_blksize = solaris->st_blksize; + newlib->st_blocks = solaris->st_blocks; + newlib->st_atime = solaris->st_atim.tv_sec; + newlib->st_mtime = solaris->st_mtim.tv_sec; + newlib->st_ctime = solaris->st_ctim.tv_sec; +} + +int +stat (file, newlib_stat) + const char *file; + struct stat *newlib_stat; +{ + int ret; + struct solaris_stat st; + + TRACE("got to stat\n"); + ret = _stat (file, &st); + if (ret >= 0) + solaris_to_newlib_stat (&st, newlib_stat); + + return ret; +} + +int +lstat (file, newlib_stat) + const char *file; + struct stat *newlib_stat; +{ + int ret; + struct solaris_stat st; + + TRACE("got to lstat\n"); + ret = _lstat (file, &st); + if (ret >= 0) + solaris_to_newlib_stat (&st, newlib_stat); + + return ret; +} + +int +fstat (fd, newlib_stat) + int fd; + struct stat *newlib_stat; +{ + int ret; + struct solaris_stat st; + + TRACE("got to fstat\n"); + ret = _fstat (fd, &st); + if (ret >= 0) + solaris_to_newlib_stat (&st, newlib_stat); + + return ret; +} + + +/* Nops */ + +int +getrusage () +{ + _cerror (EINVAL); + return -1; +} + +char * +getcwd(buf, size) + char *buf; + size_t size; +{ + if (!buf || size < 2) + return "."; + + buf[0] = '.'; + buf[1] = '\0'; + return buf; +} |