📄 sol-cfuncs.c
字号:
/* * 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 16struct 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 19typedef 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 voidtrace (msg) const char *msg;{ const char *p; for (p = msg; *p != '\0'; p++) ; (void) write (2, msg, p-msg);}static voidtrace1 (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 */intisatty (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 voidsolaris_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;}intstat (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;}intlstat (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;}intfstat (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 */intgetrusage (){ _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;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -