misc.cxx

来自「eCos操作系统源码」· CXX 代码 · 共 387 行

CXX
387
字号
//==========================================================================////      misc.cxx////      POSIX misc function implementations////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s):           nickg// Contributors:        nickg// Date:                2000-07-18// Purpose:             POSIX misc function implementation// Description:         This file contains the implementation of miscellaneous POSIX//                      functions that do not belong elsewhere.//              //              ////####DESCRIPTIONEND####////==========================================================================#include <pkgconf/system.h>#include <pkgconf/hal.h>#include <pkgconf/kernel.h>#include <pkgconf/posix.h>#include <cyg/kernel/ktypes.h>         // base kernel types#include <cyg/infra/cyg_trac.h>        // tracing macros#include <cyg/infra/cyg_ass.h>         // assertion macros#include "pprivate.h"                   // POSIX private header#include <unistd.h>#include <sys/utsname.h>                // My header#include <string.h>                     // strcpy#include <limits.h>#include <time.h>#include <cyg/kernel/sched.hxx>#include <cyg/kernel/sched.inl>// -------------------------------------------------------------------------// Supply some suitable values for constants that may not be present// in all configurations.#ifndef MQ_OPEN_MAX#define MQ_OPEN_MAX 0#endif#ifndef MQ_PRIO_MAX#define MQ_PRIO_MAX 0#endif// -------------------------------------------------------------------------#define __string(_x) #_x#define __xstring(_x) __string(_x)// -------------------------------------------------------------------------// uname()__externC int uname( struct utsname *name ){    CYG_REPORT_FUNCTYPE( "returning %d" );    strcpy( name->sysname, "eCos" );    strcpy( name->nodename, "" );       // should use gethostname()    strcpy( name->release, __xstring( CYGNUM_KERNEL_VERSION_MAJOR ) );    strcpy( name->version, __xstring( CYGNUM_KERNEL_VERSION_MINOR ) );    strcpy( name->machine, "" );    CYG_REPORT_RETVAL(0);    return 0;}// -------------------------------------------------------------------------// sysconf()#define SC_CASE( _name, _val ) case _name: return _val__externC long sysconf( int name ){    switch( name )    {        SC_CASE( _SC_AIO_LISTIO_MAX,                    AIO_LISTIO_MAX );        SC_CASE( _SC_AIO_MAX,                           AIO_MAX );        SC_CASE( _SC_AIO_PRIO_DELTA_MAX,                AIO_PRIO_DELTA_MAX );        SC_CASE( _SC_ARG_MAX,                           ARG_MAX );        SC_CASE( _SC_CHILD_MAX,                         CHILD_MAX );        SC_CASE( _SC_DELAYTIMER_MAX,                    DELAYTIMER_MAX );        SC_CASE( _SC_GETGR_R_SIZE_MAX,                  0 );        SC_CASE( _SC_GETPW_R_SIZE_MAX,                  0 );        SC_CASE( _SC_LOGIN_NAME_MAX,                    LOGIN_NAME_MAX );        SC_CASE( _SC_MQ_OPEN_MAX,                       MQ_OPEN_MAX );        SC_CASE( _SC_MQ_PRIO_MAX,                       MQ_PRIO_MAX );        SC_CASE( _SC_NGROUPS_MAX,                       NGROUPS_MAX );        SC_CASE( _SC_OPEN_MAX,                          OPEN_MAX );        SC_CASE( _SC_PAGESIZE,                          PAGESIZE );        SC_CASE( _SC_RTSIG_MAX,                         RTSIG_MAX );        SC_CASE( _SC_SEM_NSEMS_MAX,                     SEM_NSEMS_MAX );        SC_CASE( _SC_SEM_VALUE_MAX,                     SEM_VALUE_MAX );        SC_CASE( _SC_SIGQUEUE_MAX,                      SIGQUEUE_MAX );        SC_CASE( _SC_STREAM_MAX,                        STREAM_MAX );#ifdef CYGPKG_POSIX_PTHREAD        SC_CASE( _SC_THREAD_DESTRUCTOR_ITERATIONS,      PTHREAD_DESTRUCTOR_ITERATIONS );        SC_CASE( _SC_THREAD_KEYS_MAX,                   PTHREAD_KEYS_MAX );        SC_CASE( _SC_THREAD_STACK_MIN,                  PTHREAD_STACK_MIN );        SC_CASE( _SC_THREAD_THREADS_MAX,                PTHREAD_THREADS_MAX );#endif        SC_CASE( _SC_TIMER_MAX,                         TIMER_MAX );        SC_CASE( _SC_TTY_NAME_MAX,                      TTY_NAME_MAX );        SC_CASE( _SC_TZNAME_MAX,                        TZNAME_MAX );        SC_CASE( _SC_VERSION,                           _POSIX_VERSION );#ifdef CYGPKG_POSIX_TIMERS    case _SC_CLK_TCK:    {        struct timespec ts;        ts.tv_sec = 1;        ts.tv_nsec = 0;        cyg_tick_count ticks = cyg_timespec_to_ticks( &ts );        return ticks;    }#endif    case _SC_ASYNCHRONOUS_IO:    #ifdef _POSIX_ASYNCHRONOUS_IO        return 1;    #else        return -1;    #endif                case _SC_FSYNC:    #ifdef _POSIX_FSYNC        return 1;    #else        return -1;    #endif                    case _SC_JOB_CONTROL:    #ifdef _POSIX_JOB_CONTROL        return 1;    #else        return -1;    #endif                        case _SC_MAPPED_FILES:    #ifdef _POSIX_MAPPED_FILES        return 1;    #else        return -1;    #endif                            case _SC_MEMLOCK:    #ifdef _POSIX_MEMLOCK        return 1;    #else        return -1;    #endif                                case _SC_MEMLOCK_RANGE:    #ifdef _POSIX_MEMLOCK_RANGE        return 1;    #else        return -1        ;    #endif                                          case _SC_MEMORY_PROTECTION:    #ifdef _POSIX_MEMORY_PROTECTION        return 1;    #else        return -1;    #endif                case _SC_MESSAGE_PASSING:    #ifdef _POSIX_MESSAGE_PASSING        return 1;    #else        return -1;    #endif                    case _SC_PRIORITIZED_IO:    #ifdef _POSIX_PRIORITIZED_IO        return 1;    #else        return -1;    #endif                        case _SC_PRIORITY_SCHEDULING:    #ifdef _POSIX_PRIORITY_SCHEDULING        return 1;    #else        return -1;    #endif                            case _SC_REALTIME_SIGNALS:    #ifdef _POSIX_REALTIME_SIGNALS        return 1;    #else        return -1;    #endif                                case _SC_SAVED_IDS:    #ifdef _POSIX_SAVED_IDS        return 1;    #else        return -1;    #endif                                    case _SC_SEMAPHORES:    #ifdef _POSIX_SEMAPHORES        return 1;    #else        return -1;    #endif                                        case _SC_SHARED_MEMORY_OBJECTS:    #ifdef _POSIX_SHARED_MEMORY_OBJECTS        return 1;    #else        return -1;    #endif                                            case _SC_SYNCHRONIZED_IO:    #ifdef _POSIX_SYNCHRONIZED_IO        return 1;    #else        return -1;    #endif                                                case _SC_THREADS:    #ifdef _POSIX_THREADS        return 1;    #else        return -1;    #endif                                                    case _SC_THREAD_ATTR_STACKADDR:    #ifdef _POSIX_THREAD_ATTR_STACKADDR        return 1;    #else        return -1;    #endif                                                        case _SC_THREAD_ATTR_STACKSIZE:    #ifdef _POSIX_THREAD_ATTR_STACKSIZE        return 1;    #else        return -1;    #endif                                                            case _SC_THREAD_PRIO_INHERIT:    #ifdef _POSIX_THREAD_PRIO_INHERIT        return 1;    #else        return -1;    #endif                                                                case _SC_THREAD_PRIO_PROTECT:    #ifdef _POSIX_THREAD_PRIO_PROTECT        return 1;    #else        return -1;    #endif                                                                    case _SC_THREAD_PRIORITY_SCHEDULING:    #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING        return 1;    #else        return -1;    #endif                                                                        case _SC_THREAD_PROCESS_SHARED:    #ifdef _POSIX_THREAD_PROCESS_SHARED        return 1;    #else        return -1;    #endif                                                                            case _SC_THREAD_SAFE_FUNCTIONS:    #ifdef _POSIX_THREAD_SAFE_FUNCTIONS        return 1;    #else        return -1;    #endif                                                                                case _SC_TIMERS:    #ifdef _POSIX_TIMERS        return 1;    #else        return -1;    #endif                                                                                    default:        errno = EINVAL;        return -1;    }}//==========================================================================// Some trivial compatibility functions.// These are merely present to permit existing code to be ported a little// more easily, and to provide adequate standards compatibility.__externC pid_t getpid    ( void ) { return 42; }__externC pid_t getppid   ( void ) { return 41; }__externC uid_t getuid    ( void ) { return 666; }__externC uid_t geteuid   ( void ) { return 666; }__externC gid_t getgid    ( void ) { return 88; }__externC gid_t getegid   ( void ) { return 88; }__externC int   setuid    ( uid_t uid ) { errno = EPERM; return -1; }__externC int   setgid    ( uid_t gid ) { errno = EPERM; return -1; }__externC int   getgroups ( int gidsetsize, gid_t grouplist[] ) { return 0; };__externC pid_t getpgrp   ( void ) { return 42; }__externC pid_t setsid    ( void ) { errno = EPERM; return -1; }__externC int   setpgid   ( pid_t pid, pid_t pgid ) { errno = ENOSYS; return -1; }//==========================================================================// Exports to other packages// -------------------------------------------------------------------------// POSIX API function entry__externC void cyg_posix_function_start(){    Cyg_Thread *self = Cyg_Scheduler::get_current_thread();    // Inhibit ASR delivery in this function until it returns.        self->set_asr_inhibit();}// -------------------------------------------------------------------------__externC void cyg_posix_function_finish(){    Cyg_Thread *self = Cyg_Scheduler::get_current_thread();    // Re-allow ASR delivery.        self->clear_asr_inhibit();    // After clearing the inhibit flag, blip the scheduler lock    // to get any pending ASRs delivered.    Cyg_Scheduler::lock();    Cyg_Scheduler::unlock();}// -------------------------------------------------------------------------// EOF misc.cxx

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?