Beispiel #1
0
/*********************************************************************************************************
** 函数名称: __ram_close
** 功能描述: ramfs 关闭一个文件
** 输 入  : pramn            文件节点
**           iFlag            打开文件时的方法
** 输 出  : NONE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
VOID  __ram_close (PRAM_NODE  pramn, INT  iFlag)
{
    pramn->RAMN_timeAccess = lib_time(LW_NULL);

    if (pramn->RAMN_bChanged && ((iFlag & O_ACCMODE) != O_RDONLY)) {
        pramn->RAMN_timeChange = pramn->RAMN_timeAccess;
    }
}
Beispiel #2
0
/*********************************************************************************************************
** 函数名称: API_TimeShow
** 功能描述: 打印操作系统时间信息
** 输 入  : NONE
** 输 出  : NONE
** 全局变量: 
** 调用模块: 
                                           API 函数
                                           
                                       (不得在中断中调用)
*********************************************************************************************************/
LW_API  
VOID   API_TimeShow (VOID)
{
    printf("time show >>\n\n");
    printf("Kernel Ticks: %-63llu\n", API_TimeGet64());
    
#if LW_CFG_RTC_EN > 0
    {
        CHAR    cTimeBuffer[32];
        time_t  time = lib_time(LW_NULL);
        
        printf("%s", lib_ctime_r(&time, cTimeBuffer));
    }
#else
    printf("\n");
#endif                                                                  /*  LW_CFG_RTC_EN > 0           */
}
Beispiel #3
0
/*********************************************************************************************************
** 函数名称: uuidgen
** 功能描述: 获得 uuid
** 输 入  : uuidArray     保存数组
**           iCnt          产生的数量
** 输 出  : 是否成功
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
INT  uuidgen (uuid_t *uuidArray, INT  iCnt)
{
    time_t  timeNow;
    clock_t clock;

    if (!uuidArray || (iCnt < 1) || (iCnt > 2048)) {
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }
    
    timeNow = lib_time(LW_NULL);
    clock   = lib_clock();
    
    for (; iCnt > 0; iCnt--) {
        __uuidGen(timeNow, clock, uuidArray);
        uuidArray++;
    }
    
    return  (ERROR_NONE);
}
Beispiel #4
0
/*********************************************************************************************************
** 函数名称: API_RomFsDevCreate
** 功能描述: 创建 romfs 文件系统设备.
** 输 入  : pcName            设备名(设备挂接的节点地址)
**           pblkd             romfs 物理设备.
** 输 出  : < 0 表示失败
** 全局变量:
** 调用模块:
                                           API 函数
*********************************************************************************************************/
LW_API
INT  API_RomFsDevCreate (PCHAR   pcName, PLW_BLK_DEV  pblkd)
{
    PROM_VOLUME     promfs;

    if (_G_iRomfsDrvNum <= 0) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "romfs Driver invalidate.\r\n");
        _ErrorHandle(ERROR_IO_NO_DRIVER);
        return  (PX_ERROR);
    }
    if ((pblkd == LW_NULL) || (pblkd->BLKD_pcName == LW_NULL)) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "block device invalidate.\r\n");
        _ErrorHandle(ERROR_IOS_DEVICE_NOT_FOUND);
        return  (PX_ERROR);
    }
    if ((pcName == LW_NULL) || __STR_IS_ROOT(pcName)) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "mount name invalidate.\r\n");
        _ErrorHandle(EFAULT);                                           /*  Bad address                 */
        return  (PX_ERROR);
    }
    
    promfs = (PROM_VOLUME)__SHEAP_ALLOC(sizeof(ROM_VOLUME));
    if (promfs == LW_NULL) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return  (PX_ERROR);
    }
    lib_bzero(promfs, sizeof(ROM_VOLUME));                              /*  清空卷控制块                */
    
    promfs->ROMFS_bValid = LW_TRUE;
    
    promfs->ROMFS_hVolLock = API_SemaphoreMCreate("romvol_lock", LW_PRIO_DEF_CEILING,
                                             LW_OPTION_WAIT_FIFO | LW_OPTION_DELETE_SAFE | 
                                             LW_OPTION_INHERIT_PRIORITY | LW_OPTION_OBJECT_GLOBAL,
                                             LW_NULL);
    if (!promfs->ROMFS_hVolLock) {                                      /*  无法创建卷锁                */
        __SHEAP_FREE(promfs);
        return  (PX_ERROR);
    }
    promfs->ROMFS_pblkd = pblkd;                                        /*  记录物理设备                */
    
    promfs->ROMFS_ulSectorSize = pblkd->BLKD_ulBytesPerSector;
    if (promfs->ROMFS_ulSectorSize == 0) {
        if (pblkd->BLKD_pfuncBlkIoctl(pblkd, 
                                      LW_BLKD_GET_SECSIZE, 
                                      &promfs->ROMFS_ulSectorSize) < ERROR_NONE) {
            API_SemaphoreMDelete(&promfs->ROMFS_hVolLock);
            __SHEAP_FREE(promfs);
            return  (PX_ERROR);
        }
    }
    
    promfs->ROMFS_ulSectorNum = pblkd->BLKD_ulNSector;
    if (promfs->ROMFS_ulSectorNum == 0) {
        if (pblkd->BLKD_pfuncBlkIoctl(pblkd, 
                                      LW_BLKD_GET_SECNUM, 
                                      &promfs->ROMFS_ulSectorNum) < ERROR_NONE) {
            API_SemaphoreMDelete(&promfs->ROMFS_hVolLock);
            __SHEAP_FREE(promfs);
            return  (PX_ERROR);
        }
    }
    
    promfs->ROMFS_pcSector = (PCHAR)__SHEAP_ALLOC((size_t)promfs->ROMFS_ulSectorSize);
    if (promfs->ROMFS_pcSector == LW_NULL) {
        API_SemaphoreMDelete(&promfs->ROMFS_hVolLock);
        __SHEAP_FREE(promfs);
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return  (PX_ERROR);
    }
    
    promfs->ROMFS_ulCurSector = (ULONG)-1;                              /*  当前窗口无效                */
    
    if (__rfs_mount(promfs)) {
        API_SemaphoreMDelete(&promfs->ROMFS_hVolLock);
        __SHEAP_FREE(promfs->ROMFS_pcSector);
        __SHEAP_FREE(promfs);
        _DebugHandle(__ERRORMESSAGE_LEVEL, "format unknown.\r\n");
        _ErrorHandle(ERROR_IO_VOLUME_ERROR);
        return  (PX_ERROR);
    }
    
    promfs->ROMFS_uid = getuid();
    promfs->ROMFS_gid = getgid();
    
    lib_time(&promfs->ROMFS_time);                                      /*  获得当前时间                */
    
    if (iosDevAddEx(&promfs->ROMFS_devhdrHdr, pcName, _G_iRomfsDrvNum, DT_DIR)
        != ERROR_NONE) {                                                /*  安装文件系统设备            */
        API_SemaphoreMDelete(&promfs->ROMFS_hVolLock);
        __SHEAP_FREE(promfs->ROMFS_pcSector);
        __SHEAP_FREE(promfs);
        return  (PX_ERROR);
    }
    
    __fsDiskLinkCounterAdd(pblkd);                                      /*  增加块设备链接              */

    _DebugFormat(__LOGMESSAGE_LEVEL, "target \"%s\" mount ok.\r\n", pcName);

    return  (ERROR_NONE);
}
Beispiel #5
0
/*********************************************************************************************************
** 函数名称: __ram_maken
** 功能描述: ramfs 创建一个文件
** 输 入  : pramfs           文件系统
**           pcName           文件名
**           pramnFather      父亲, NULL 表示根目录
**           mode             mode_t
**           pcLink           如果为连接文件, 这里指明连接目标.
** 输 出  : 创建结果
** 全局变量:
** 调用模块:
*********************************************************************************************************/
PRAM_NODE  __ram_maken (PRAM_VOLUME  pramfs,
                        CPCHAR       pcName,
                        PRAM_NODE    pramnFather,
                        mode_t       mode,
                        CPCHAR       pcLink)
{
    PRAM_NODE   pramn = (PRAM_NODE)__SHEAP_ALLOC(sizeof(RAM_NODE));
    CPCHAR      pcFileName;
    
    if (pramn == LW_NULL) {
        _ErrorHandle(ENOMEM);
        return  (LW_NULL);
    }
    lib_bzero(pramn, sizeof(RAM_NODE));
    
    pcFileName = lib_rindex(pcName, PX_DIVIDER);
    if (pcFileName) {
        pcFileName++;
    } else {
        pcFileName = pcName;
    }
    
    pramn->RAMN_pcName = (PCHAR)__SHEAP_ALLOC(lib_strlen(pcFileName) + 1);
    if (pramn->RAMN_pcName == LW_NULL) {
        __SHEAP_FREE(pramn);
        _ErrorHandle(ENOMEM);
        return  (LW_NULL);
    }
    lib_strcpy(pramn->RAMN_pcName, pcFileName);
    
    if (S_ISLNK(mode)) {
        pramn->RAMN_pcLink = (PCHAR)__SHEAP_ALLOC(lib_strlen(pcLink) + 1);
        if (pramn->RAMN_pcLink == LW_NULL) {
            __SHEAP_FREE(pramn->RAMN_pcName);
            __SHEAP_FREE(pramn);
            _ErrorHandle(ENOMEM);
            return  (LW_NULL);
        }
        lib_strcpy(pramn->RAMN_pcLink, pcLink);
        
    } else {
        if ((mode & S_IFMT) == 0) {
            mode |= S_IFREG;
        }
        pramn->RAMN_pcLink = LW_NULL;
    }
    
    pramn->RAMN_pramnFather = pramnFather;
    pramn->RAMN_pramfs      = pramfs;
    pramn->RAMN_mode        = mode;
    pramn->RAMN_timeCreate  = lib_time(LW_NULL);
    pramn->RAMN_timeAccess  = pramn->RAMN_timeCreate;
    pramn->RAMN_timeChange  = pramn->RAMN_timeCreate;
    pramn->RAMN_uid         = getuid();
    pramn->RAMN_gid         = getgid();
    pramn->RAMN_prambCookie = LW_NULL;
    
    if (pramnFather) {
        _List_Line_Add_Ahead(&pramn->RAMN_lineBrother, 
                             &pramnFather->RAMN_plineSon);
    } else {
        _List_Line_Add_Ahead(&pramn->RAMN_lineBrother, 
                             &pramfs->RAMFS_plineSon);
    }
    
    return  (pramn);
}
Beispiel #6
0
/*********************************************************************************************************
** 函数名称: API_PipeDevCreate
** 功能描述: 创建一个管道设备
** 输 入  : 
**           pcName                        管道名称
**           ulNMessages                   管道中消息数量
**           stNBytes                      每一条消息的最大字节数
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API 
INT  API_PipeDevCreate (PCHAR  pcName, 
                        ULONG  ulNMessages, 
                        size_t stNBytes)
{
    REGISTER PLW_PIPE_DEV        p_pipedev;
    
    if (LW_CPU_GET_CUR_NESTING()) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n");
        _ErrorHandle(ERROR_KERNEL_IN_ISR);
        return  (PX_ERROR);
    }
    
    if (_G_iPipeDrvNum <= 0) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "no driver.\r\n");
        _ErrorHandle(ERROR_IO_NO_DRIVER);
        return  (PX_ERROR);
    }
    
    p_pipedev = (PLW_PIPE_DEV)__SHEAP_ALLOC(sizeof(LW_PIPE_DEV));
    if (p_pipedev == LW_NULL) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return  (PX_ERROR);
    }
    lib_bzero(p_pipedev, sizeof(LW_PIPE_DEV));
    
    p_pipedev->PIPEDEV_iAbortFlag = 0;
    p_pipedev->PIPEDEV_ulRTimeout = LW_OPTION_WAIT_INFINITE;             /*  初始化为永久等待           */
    p_pipedev->PIPEDEV_ulWTimeout = LW_OPTION_WAIT_INFINITE;             /*  初始化为永久等待           */
    
    p_pipedev->PIPEDEV_hWriteLock = API_SemaphoreBCreate("pipe_wsync", 
                                                          LW_TRUE,
                                                          _G_ulPipeLockOpt | LW_OPTION_OBJECT_GLOBAL,
                                                          LW_NULL);
    if (!p_pipedev->PIPEDEV_hWriteLock) {
        __SHEAP_FREE((PVOID)p_pipedev);
        return  (PX_ERROR);
    }

    p_pipedev->PIPEDEV_hMsgQueue  = API_MsgQueueCreate("pipe_msg",
                                                       ulNMessages, stNBytes,
                                                       _G_ulPipeLockOpt | LW_OPTION_OBJECT_GLOBAL,
                                                       LW_NULL);
    if (!p_pipedev->PIPEDEV_hMsgQueue) {
        API_SemaphoreBDelete(&p_pipedev->PIPEDEV_hWriteLock);
        __SHEAP_FREE((PVOID)p_pipedev);
        return  (PX_ERROR);
    }
    
    SEL_WAKE_UP_LIST_INIT(&p_pipedev->PIPEDEV_selwulList);
    
    if (iosDevAddEx(&p_pipedev->PIPEDEV_devhdrHdr, pcName, _G_iPipeDrvNum, DT_FIFO) != ERROR_NONE) {
        API_SemaphoreBDelete(&p_pipedev->PIPEDEV_hWriteLock);
        API_MsgQueueDelete(&p_pipedev->PIPEDEV_hMsgQueue);
        SEL_WAKE_UP_LIST_TERM(&p_pipedev->PIPEDEV_selwulList);
        __SHEAP_FREE((PVOID)p_pipedev);
        _DebugHandle(__ERRORMESSAGE_LEVEL, "no driver.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return  (PX_ERROR);
    }
    
    p_pipedev->PIPEDEV_timeCreate = lib_time(LW_NULL);
    
    return  (ERROR_NONE);
}
Beispiel #7
0
/*********************************************************************************************************
** 函数名称: syslog_r
** 功能描述: submits a message to the Syslog facility. It does this by writing to the file (支持不完整)
             LOG_DEFAULT_FILE
** 输 入  : priority      priority
**           data          syslog_data
**           message       message
             ...
** 输 出  : old mask
** 全局变量:
** 调用模块:
                                           API 函数
*********************************************************************************************************/
LW_API
void  syslog_r (int priority, struct syslog_data *data, const char *message, ...)
{
#define __PX_SYSLOG_TIMEFMT   "%s %2d %02d:%02d:%02d"

    CHAR            cBuffer[LOG_DEFAULT_SIZE];
    size_t          stLen;

    time_t          time;
    struct tm       tmBuf;

    va_list         valist;

    if (!data) {
        errno = EINVAL;
        return;
    }

    if (((unsigned)LOG_FAC(priority) >= LOG_NFACILITIES)  ||
            (LOG_MASK(LOG_PRI(priority)) == 0)                ||
            ((priority & ~(LOG_PRIMASK | LOG_FACMASK)) != 0)) {
        return;                                                         /*  不发送                      */
    }

    if ((data->log_file < 0) && (data->log_stat & LOG_ODELAY)) {        /*  是否需要执行一次打开操作    */
        openlog(data->log_tag, data->log_file, 0);
        data->log_file = _G_iSyslogUnix;
    }

    if ((priority & LOG_FACMASK) == 0) {
        priority |= data->log_fac;
    }

    time = lib_time(LW_NULL);
    lib_localtime_r(&time, &tmBuf);                                     /*  RFC3164 is the local time   */

    stLen = bnprintf(cBuffer, sizeof(cBuffer), 0, "<%d>", priority);    /*  打印 priority               */
    stLen = bnprintf(cBuffer, sizeof(cBuffer), stLen,
                     __PX_SYSLOG_TIMEFMT,
                     _G_cMonth[tmBuf.tm_mon],
                     tmBuf.tm_mday,
                     tmBuf.tm_hour,
                     tmBuf.tm_min,
                     tmBuf.tm_sec);                                     /*  打印 时间                   */

    if (data->log_tag) {
        stLen = bnprintf(cBuffer, sizeof(cBuffer), stLen, " %s", data->log_tag);
    }

    if (data->log_stat & LOG_PID) {
        if (sizeof(cBuffer) > stLen) {
            stLen = bnprintf(cBuffer, sizeof(cBuffer), stLen, "[%lx]:",
                             API_ThreadIdSelf());
        }
    }

    if (message) {
        if (sizeof(cBuffer) > stLen) {

#if __STDC__
            va_start(valist, message);
#else
            va_start(valist);
#endif
            stLen = vbnprintf(cBuffer, sizeof(cBuffer), stLen, message, valist);

            va_end(valist);
        }
    }

    if (data->log_file >= 0) {
        sendto(data->log_file, cBuffer, stLen, 0,
               (struct sockaddr *)&_G_sockaddrunLog, _G_sockelenLog);
    }

    if (data->log_stat & LOG_CONS) {
        write(STD_OUT, cBuffer, stLen);
    }

    if (data->log_stat & LOG_PERROR) {
        write(STD_ERR, cBuffer, stLen);
    }
}