Пример #1
0
/*********************************************************************************************************
** 函数名称: ls1xWatchDogDevAdd
** 功能描述: 创建 WATCH_DOG 设备
** 输 入  : pcName   设备名
** 输 出  : ERROR_CODE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
INT  ls1xWatchDogDevAdd (CPCHAR  cpcName)
{
    PLS1X_WDT_DEV   pwdt;

    pwdt = (PLS1X_WDT_DEV)__SHEAP_ALLOC(sizeof(LS1X_WDT_DEV));
    if (!pwdt) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return    (PX_ERROR);
    }

    lib_memset(pwdt, 0, sizeof(LS1X_WDT_DEV));

    pwdt->WDT_ulPhyAddrBase = BSP_CFG_WDT_BASE;
    pwdt->WDT_time          = time(LW_NULL);

    if (API_IosDevAddEx(&pwdt->WDT_devhdr, cpcName, _G_ils1xWDTDrvNum, DT_CHR) != ERROR_NONE) {
        __SHEAP_FREE(pwdt);
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return    (PX_ERROR);
    }

    _ErrorHandle(ERROR_NONE);
    return    (ERROR_NONE);
}
Пример #2
0
/*********************************************************************************************************
** 函数名称: __aioCreateFd
** 功能描述: 创建一个 AIO_REQ_CHAIN 节点, 并加入指定链表 (这里必须锁定 _G_aioqueue)
** 输 入  : pplineHeader      创建后加入的链表表头地址
**           iFd               文件描述符
** 输 出  : 创建出的 aio req chain 节点
** 全局变量: 
** 调用模块: 
** 注  意  : 创建出的 AIO_REQ_CHAIN 节点, 一定是由代理线程 delete 的. 
*********************************************************************************************************/
static AIO_REQ_CHAIN  *__aioCreateFd (LW_LIST_LINE_HEADER  *pplineHeader, int  iFd)
{
    AIO_REQ_CHAIN  *paiorc;
    
    paiorc = (AIO_REQ_CHAIN *)__SHEAP_ALLOC(sizeof(AIO_REQ_CHAIN));
    if (paiorc == LW_NULL) {
        return  (LW_NULL);
    }
    
    paiorc->aiorc_mutex = API_SemaphoreMCreate("aiorc_mutex", LW_PRIO_DEF_CEILING, 
                                LW_OPTION_DELETE_SAFE | LW_OPTION_INHERIT_PRIORITY, LW_NULL);
    if (paiorc->aiorc_mutex == 0) {
        __SHEAP_FREE(paiorc);
        return  (LW_NULL);
    }
    
    if (API_ThreadCondInit(&paiorc->aiorc_cond, LW_THREAD_PROCESS_SHARED) != ERROR_NONE) {
        API_SemaphoreMDelete(&paiorc->aiorc_mutex);
        __SHEAP_FREE(paiorc);
        return  (LW_NULL);
    }
    
    paiorc->aiorc_plineaiocb = LW_NULL;
    paiorc->aiorc_fildes     = iFd;
    paiorc->aiorc_iscancel   = 0;                                       /*  没有被 cancel               */
    
    _List_Line_Add_Ahead(&paiorc->aiorc_line, pplineHeader);
    
    return  (paiorc);
}
Пример #3
0
/*********************************************************************************************************
** 函数名称: __ram_move
** 功能描述: ramfs 移动或者重命名一个文件
** 输 入  : pramn            文件节点
**           pcNewName        新的名字
** 输 出  : ERROR
** 全局变量:
** 调用模块:
*********************************************************************************************************/
INT  __ram_move (PRAM_NODE  pramn, PCHAR  pcNewName)
{
    PRAM_VOLUME pramfs;
    PRAM_NODE   pramnTemp;
    PRAM_NODE   pramnFather;
    PRAM_NODE   pramnNewFather;
    BOOL        bRoot;
    BOOL        bLast;
    PCHAR       pcTail;
    PCHAR       pcTemp;
    PCHAR       pcFileName;
    
    pramfs      = pramn->RAMN_pramfs;
    pramnFather = pramn->RAMN_pramnFather;
    
    pramnTemp = __ram_open(pramfs, pcNewName, &pramnNewFather, &bRoot, &bLast, &pcTail);
    if (pramnTemp) {
        _ErrorHandle(EEXIST);
        return  (PX_ERROR);
    }
    if (bRoot || (bLast == LW_FALSE)) {                                 /*  新名字指向根或者没有目录    */
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }
    
    if (pramnFather != pramnNewFather) {                                /*  目录发生改变                */
        if (pramnFather) {
            _List_Line_Del(&pramn->RAMN_lineBrother, 
                           &pramnFather->RAMN_plineSon);
        } else {
            _List_Line_Del(&pramn->RAMN_lineBrother, 
                           &pramfs->RAMFS_plineSon);
        }
        if (pramnNewFather) {
            _List_Line_Add_Ahead(&pramn->RAMN_lineBrother, 
                                 &pramnNewFather->RAMN_plineSon);
        } else {
            _List_Line_Add_Ahead(&pramn->RAMN_lineBrother, 
                                 &pramfs->RAMFS_plineSon);
        }
    }
    
    pcFileName = lib_rindex(pcNewName, PX_DIVIDER);
    if (pcFileName) {
        pcFileName++;
    } else {
        pcFileName = pcNewName;
    }
    
    pcTemp = (PCHAR)__SHEAP_ALLOC(lib_strlen(pcFileName) + 1);
    if (pcTemp == LW_NULL) {
        _ErrorHandle(ENOMEM);
        return  (PX_ERROR);
    }
    lib_strcpy(pcTemp, pcFileName);
    __SHEAP_FREE(pramn->RAMN_pcName);
    pramn->RAMN_pcName = pcTemp;
    
    return  (ERROR_NONE);
}
Пример #4
0
/*********************************************************************************************************
** 函数名称: ls1xLedDevCreate
** 功能描述: 创建 LED 设备
** 输 入  : NONE
**           pcName   设备名
**           uiGpio   GPIO Num
**           bIsOutPutHigh 初始电平
** 输 出  : 错误号
*********************************************************************************************************/
INT  ls1xLedDevCreate (CPCHAR  cpcName, UINT  uiGpio, BOOL  bIsOutPutHigh)
{
    PLS1XLED_DEV  pled;

    pled = (PLS1XLED_DEV)__SHEAP_ALLOC(sizeof(LS1X_LED_DEV));
    if (!pled) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return    (PX_ERROR);
    }

    lib_memset(pled, 0, sizeof(LS1X_LED_DEV));

    pled->LED_uiGpio        = uiGpio;
    pled->LED_bIsOutPutHigh = bIsOutPutHigh;
    pled->LED_time          = time(LW_NULL);

    if (API_IosDevAddEx(&pled->LED_devhdr, cpcName, _G_ils1xLedDrvNum, DT_CHR) != ERROR_NONE) {
        __SHEAP_FREE(pled);
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return    (PX_ERROR);
    }

    _ErrorHandle(ERROR_NONE);
    return    (ERROR_NONE);
}
Пример #5
0
/*********************************************************************************************************
** 函数名称: _rngCreate
** 功能描述: 建立一个 VxWorks 兼容 ring buffer 缓冲区
** 输 入  : 缓冲区大小
** 输 出  : 缓冲区控制块地址
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
VX_RING_ID  _rngCreate (INT  iNBytes)
{
    REGISTER PCHAR        pcBuffer;
    REGISTER VX_RING_ID   vxringid;
             size_t       stAllocSize;
    
    /* 
     *  bump number of bytes requested because ring buffer algorithm
     *  always leaves at least one empty byte in buffer 
     */
    iNBytes++;
    stAllocSize = (size_t)(sizeof(VX_RING) + iNBytes);
    
    /*
     *  统一分配内存避免内存碎片
     */
    vxringid = (VX_RING_ID)__SHEAP_ALLOC(stAllocSize);
    if (vxringid == LW_NULL) {
        return  (LW_NULL);
    }
    pcBuffer = (PCHAR)vxringid + sizeof(VX_RING);
    
    vxringid->VXRING_iBufByteSize = iNBytes;
    vxringid->VXRING_pcBuf        = pcBuffer;
    
    _rngFlush(vxringid);
    
    return  (vxringid);
}
Пример #6
0
/*********************************************************************************************************
** 函数名称: __inetPingSend
** 功能描述: 发送 ping 包
** 输 入  : iSock         套接字
**           inaddr        目标 ip 地址.
**           iDataSize     数据大小
**           pusSeqRecv    需要判断的 seq
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static INT  __inetPingSend (INT  iSock, struct in_addr  inaddr, INT  iDataSize, UINT16  *pusSeqRecv)
{
    REGISTER size_t                stPingSize = sizeof(struct icmp_echo_hdr) + iDataSize;
             struct icmp_echo_hdr *icmphdrEcho;
             ssize_t               sstError;
             struct sockaddr_in    sockaddrin;
             
    icmphdrEcho = (struct icmp_echo_hdr *)__SHEAP_ALLOC(stPingSize);
    if (icmphdrEcho == LW_NULL) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory\r\n");
        return  (PX_ERROR);
    }
    
    __inetPingPrepare(icmphdrEcho, iDataSize, pusSeqRecv);
    
    sockaddrin.sin_len    = sizeof(struct sockaddr_in);
    sockaddrin.sin_family = AF_INET;
    sockaddrin.sin_port   = 0;
    sockaddrin.sin_addr   = inaddr;
    
    sstError = sendto(iSock, icmphdrEcho, stPingSize, 0, 
                      (const struct sockaddr *)&sockaddrin, 
                      sizeof(struct sockaddr_in));
                         
    __SHEAP_FREE(icmphdrEcho);
    
    return ((sstError > 0) ? ERR_OK : ERR_VAL);
}
Пример #7
0
/*********************************************************************************************************
** 函数名称: API_HotplugPollAdd
** 功能描述: 在 hotplug 事件处理上下文中, 加入一个循环检测函数.
** 输 入  : pfunc                      函数指针
**           pvArg                      函数参数
** 输 出  : 操作是否成功
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
INT  API_HotplugPollAdd (VOIDFUNCPTR   pfunc, PVOID  pvArg)
{
    PLW_HOTPLUG_POLLNODE        phppn;
    
    phppn = (PLW_HOTPLUG_POLLNODE)__SHEAP_ALLOC(sizeof(LW_HOTPLUG_POLLNODE));
                                                                        /*  申请控制块内存              */
    if (!phppn) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);                          /*  缺少内存                    */
        return  (PX_ERROR);
    }
    
    phppn->HPPN_pfunc = pfunc;
    phppn->HPPN_pvArg = pvArg;
    
    __HOTPLUG_LOCK();                                                   /*  lock hotplug poll list      */
    _List_Line_Add_Ahead(&phppn->HPPN_lineManage, &_G_plineHotplugPoll);
    __HOTPLUG_UNLOCK();                                                 /*  unlock hotplug poll list    */
    
#if LW_CFG_MODULELOADER_EN > 0
    if (__PROC_GET_PID_CUR() && vprocFindProc((PVOID)pfunc)) {
        __resAddRawHook(&phppn->HPPN_resraw, (VOIDFUNCPTR)API_HotplugPollDelete,
                        (PVOID)pfunc, pvArg, 0, 0, 0, 0);
    } else {
        phppn->HPPN_resraw.RESRAW_bIsInstall = LW_FALSE;                /*  不需要回收操作              */
    }
#else
    __resAddRawHook(&phppn->HPPN_resraw, (VOIDFUNCPTR)API_HotplugPollDelete,
                    (PVOID)pfunc, pvArg, 0, 0, 0, 0);
#endif
    
    return  (ERROR_NONE);
}
Пример #8
0
/*********************************************************************************************************
** 函数名称: __rtAddCallback
** 功能描述: 添加一个 sylixos 路由条目(加入链表, 在 TCPIP 上下文中执行)
** 输 入  : ipaddrDest    目的地址
**           uiFlag        flag
**           pcNetifName   路由设备接口名
** 输 出  : ERROR_NONE
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static INT __rtAddCallback (ip_addr_t *pipaddrDest, UINT  uiFlag, CPCHAR  pcNetifName)
{
    INT             iHash = LW_RT_HASHINDEX(pipaddrDest);
    PLW_RT_ENTRY    prte;
    
    prte = (PLW_RT_ENTRY)__SHEAP_ALLOC(sizeof(LW_RT_ENTRY));
    if (prte == LW_NULL) {
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return  (PX_ERROR);
    }
    
    prte->RTE_ipaddrDest = *pipaddrDest;
    prte->RTE_pnetif = netif_find((PCHAR)pcNetifName);
    prte->RTE_uiFlag = uiFlag;
    lib_strlcpy(prte->RTE_cNetifName, pcNetifName, IF_NAMESIZE);
    if (prte->RTE_pnetif) {
        prte->RTE_uiFlag |= LW_RT_FLAG_U;                               /*  路由有效                    */
        _G_uiActiveNum++;
    }
    _G_uiTotalNum++;
    
    _List_Line_Add_Ahead(&prte->RTE_lineManage, &_G_plineRtHashHeader[iHash]);

    return  (ERROR_NONE);
}
Пример #9
0
/*********************************************************************************************************
** 函数名称: API_TShellFormatAdd
** 功能描述: 为一个关键字添加格式字串信息
** 输 入  : pcKeyword     关键字
**           pcFormat      格式字串
** 输 出  : 错误代码.
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
ULONG  API_TShellFormatAdd (CPCHAR  pcKeyword, CPCHAR  pcFormat)
{
             __PTSHELL_KEYWORD   pskwNode = LW_NULL;
    REGISTER size_t              stStrLen;
    
    if (__PROC_GET_PID_CUR() != 0) {                                    /*  进程中不允许操作            */
        _ErrorHandle(ENOTSUP);
        return  (ENOTSUP);
    }
    
    if (!pcKeyword) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "pcKeyword invalidate.\r\n");
        _ErrorHandle(ERROR_TSHELL_EPARAM);
        return  (ERROR_TSHELL_EPARAM);
    }
    if (!pcFormat) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "pcHelp invalidate.\r\n");
        _ErrorHandle(ERROR_TSHELL_EPARAM);
        return  (ERROR_TSHELL_EPARAM);
    }
    
    stStrLen = lib_strnlen(pcKeyword, LW_CFG_SHELL_MAX_KEYWORDLEN);
    
    if (stStrLen >= (LW_CFG_SHELL_MAX_KEYWORDLEN + 1)) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "pcKeyword is too long.\r\n");
        _ErrorHandle(ERROR_TSHELL_EPARAM);
        return  (ERROR_TSHELL_EPARAM);
    }
    
    if (ERROR_NONE == __tshellKeywordFind(pcKeyword, &pskwNode)) {      /*  查找关键字                  */
        
        __TTINY_SHELL_LOCK();                                           /*  互斥访问                    */
        if (pskwNode->SK_pcFormatString) {
            __TTINY_SHELL_UNLOCK();                                     /*  释放资源                    */
            
            _DebugHandle(__ERRORMESSAGE_LEVEL, "format string overlap.\r\n");
            _ErrorHandle(ERROR_TSHELL_OVERLAP);
            return  (ERROR_TSHELL_OVERLAP);
        }
        
        stStrLen = lib_strlen(pcFormat);                                /*  为帮助字串开辟空间          */
        pskwNode->SK_pcFormatString = (PCHAR)__SHEAP_ALLOC(stStrLen + 1);
        if (!pskwNode->SK_pcFormatString) {
            _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
            _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
            return  (ERROR_SYSTEM_LOW_MEMORY);
        }
        lib_strcpy(pskwNode->SK_pcFormatString, pcFormat);
        __TTINY_SHELL_UNLOCK();                                         /*  释放资源                    */
        return  (ERROR_NONE);
    
    } else {
        
        _ErrorHandle(ERROR_TSHELL_EKEYWORD);
        return  (ERROR_TSHELL_EKEYWORD);                                /*  关键字错误                  */
    }
}
Пример #10
0
/*********************************************************************************************************
** 函数名称: _hotplugOpen
** 功能描述: 打开热插拔消息设备
** 输 入  : photplugdev      热插拔消息设备
**           pcName           名称
**           iFlags           方式
**           iMode            方法
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static LONG  _hotplugOpen (PLW_HOTPLUG_DEV photplugdev, 
                           PCHAR           pcName,
                           INT             iFlags, 
                           INT             iMode)
{
    PLW_HOTPLUG_FILE  photplugfil;

    if (pcName == LW_NULL) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "device name invalidate.\r\n");
        _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
        return  (PX_ERROR);
    
    } else {
        if (iFlags & O_CREAT) {
            _ErrorHandle(ERROR_IO_FILE_EXIST);                          /*  不能重复创建                */
            return  (PX_ERROR);
        }
        
        photplugfil = (PLW_HOTPLUG_FILE)__SHEAP_ALLOC(sizeof(LW_HOTPLUG_FILE));
        if (!photplugfil) {
__nomem:
            _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
            _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
            return  (PX_ERROR);
        }
        
        photplugfil->HOTPFIL_iFlag = iFlags;
        photplugfil->HOTPFIL_iMsg  = LW_HOTPLUG_MSG_ALL;
        photplugfil->HOTPFIL_pbmsg = _bmsgCreate(LW_CFG_HOTPLUG_DEV_DEFAULT_BUFSIZE);
        if (photplugfil->HOTPFIL_pbmsg == LW_NULL) {
            __SHEAP_FREE(photplugfil);
            goto    __nomem;
        }
        
        photplugfil->HOTPFIL_ulReadSync = API_SemaphoreBCreate("hotplug_rsync", LW_FALSE,
                                                               LW_OPTION_OBJECT_GLOBAL,
                                                               LW_NULL);
        if (photplugfil->HOTPFIL_ulReadSync == LW_OBJECT_HANDLE_INVALID) {
            _bmsgDelete(photplugfil->HOTPFIL_pbmsg);
            __SHEAP_FREE(photplugfil);
            return  (PX_ERROR);
        }
        
        HOTPLUG_DEV_LOCK();
        _List_Line_Add_Tail(&photplugfil->HOTPFIL_lineManage,
                            &_G_hotplugdev.HOTPDEV_plineFile);
        HOTPLUG_DEV_UNLOCK();
        
        LW_DEV_INC_USE_COUNT(&_G_hotplugdev.HOTPDEV_devhdrHdr);
        
        return  ((LONG)photplugfil);
    }
}
Пример #11
0
/*********************************************************************************************************
** 函数名称: _evtfdOpen
** 功能描述: 打开 eventfd 设备
** 输 入  : pevtfddev        eventfd 设备
**           pcName           名称
**           iFlags           方式
**           iMode            方法
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static LONG  _evtfdOpen (PLW_EVTFD_DEV pevtfddev, 
                         PCHAR         pcName,
                         INT           iFlags, 
                         INT           iMode)
{
    PLW_EVTFD_FILE  pevtfdfil;

    if (pcName == LW_NULL) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "device name invalidate.\r\n");
        _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
        return  (PX_ERROR);
    
    } else {
        if (iFlags & O_CREAT) {
            _ErrorHandle(ERROR_IO_FILE_EXIST);
            return  (PX_ERROR);
        }
        
        pevtfdfil = (PLW_EVTFD_FILE)__SHEAP_ALLOC(sizeof(LW_EVTFD_FILE));
        if (!pevtfdfil) {
            _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
            _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
            return  (PX_ERROR);
        }
        
        pevtfdfil->EF_iFlag      = iFlags;
        pevtfdfil->EF_ulReadLock = API_SemaphoreBCreate("evtfd_rlock", LW_FALSE, 
                                                        LW_OPTION_OBJECT_GLOBAL, LW_NULL);
        if (pevtfdfil->EF_ulReadLock == LW_OBJECT_HANDLE_INVALID) {
            __SHEAP_FREE(pevtfdfil);
            return  (PX_ERROR);
        }
        pevtfdfil->EF_ulWriteLock = API_SemaphoreBCreate("evtfd_wlock", LW_TRUE, 
                                                         LW_OPTION_OBJECT_GLOBAL, LW_NULL);
        if (pevtfdfil->EF_ulWriteLock == LW_OBJECT_HANDLE_INVALID) {
            API_SemaphoreBDelete(&pevtfdfil->EF_ulReadLock);
            __SHEAP_FREE(pevtfdfil);
            return  (PX_ERROR);
        }
        
        pevtfdfil->EF_u64Counter = 0ull;
        
        lib_bzero(&pevtfdfil->EF_selwulist, sizeof(LW_SEL_WAKEUPLIST));
        pevtfdfil->EF_selwulist.SELWUL_hListLock = _G_hEvtfdSelMutex;
        
        LW_SPIN_INIT(&pevtfdfil->EF_slLock);
        
        LW_DEV_INC_USE_COUNT(&_G_evtfddev.ED_devhdrHdr);
        
        return  ((LONG)pevtfdfil);
    }
}
Пример #12
0
/*********************************************************************************************************
** 函数名称: __tshellTtyInputHistorySave
** 功能描述: shell 记录一条输入.
** 输 入  : psicContext           输入上下文
** 输 出  : NONE
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static VOID  __tshellHistorySave (__PSHELL_INPUT_CTX  psicContext)
{
    PLW_CLASS_TCB           ptcbCur;
    __PSHELL_HISTORY_CTX    psihc;
    __PSHELL_HISTORY        psihHistory;
    PLW_LIST_RING           pring;
    
    LW_TCB_GET_CUR_SAFE(ptcbCur);
    
    psihc = __TTINY_SHELL_GET_HIS(ptcbCur);
    
    pring = psihc->SIHC_pringHeader;
    while (pring) {                                                     /*  循环查找是否与以前的相同    */
        psihHistory = _LIST_ENTRY(pring, __SHELL_HISTORY, SIH_ringManage);
        
        if (lib_strcmp(psihHistory->SIH_cInputSave, CTX_BUFFER) == 0) { /*  如果相同                    */
            
            if (pring == psihc->SIHC_pringHeader) {
                return;                                                 /*  如果是表头, 则不需要处理    */
            
            } else {
                _List_Ring_Del(&psihHistory->SIH_ringManage,
                               &psihc->SIHC_pringHeader);
                _List_Ring_Add_Ahead(&psihHistory->SIH_ringManage,
                                     &psihc->SIHC_pringHeader);         /*  放在表头位置                */
                return;
            }
        }
        pring = _list_ring_get_next(pring);
        if (pring == psihc->SIHC_pringHeader) {
            break;
        }
    }
    
    psihHistory = (__PSHELL_HISTORY)__SHEAP_ALLOC(sizeof(__SHELL_HISTORY) + 
                                                  lib_strlen(CTX_BUFFER));
    if (psihHistory) {
        lib_strcpy(psihHistory->SIH_cInputSave, CTX_BUFFER);
        _List_Ring_Add_Ahead(&psihHistory->SIH_ringManage,
                             &psihc->SIHC_pringHeader);                 /*  加入新的输入                */
        psihc->SIHC_uiCounter++;
        
        if (psihc->SIHC_uiCounter > __INPUT_SAVE_MAX) {                 /*  需要删除最老的一条          */
            PLW_LIST_RING   pringPrev = _list_ring_get_prev(psihc->SIHC_pringHeader);
            psihHistory = _LIST_ENTRY(pringPrev, __SHELL_HISTORY, SIH_ringManage);
            _List_Ring_Del(&psihHistory->SIH_ringManage,
                           &psihc->SIHC_pringHeader);
            __SHEAP_FREE(psihHistory);
            psihc->SIHC_uiCounter--;
        }
    }
}
Пример #13
0
/*********************************************************************************************************
** 函数名称: __canInitQueue
** 功能描述: 缓冲初始化
** 输 入  : uiMaxFrame     缓冲区 can 帧个数
** 输 出  : 缓冲区指针
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static __PCAN_QUEUE  __canInitQueue (UINT   uiMaxFrame)
{
    size_t         stAllocSize;
    __CAN_QUEUE   *pcanq = NULL;

    stAllocSize = (size_t)(sizeof(__CAN_QUEUE) + (uiMaxFrame * sizeof(CAN_FRAME)));
    pcanq       = (__CAN_QUEUE *)__SHEAP_ALLOC(stAllocSize);
    if (pcanq == LW_NULL) {
        return  (LW_NULL);
    }
    pcanq->CANQ_uiCounter       = 0;
    pcanq->CANQ_uiMaxFrame      = uiMaxFrame;
    pcanq->CANQ_pcanframeBuffer = (PCAN_FRAME)(pcanq + 1);
    pcanq->CANQ_pcanframeIn     = pcanq->CANQ_pcanframeBuffer;
    pcanq->CANQ_pcanframeOut    = pcanq->CANQ_pcanframeBuffer;
    pcanq->CANQ_pcanframeEnd    = pcanq->CANQ_pcanframeBuffer + pcanq->CANQ_uiMaxFrame;

    return (pcanq);
}
Пример #14
0
/*********************************************************************************************************
** 函数名称: pthread_key_create
** 功能描述: 创建一个数据键.
** 输 入  : pkey          键 (返回)
**           destructor    删除函数
** 输 出  : ERROR CODE
** 全局变量: 
** 调用模块: 
** 注  意  : key 信号量设置为 LW_OPTION_OBJECT_GLOBAL 是因为 key 已经使用了原始资源进行回收.
                                           API 函数
*********************************************************************************************************/
LW_API 
int  pthread_key_create (pthread_key_t  *pkey, void (*destructor)(void *))
{
    __PX_KEY_NODE   *pkeyn;
    
    if (pkey == LW_NULL) {
        errno = EINVAL;
        return  (EINVAL);
    }
    
    API_ThreadOnce(&_G_bKeyDelHookAdd, __pthreadKeyOnce);               /*  安装线程删除回调            */
    
    pkeyn = (__PX_KEY_NODE *)__SHEAP_ALLOC(sizeof(__PX_KEY_NODE));      /*  创建节点内存                */
    if (pkeyn == LW_NULL) {
        errno = ENOMEM;
        return  (ENOMEM);
    }
    pkeyn->PKEYN_lId             = (long)pkeyn;
    pkeyn->PKEYN_pfuncDestructor = destructor;
    pkeyn->PKEYN_plineKeyHeader  = LW_NULL;
    pkeyn->PKEYN_ulMutex         = API_SemaphoreMCreate("pxkey", LW_PRIO_DEF_CEILING, 
                                            LW_OPTION_INHERIT_PRIORITY |
                                            LW_OPTION_DELETE_SAFE |
                                            LW_OPTION_OBJECT_GLOBAL, LW_NULL);
    if (pkeyn->PKEYN_ulMutex == LW_OBJECT_HANDLE_INVALID) {
        __SHEAP_FREE(pkeyn);
        errno = ENOSPC;
        return  (ENOSPC);
    }
    
    __PX_LOCK();                                                        /*  锁住 posix 库               */
    _List_Line_Add_Ahead(&pkeyn->PKEYN_lineManage,
                         &_G_plineKeyHeader);                           /*  加入 key 键链表             */
    __PX_UNLOCK();                                                      /*  解锁 posix 库               */
    
    __resAddRawHook(&pkeyn->PKEYN_resraw, (VOIDFUNCPTR)pthread_key_delete, 
                    pkeyn, 0, 0, 0, 0, 0);                              /*  加入资源管理器              */
    
    *pkey = (pthread_key_t)pkeyn;                                       /*  将内存地址定义为 id         */
    
    return  (ERROR_NONE);
}
Пример #15
0
/*********************************************************************************************************
** 函数名称: __tshellAodvs
** 功能描述: 系统命令 "aodvs"
** 输 入  : iArgC         参数个数
**           ppcArgV       参数表
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static INT  __tshellAodvs (INT  iArgC, PCHAR  *ppcArgV)
{
    PCHAR   pcBuffer;
    size_t  stSize;
    size_t  stOffset;
    UINT    uiNumEntries;

    uiNumEntries = (UINT)__rtSafeRun((FUNCPTR)__rtEntryMaxNum, 0, 0, 0, 0, 0, 0);
    if (uiNumEntries == 0) {
        printf("no route entry.\n");
        return  (ERROR_NONE);
    }
    
    /*
     *  在 net safe 状态下不允许调用 printf 等使用 IO 的语句. 所以只能打印到缓冲区中,
     *  然后统一使用 IO 打印.
     */
    stSize   = LW_RT_PRINT_SIZE * uiNumEntries;
    pcBuffer = (PCHAR)__SHEAP_ALLOC(stSize);
    if (pcBuffer == LW_NULL) {
        fprintf(stderr, "system low memory.\n");
        return  (PX_ERROR);
    }

    /*
     *  打印 aodv route entry
     */
    stOffset = 0;
    printf("aodv routing tables\n");
    printf("Destination        Gateway            Mask               Flag     Hops     Interface\n");
    __rtSafeRun((FUNCPTR)aodv_rt_traversal, (void *)__aodvEntryPrint,
                pcBuffer, (PVOID)stSize, &stOffset, 0, 0);
    if (stOffset > 0) {
        fwrite(pcBuffer, stOffset, 1, stdout);
        fflush(stdout);                                                 /*  这里必须确保输出完成        */
    }

    __SHEAP_FREE(pcBuffer);

    return  (ERROR_NONE);
}
Пример #16
0
/*********************************************************************************************************
** 函数名称: __tshellReadlineInit
** 功能描述: shell 初始化 readline.
** 输 入  : NONE
** 输 出  : 初始化是否成功
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static INT  __tshellReadlineInit (VOID)
{
    PLW_CLASS_TCB           ptcbCur;
    __PSHELL_HISTORY_CTX    psihc;
    
    LW_TCB_GET_CUR_SAFE(ptcbCur);
    
    psihc = __TTINY_SHELL_GET_HIS(ptcbCur);
    
    if (psihc == LW_NULL) {
        psihc = (__PSHELL_HISTORY_CTX)__SHEAP_ALLOC(sizeof(__SHELL_HISTORY_CTX));
        if (psihc == LW_NULL) {
            fprintf(stderr, "read line tool no memory!\n");
            return  (PX_ERROR);
        }
        lib_bzero(psihc, sizeof(__SHELL_HISTORY_CTX));
        __TTINY_SHELL_SET_HIS(ptcbCur, psihc);
    }
    
    return  (ERROR_NONE);
}
Пример #17
0
/*********************************************************************************************************
** 函数名称: __inetPing6Send
** 功能描述: 发送 ping 包
** 输 入  : iSock         套接字
**           pin6addr      目标 ip 地址.
**           iDataSize     数据大小
**           pcNetif       网络接口名 (NULL 表示自动确定接口)
**           pusSeqRecv    需要判断的 seq
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static INT  __inetPing6Send (INT              iSock, 
                             struct in6_addr *pin6addr, 
                             INT              iDataSize, 
                             CPCHAR           pcNetif,
                             UINT16          *pusSeqRecv)
{
    REGISTER size_t                 stPingSize = sizeof(struct icmp6_echo_hdr) + iDataSize;
             struct icmp6_echo_hdr *icmp6hdrEcho;
             ssize_t                sstError;
             struct sockaddr_in6    sockaddrin6;
             struct ip6_addr        ip6addrDest;
             
    icmp6hdrEcho = (struct icmp6_echo_hdr *)__SHEAP_ALLOC(stPingSize);
    if (icmp6hdrEcho == LW_NULL) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory\r\n");
        return  (PX_ERROR);
    }
    
    ip6addrDest.addr[0] = pin6addr->un.u32_addr[0];
    ip6addrDest.addr[1] = pin6addr->un.u32_addr[1];
    ip6addrDest.addr[2] = pin6addr->un.u32_addr[2];
    ip6addrDest.addr[3] = pin6addr->un.u32_addr[3];
    
    if (__inetPing6Prepare(icmp6hdrEcho, &ip6addrDest, iDataSize, pcNetif, pusSeqRecv) < ERROR_NONE) {
        return  (ERR_VAL);
    }
    
    sockaddrin6.sin6_len    = sizeof(struct sockaddr_in);
    sockaddrin6.sin6_family = AF_INET6;
    sockaddrin6.sin6_port   = 0;
    sockaddrin6.sin6_addr   = *pin6addr;
    
    sstError = sendto(iSock, icmp6hdrEcho, stPingSize, 0, 
                      (const struct sockaddr *)&sockaddrin6, 
                      sizeof(struct sockaddr_in6));
                         
    __SHEAP_FREE(icmp6hdrEcho);
    
    return ((sstError > 0) ? ERR_OK : ERR_VAL);
}
Пример #18
0
/*********************************************************************************************************
** 函数名称: if_nameindex
** 功能描述: return all network interface names and indexes
** 输 入  : NONE
** 输 出  : An array of structures identifying local interfaces
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
struct if_nameindex *if_nameindex (void)
{
    struct netif           *pnetif;
    int                     iNum = 1;                                   /*  需要一个空闲的位置          */
    struct if_nameindex    *pifnameindexArry;
    
    LWIP_NETIF_LOCK();                                                  /*  进入临界区                  */
    for(pnetif = netif_list; pnetif != LW_NULL; pnetif = pnetif->next) {
        iNum++;
    }
    pifnameindexArry = (struct if_nameindex *)__SHEAP_ALLOC(sizeof(struct if_nameindex) * (size_t)iNum);
    if (pifnameindexArry) {
        int     i = 0;
        
        for(pnetif  = netif_list; 
            pnetif != LW_NULL; 
            pnetif  = pnetif->next) {
            
            pifnameindexArry[i].if_index = (unsigned)pnetif->num;
            pifnameindexArry[i].if_name_buf[0] = pnetif->name[0];
            pifnameindexArry[i].if_name_buf[1] = pnetif->name[1];
            pifnameindexArry[i].if_name_buf[2] = (char)(pnetif->num + '0');
            pifnameindexArry[i].if_name_buf[3] = PX_EOS;
            pifnameindexArry[i].if_name = pifnameindexArry[i].if_name_buf;
            i++;
        }
        
        pifnameindexArry[i].if_index = 0;
        pifnameindexArry[i].if_name_buf[0] = PX_EOS;
        pifnameindexArry[i].if_name = pifnameindexArry[i].if_name_buf;
        
    } else {
        errno = ENOMEM;
    }
    LWIP_NETIF_UNLOCK();                                                /*  退出临界区                  */
    
    return  (pifnameindexArry);
}
Пример #19
0
/*********************************************************************************************************
** 函数名称: readlink
** 功能描述: 读取符号链接文件的.
** 输 入  : pcSymPath             链接文件
**           pcLinkDst             连接内容缓冲
**           stMaxSize             缓冲大小
** 输 出  : 读取的内容长度
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API 
ssize_t  readlink (CPCHAR  pcSymPath, PCHAR  pcLinkDst, size_t  stMaxSize)
{
    REGISTER LONG  lValue;
    PLW_FD_ENTRY   pfdentry;
    PLW_DEV_HDR    pdevhdrHdr;
    CHAR           cFullFileName[MAX_FILENAME_LENGTH];
    PCHAR          pcLastTimeName;
    INT            iLinkCount = 0;
    
    ssize_t        sstRet;
    
    PCHAR          pcName = (PCHAR)pcSymPath;
    
    if (pcName == LW_NULL) {                                            /*  检查文件名                  */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "name invalidate.\r\n");
        _ErrorHandle(EFAULT);                                           /*  Bad address                 */
        return  (PX_ERROR);
    }
    if (pcName[0] == PX_EOS) {
        _ErrorHandle(ENOENT);
        return  (PX_ERROR);
    }
    
    if (lib_strcmp(pcName, ".") == 0) {                                 /*  滤掉当前目录                */
        pcName++;
    }
    
    if (ioFullFileNameGet(pcName, &pdevhdrHdr, cFullFileName) != ERROR_NONE) {
        _ErrorHandle(ENOENT);
        return  (PX_ERROR);
    }
    
    pcLastTimeName = (PCHAR)__SHEAP_ALLOC(MAX_FILENAME_LENGTH);
    if (pcLastTimeName == LW_NULL) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return  (PX_ERROR);
    }
    lib_strlcpy(pcLastTimeName, cFullFileName, MAX_FILENAME_LENGTH);
    
    pfdentry = _IosFileNew(pdevhdrHdr, cFullFileName);                  /*  创建一个临时的 fd_entry     */
    if (pfdentry == LW_NULL) {
        __SHEAP_FREE(pcLastTimeName);
        return  (PX_ERROR);
    }
    
    for (;;) {
        lValue = iosOpen(pdevhdrHdr, cFullFileName, O_RDONLY, 0);
        if (lValue != FOLLOW_LINK_TAIL) {                               /*  FOLLOW_LINK_FILE 直接退出   */
            break;
        
        } else {
            if (iLinkCount++ > _S_iIoMaxLinkLevels) {                   /*  链接文件层数太多            */
                _IosFileDelete(pfdentry);
                __SHEAP_FREE(pcLastTimeName);
                _ErrorHandle(ELOOP);
                return  (PX_ERROR);
            }
        }
    
        /*
         *  驱动程序如果返回 FOLLOW_LINK_????, cFullFileName内部一定是目标的绝对地址, 即以/起始的文件名.
         */
        if (ioFullFileNameGet(cFullFileName, &pdevhdrHdr, cFullFileName) != ERROR_NONE) {
            _IosFileDelete(pfdentry);
            __SHEAP_FREE(pcLastTimeName);
            _ErrorHandle(EXDEV);
            return  (PX_ERROR);
        }
        lib_strlcpy(pcLastTimeName, cFullFileName, MAX_FILENAME_LENGTH);
    }
    
    if ((lValue != PX_ERROR) && (lValue != FOLLOW_LINK_FILE)) {
        _IosFileSet(pfdentry, pdevhdrHdr, lValue, O_RDONLY);
        _IosFileClose(pfdentry);                                        /*  关闭                        */
    }
    
    _IosFileDelete(pfdentry);                                           /*  删除临时的 fd_entry         */
    
    sstRet = iosReadlink(pdevhdrHdr, pcLastTimeName, pcLinkDst, stMaxSize);
    
    __SHEAP_FREE(pcLastTimeName);
    
    return  (sstRet);
}
Пример #20
0
/*********************************************************************************************************
** 函数名称: __romFsOpen
** 功能描述: 打开或者创建文件
** 输 入  : promfs           romfs 文件系统
**           pcName           文件名
**           iFlags           方式
**           iMode            mode_t
** 输 出  : < 0 错误
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static LONG __romFsOpen (PROM_VOLUME     promfs,
                         PCHAR           pcName,
                         INT             iFlags,
                         INT             iMode)
{
    INT             iError;
    PROM_FILE       promfile;
    PLW_FD_NODE     pfdnode;
    size_t          stSize;
    BOOL            bIsNew;
    struct stat    *pstat;
    
    INT             iFollowLinkType;
    PCHAR           pcTail, pcSymfile, pcPrefix;
    
    if (pcName == LW_NULL) {                                            /*  无文件名                    */
        _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
        return  (PX_ERROR);
    
    } else {
        stSize   = sizeof(ROM_FILE) + lib_strlen(pcName);
        promfile = (PROM_FILE)__SHEAP_ALLOC(stSize);
        if (promfile == LW_NULL) {
            _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
            _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
            return  (PX_ERROR);
        }
        lib_bzero(promfile, stSize);
        lib_strcpy(promfile->ROMFIL_cName, pcName);                     /*  记录文件名                  */
        
        promfile->ROMFIL_promfs = promfs;
        
        if (__ROMFS_VOL_LOCK(promfs) != ERROR_NONE) {
            _ErrorHandle(ENXIO);
            return  (PX_ERROR);
        }
        if (__STR_IS_ROOT(promfile->ROMFIL_cName)) {
            promfile->ROMFIL_iFileType = __ROMFS_FILE_TYPE_DEV;
            goto    __file_open_ok;                                     /*  设备打开正常                */
        }
        
        if (promfs->ROMFS_bValid == LW_FALSE) {
            __ROMFS_VOL_UNLOCK(promfs);
            __SHEAP_FREE(promfile);
            _ErrorHandle(ERROR_IOS_DEVICE_NOT_FOUND);
            return  (PX_ERROR);
        }
        
        iError = __rfs_open(promfs, pcName, &pcTail, &pcSymfile, &promfile->ROMFIL_romfsdnt);
        if (iError) {
            __ROMFS_VOL_UNLOCK(promfs);
            __SHEAP_FREE(promfile);
            if (iFlags & O_CREAT) {
                _ErrorHandle(EROFS);                                    /*  只读文件系统                */
            }
            return  (PX_ERROR);
        }
        
        /*
         *  首先处理符号链接文件情况
         */
        if (S_ISLNK(promfile->ROMFIL_romfsdnt.ROMFSDNT_stat.st_mode)) {
            pcSymfile--;                                                /*  从 / 开始                   */
            if (pcSymfile == pcName) {
                pcPrefix = LW_NULL;                                     /*  没有前缀                    */
            } else {
                pcPrefix = pcName;
                *pcSymfile = PX_EOS;
            }
            if (pcTail && lib_strlen(pcTail)) {
                iFollowLinkType = FOLLOW_LINK_TAIL;                     /*  连接目标内部文件            */
            } else {
                iFollowLinkType = FOLLOW_LINK_FILE;                     /*  链接文件本身                */
            }
        
            if (__rfs_path_build_link(promfs, &promfile->ROMFIL_romfsdnt, pcName, PATH_MAX + 1,
                                      pcPrefix, pcTail) == ERROR_NONE) {
                                                                        /*  构造链接目标                */
                __ROMFS_VOL_UNLOCK(promfs);
                __SHEAP_FREE(promfile);
                return  (iFollowLinkType);
            
            } else {                                                    /*  构造连接失败                */
                __ROMFS_VOL_UNLOCK(promfs);
                __SHEAP_FREE(promfile);
                return  (PX_ERROR);
            }
        
        } else if (S_ISDIR(promfile->ROMFIL_romfsdnt.ROMFSDNT_stat.st_mode)) {
            promfile->ROMFIL_iFileType = __ROMFS_FILE_TYPE_DIR;
        
        } else {
            promfile->ROMFIL_iFileType = __ROMFS_FILE_TYPE_NODE;
        }
        
__file_open_ok:
        pstat   = &promfile->ROMFIL_romfsdnt.ROMFSDNT_stat;
        pfdnode = API_IosFdNodeAdd(&promfs->ROMFS_plineFdNodeHeader,
                                    pstat->st_dev,
                                    (ino64_t)pstat->st_ino,
                                    iFlags,
                                    iMode,
                                    pstat->st_uid,
                                    pstat->st_gid,
                                    pstat->st_size,
                                    (PVOID)promfile,
                                    &bIsNew);                           /*  添加文件节点                */
        if (pfdnode == LW_NULL) {                                       /*  无法创建 fd_node 节点       */
            __ROMFS_VOL_UNLOCK(promfs);
            __SHEAP_FREE(promfile);
            return  (PX_ERROR);
        }
        
        LW_DEV_INC_USE_COUNT(&promfs->ROMFS_devhdrHdr);                 /*  更新计数器                  */
        
        __ROMFS_VOL_UNLOCK(promfs);
        
        if (bIsNew == LW_FALSE) {                                       /*  有重复打开                  */
            __SHEAP_FREE(promfile);
        }
        
        return  ((LONG)pfdnode);                                        /*  返回文件节点                */
    }
    
    return  (PX_ERROR);
}
Пример #21
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);
}
Пример #22
0
/*********************************************************************************************************
** 函数名称: API_OemDiskMountEx2
** 功能描述: 自动挂载一个磁盘的所有分区. 可以使用指定的文件系统类型挂载
** 输 入  : pcVolName          根节点名字 (当前 API 将根据分区情况在末尾加入数字)
**           pblkdDisk          物理磁盘控制块 (必须是直接操作物理磁盘)
**           pvDiskCacheMem     磁盘 CACHE 缓冲区的内存起始地址  (为零表示动态分配磁盘缓冲)
**           stMemSize          磁盘 CACHE 缓冲区大小            (为零表示不需要 DISK CACHE)
**           iMaxRBurstSector   磁盘猝发读的最大扇区数
**           iMaxWBurstSector   磁盘猝发写的最大扇区数
**           pcFsName           文件系统类型, 例如: "vfat" "tpsfs" "iso9660" "ntfs" ...
**           bForceFsType       是否强制使用指定的文件系统类型
** 输 出  : OEM 磁盘控制块
** 全局变量: 
** 调用模块: 
** 注  意  : 挂载的文件系统不包含 yaffs 文件系统, yaffs 属于静态文件系统.
                                           API 函数
*********************************************************************************************************/
LW_API 
PLW_OEMDISK_CB  API_OemDiskMountEx2 (CPCHAR        pcVolName,
                                     PLW_BLK_DEV   pblkdDisk,
                                     PVOID         pvDiskCacheMem, 
                                     size_t        stMemSize, 
                                     INT           iMaxRBurstSector,
                                     INT           iMaxWBurstSector,
                                     CPCHAR        pcFsName,
                                     BOOL          bForceFsType)
{
             INT            i;
             INT            iErrLevel = 0;
             
    REGISTER ULONG          ulError;
             CHAR           cFullVolName[MAX_FILENAME_LENGTH];          /*  完整卷标名                  */
             
             INT            iBlkIo;
             INT            iBlkIoErr;
             PCHAR          pcTail;

             INT            iVolSeq;
    REGISTER INT            iNPart;
             DISKPART_TABLE dptPart;                                    /*  分区表                      */
             PLW_OEMDISK_CB poemd;
             
             FUNCPTR        pfuncFsCreate;
    
    /*
     *  挂载节点名检查
     */
    if (pcVolName == LW_NULL || *pcVolName != PX_ROOT) {                /*  名字错误                    */
        _ErrorHandle(EINVAL);
        return  (LW_NULL);
    }
    i = (INT)lib_strnlen(pcVolName, (PATH_MAX - __OEM_DISK_TAIL_LEN));
    if (i >= (PATH_MAX - __OEM_DISK_TAIL_LEN)) {                        /*  名字过长                    */
        _ErrorHandle(ERROR_IO_NAME_TOO_LONG);
        return  (LW_NULL);
    }
    
    /*
     *  分配 OEM 磁盘控制块内存
     */
    poemd = (PLW_OEMDISK_CB)__SHEAP_ALLOC(sizeof(LW_OEMDISK_CB) + (size_t)i);
    if (poemd == LW_NULL) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return  (LW_NULL);
    }
    lib_bzero(poemd, sizeof(LW_OEMDISK_CB) + i);                        /*  清空                        */
    
    poemd->OEMDISK_pblkdDisk = pblkdDisk;
    
    /* 
     *  分配磁盘缓冲内存
     */
    if ((pvDiskCacheMem == LW_NULL) && (stMemSize > 0)) {               /*  是否需要动态分配磁盘缓冲    */
        poemd->OEMDISK_pvCache = __SHEAP_ALLOC(stMemSize);
        if (poemd->OEMDISK_pvCache == LW_NULL) {
            _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);                      /*  系统缺少内存                */
            goto    __error_handle;
        }
        pvDiskCacheMem = poemd->OEMDISK_pvCache;
    }
    
    /*
     *  创建物理磁盘缓冲, 同时会初始化磁盘
     */
    if (stMemSize) {
        ulError = API_DiskCacheCreateEx(pblkdDisk, 
                                        pvDiskCacheMem, 
                                        stMemSize,
                                        iMaxRBurstSector, 
                                        iMaxWBurstSector, 
                                        &poemd->OEMDISK_pblkdCache);
        if (ulError) {
            iErrLevel = 1;
            goto    __error_handle;
        }
    } else {
        poemd->OEMDISK_pblkdCache = pblkdDisk;                          /*  不需要磁盘缓冲              */
    }
    
    /*
     *  创建 blk io 设备
     */
    pcTail = lib_rindex(pcVolName, PX_DIVIDER);
    if (pcTail == LW_NULL) {
        pcTail =  (PCHAR)pcVolName;
    } else {
        pcTail++;
    }

    for (iBlkIo = 0; iBlkIo < 64; iBlkIo++) {
        snprintf(cFullVolName, MAX_FILENAME_LENGTH, "%s%s%d", LW_BLKIO_PERFIX, pcTail, iBlkIo);
        if (API_IosDevMatchFull(cFullVolName) == LW_NULL) {
            iBlkIoErr = API_OemBlkIoCreate(cFullVolName,
                                           poemd->OEMDISK_pblkdCache);
            if (iBlkIoErr == ERROR_NONE) {
                break;

            } else if (errno != ERROR_IOS_DUPLICATE_DEVICE_NAME) {
                iErrLevel = 2;
                goto    __error_handle;
            }
        }
    }

    /*
     *  扫面磁盘所有分区信息
     */
    iNPart = API_DiskPartitionScan(poemd->OEMDISK_pblkdCache, 
                                   &dptPart);                           /*  扫描分区表                  */
    if (iNPart < 1) {
        iErrLevel = 3;
        goto    __error_handle;
    }
    poemd->OEMDISK_uiNPart = (UINT)iNPart;                              /*  记录分区数量                */
    
    /*
     *  初始化所有的分区挂载失败
     */
    for (i = 0; i < iNPart; i++) {
        poemd->OEMDISK_iVolSeq[i] = PX_ERROR;                           /*  默认为挂载失败              */
    }
    
    /*
     *  分别挂载各个分区
     */
    iVolSeq = 0;
    for (i = 0; i < iNPart; i++) {                                      /*  装载各个分区                */
        if (API_DiskPartitionGet(&dptPart, i, 
                                 &poemd->OEMDISK_pblkdPart[i]) < 0) {   /*  获得分区 logic device       */
            break;
        }
        
__refined_seq:
        sprintf(cFullVolName, "%s%d", pcVolName, iVolSeq);              /*  获得完整卷名                */
        if (API_IosDevMatchFull(cFullVolName)) {                        /*  设备名重名预判              */
            iVolSeq++;
            goto    __refined_seq;                                      /*  重新确定卷序号              */
        }
        
        pfuncFsCreate = LW_NULL;
        
        switch (dptPart.DPT_dpoLogic[i].DPO_dpnEntry.DPN_ucPartType) {  /*  判断文件系统分区类型        */
            
        case LW_DISK_PART_TYPE_FAT12:                                   /*  FAT 文件系统类型            */
        case LW_DISK_PART_TYPE_FAT16:
        case LW_DISK_PART_TYPE_FAT16_BIG:
        case LW_DISK_PART_TYPE_WIN95_FAT32:
        case LW_DISK_PART_TYPE_WIN95_FAT32LBA:
        case LW_DISK_PART_TYPE_WIN95_FAT16LBA:
            if (bForceFsType) {                                         /*  是否强制指定文件系统类型    */
                pfuncFsCreate = __fsCreateFuncGet(pcFsName);
            } else {
                pfuncFsCreate = __fsCreateFuncGet("vfat");
            }
            break;
            
        case LW_DISK_PART_TYPE_TPS:
            if (bForceFsType) {                                         /*  是否强制指定文件系统类型    */
                pfuncFsCreate = __fsCreateFuncGet(pcFsName);
            } else {
                pfuncFsCreate = __fsCreateFuncGet("tpsfs");
            }
            break;
        
        default:                                                        /*  默认使用指定文件系统类型    */
            if (bForceFsType) {                                         /*  是否强制指定文件系统类型    */
                pfuncFsCreate = __fsCreateFuncGet(pcFsName);
            }
            break;
        }
        
        if (pfuncFsCreate) {                                            /*  存在支持的文件系统          */
            if (pfuncFsCreate(cFullVolName, 
                              poemd->OEMDISK_pblkdPart[i]) < 0) {       /*  挂载文件系统                */
                if (API_GetLastError() == ERROR_IOS_DUPLICATE_DEVICE_NAME) {
                    iVolSeq++;
                    goto    __refined_seq;                              /*  重新确定卷序号              */
                } else {
                    goto    __mount_over;                               /*  挂载失败                    */
                }
            }
            poemd->OEMDISK_pdevhdr[i] = API_IosDevMatchFull(cFullVolName);
            poemd->OEMDISK_iVolSeq[i] = iVolSeq;                        /*  记录卷序号                  */
        
        } else {
            continue;                                                   /*  此分区无法加载              */
        }
        
        if (poemd->OEMDISK_iVolSeq[i] >= 0) {
            __oemDiskForceDeleteEn(cFullVolName);                       /*  默认为强制删除              */
        }
        
        iVolSeq++;                                                      /*  已处理完当前卷              */
    }

__mount_over:                                                           /*  所有分区挂载完毕            */
    lib_strcpy(poemd->OEMDISK_cVolName, pcVolName);                     /*  拷贝名字                    */
    
    return  (poemd);
    
__error_handle:
    if (iErrLevel > 2) {
        if (poemd->OEMDISK_pblkdCache) {
            API_OemBlkIoDelete(poemd->OEMDISK_pblkdCache);
        }
    }
    if (iErrLevel > 1) {
        if (poemd->OEMDISK_pblkdCache != pblkdDisk) {
            API_DiskCacheDelete(poemd->OEMDISK_pblkdCache);
        }
    }
    if (iErrLevel > 0) {
        if (poemd->OEMDISK_pvCache) {
            __SHEAP_FREE(poemd->OEMDISK_pvCache);
        }
    }
    __SHEAP_FREE(poemd);
    
    return  (LW_NULL);
}
Пример #23
0
/*********************************************************************************************************
** 函数名称: __pthreadDataSet
** 功能描述: 设置指定 key 在当前线程内部数据节点. (无则创建)
** 输 入  : lId           键id
**           pvData        初始数据
** 输 出  : ERROR CODE
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static INT  __pthreadDataSet (long  lId, const void  *pvData)
{
    __PX_KEY_NODE       *pkeyn = (__PX_KEY_NODE *)lId;
    __PX_KEY_DATA       *pkeyd;
    PLW_CLASS_TCB        ptcbCur;
    LW_OBJECT_HANDLE     ulMe;
    __PX_CONTEXT        *pctx;
    PLW_LIST_LINE        plineTemp;
    
    if (pkeyn == LW_NULL) {                                             /*  没有 key 键                 */
        errno = EINVAL;
        return  (EINVAL);
    }
    
    LW_TCB_GET_CUR_SAFE(ptcbCur);
    
    ulMe = ptcbCur->TCB_ulId;
    pctx = _posixCtxGet(ptcbCur);
    
    if (pctx == LW_NULL) {                                              /*  没有线程上下文              */
        errno = ENOMEM;
        return  (EINVAL);
    }
    
    /*
     *  查找是否已经创建了相关私有数据
     */
    __PX_KEY_LOCK(pkeyn);                                               /*  锁住 key 键                 */
    for (plineTemp  = pkeyn->PKEYN_plineKeyHeader;
         plineTemp != LW_NULL;
         plineTemp  = _list_line_get_next(plineTemp)) {
        
        pkeyd = (__PX_KEY_DATA *)plineTemp;                             /*  链表是 KEY DATA 的第一个元素*/
        if (pkeyd->PKEYD_ulOwner == ulMe) {                             /*  找到对应当前线程的数据      */
            pkeyd->PKEYD_pvData = (void *)pvData;
            break;
        }
    }
    __PX_KEY_UNLOCK(pkeyn);                                             /*  解锁 key 键                 */
    if (plineTemp) {
        return  (ERROR_NONE);                                           /*  已经找到了对应的节点        */
    }
    
    /*
     *  如果没有找到, 则需要新建私有数据
     */
    pkeyd = (__PX_KEY_DATA  *)__SHEAP_ALLOC(sizeof(__PX_KEY_DATA));     /*  没有节点, 需要新建          */
    if (pkeyd == LW_NULL) {
        errno = ENOMEM;
        return  (ENOMEM);
    }
    pkeyd->PKEYD_lId     = lId;                                         /*  通过 id 反向查找 key        */
    pkeyd->PKEYD_pvData  = (void *)pvData;
    pkeyd->PKEYD_ulOwner = ulMe;                                        /*  记录线程 ID                 */
    
    __PX_KEY_LOCK(pkeyn);                                               /*  锁住 key 键                 */
    _List_Line_Add_Ahead(&pkeyd->PKEYD_lineManage, 
                         &pkeyn->PKEYN_plineKeyHeader);                 /*  加入对应 key 键链表         */
    __PX_KEY_UNLOCK(pkeyn);                                             /*  解锁 key 键                 */
    
    return  (ERROR_NONE);
}
Пример #24
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);
}
Пример #25
0
/*********************************************************************************************************
** 函数名称: API_CanDevCreate
** 功能描述: 创建 can 设备
** 输 入  : pcName           设备名
**           pcanchan         通道
**           uiRdFrameSize    接收缓冲区大小
**           uiWrtFrameSize   发送缓冲区大小
** 输 出  : 是否成功
** 全局变量:
** 调用模块:
**                                            API 函数
*********************************************************************************************************/
LW_API
INT  API_CanDevCreate (PCHAR     pcName,
                       CAN_CHAN *pcanchan,
                       UINT      uiRdFrameSize,
                       UINT      uiWrtFrameSize)
{
    __PCAN_PORT   pcanport;
    INT           iTemp;

    if ((!pcName) || (!pcanchan)) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "parameter error.\r\n");
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }

    if ((uiRdFrameSize < 1) || (uiWrtFrameSize < 1)) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "parameter error.\r\n");
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }

    if ((!pcanchan->pDrvFuncs->callbackInstall) ||
            (!pcanchan->pDrvFuncs->txStartup)) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "parameter error.\r\n");
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }

    if (_G_iCanDrvNum <= 0) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "can Driver invalidate.\r\n");
        _ErrorHandle(ERROR_IO_NO_DRIVER);
        return  (PX_ERROR);
    }

    pcanport = (__PCAN_PORT)__SHEAP_ALLOC(sizeof(__CAN_PORT));
    if (!pcanport) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return  (PX_ERROR);
    }
    lib_bzero(pcanport, sizeof(__CAN_PORT));

    iTemp = __canDevInit(&pcanport->CANPORT_can,
                         uiRdFrameSize,
                         uiWrtFrameSize);                               /*  初始化设备控制块            */

    if (iTemp != ERROR_NONE) {
        __SHEAP_FREE(pcanport);
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return  (PX_ERROR);
    }

    __canFlushRd(pcanport);
    __canFlushWrt(pcanport);

    pcanport->CANPORT_pcanchan = pcanchan;

    pcanchan->pDrvFuncs->callbackInstall(pcanchan, CAN_CALLBACK_GET_TX_DATA,
                                         (CAN_CALLBACK)__canITx, (PVOID)pcanport);
    pcanchan->pDrvFuncs->callbackInstall(pcanchan, CAN_CALLBACK_PUT_RCV_DATA,
                                         (CAN_CALLBACK)__canIRx, (PVOID)pcanport);
    pcanchan->pDrvFuncs->callbackInstall(pcanchan, CAN_CALLBACK_PUT_BUS_STATE,
                                         (CAN_CALLBACK)__canSetBusState, (PVOID)pcanport);

    iTemp = (INT)iosDevAddEx(&pcanport->CANPORT_can.CAN_devhdr,
                             pcName,
                             _G_iCanDrvNum,
                             DT_CHR);
    if (iTemp) {
        __canDevDelete(&pcanport->CANPORT_can);
        __SHEAP_FREE(pcanport);
        _DebugHandle(__ERRORMESSAGE_LEVEL, "add device error.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return  (PX_ERROR);

    } else {
        return  (ERROR_NONE);
    }
}
Пример #26
0
/*********************************************************************************************************
** 函数名称: __untarFile
** 功能描述: unpackage a .tar file.
** 输 入  : pcTarFile     tar file
**           pcDestPath    destination directory
** 输 出  : 0 or -1
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static INT  __untarFile (CPCHAR  pcTarFile, CPCHAR  pcDestPath)
{
    INT     iFdTar;
    
    char    *pcBuf;
    ssize_t  sstN;
    char     cFname[100];
    char     cLinkname[100];
    int            iSum;
    int            iHdrChksum;
    int            iRetVal;
    unsigned long  ulI;
    unsigned long  ulNblocks;
    unsigned long  ulSize;
    unsigned char  ucLinkflag;
    
    ULONG          ulTotalFile = 0ul;
    ULONG          ulTotalDir  = 0ul;
    
    iFdTar = open(pcTarFile, O_RDONLY);
    if (iFdTar < 0) {
        fprintf(stderr, "can not open : %s : %s\n", pcTarFile, lib_strerror(errno));
        return  (PX_ERROR);
    }
    
    pcBuf = (char *)__SHEAP_ALLOC(512);
    if (pcBuf == LW_NULL) {
        close(iFdTar);
        fprintf(stderr, "system low memory.\n");
        return  (PX_ERROR);
    }
    
    iRetVal = ERROR_NONE;
    
    while (1) {
        char    cOutFile[PATH_MAX + 1];
        mode_t  mode;
        
        if ((sstN = read(iFdTar, pcBuf, 512)) != 512) {
            break;
        }
        
        if (lib_strncmp(&pcBuf[257], TMAGIC, 5)) {
            break;
        }
        
        lib_strlcpy(cFname, pcBuf, 100);

        ucLinkflag = pcBuf[156];
        ulSize     = __untarOctal2Long(&pcBuf[124], 12);
        
        iHdrChksum = (int)__untarOctal2Long(&pcBuf[148], 8);
        iSum       = __untarHeaderChksum(pcBuf);
        
        if (iSum != iHdrChksum) {
            fprintf(stderr, "tar file : %s chksum error.\n", pcTarFile);
            iRetVal = PX_ERROR;
            break;
        }
        
        mode = (int)__untarOctal2Long(&pcBuf[100], 8);
        
        if (pcDestPath) {
            if (lib_strcmp(pcDestPath, PX_STR_ROOT) == 0) {
                if (cFname[0] == PX_ROOT) {
                    lib_strlcpy(cOutFile, cFname, PATH_MAX + 1);
                } else {
                    snprintf(cOutFile, PATH_MAX + 1, "%s%s", pcDestPath, cFname);
                }
            } else {
                snprintf(cOutFile, PATH_MAX + 1, "%s/%s", pcDestPath, cFname);
            }
        } else {
            lib_strlcpy(cOutFile, cFname, PATH_MAX + 1);
        }
        
        if (ucLinkflag == SYMTYPE) {
            printf("unpackage %s <LNK> ...\n", cOutFile);
            lib_strlcpy(cLinkname, &pcBuf[157], 100);
            symlink(cLinkname, cOutFile);
            ulTotalFile++;
            
        } else if (ucLinkflag == REGTYPE) {
            INT     iFdOut;
            
            printf("unpackage %s size : %ld ...\n", cOutFile, ulSize);
            ulNblocks = (((ulSize) + 511) & ~511) / 512;
            if ((iFdOut = creat(cOutFile, mode)) < 0) {
                fprintf(stderr, "can not create : %s\n", cOutFile);
                lseek(iFdTar, (off_t)(ulNblocks * 512), SEEK_CUR);
                
            } else {
                for (ulI = 0; ulI < ulNblocks; ulI++) {
                    sstN = read(iFdTar, pcBuf, 512);
                    sstN = min(sstN, ulSize - (ulI * 512));
                    write(iFdOut, pcBuf, (size_t)sstN);
                }
                close(iFdOut);
                ulTotalFile++;
            }
            
        } else if (ucLinkflag == DIRTYPE) {
            printf("unpackage %s <DIR> ...\n", cOutFile);
            mkdir(cOutFile, mode);
            ulTotalDir++;
        }
    }
    
    __SHEAP_FREE(pcBuf);
    close(iFdTar);
    
    printf("unpackage total %lu files %lu directory.\n", ulTotalFile, ulTotalDir);

    return  (iRetVal);
}
Пример #27
0
/*********************************************************************************************************
** 函数名称: API_DiskRiad0Create
** 功能描述: 创建一个 RAID-0 类型磁盘阵列块设备
** 输 入  : pblkd[]           物理块设备列表
**           uiNDisks          物理磁盘数量 必须为 2, 4 块这两种选择其中之一
**           stStripe          磁盘条带字节数, 必须是扇区字节数的 2 的指数倍, 最少为 32KB
**                             例如 64K, 128K 等
**           ppblkDiskRaid     返回的 RAID 虚拟磁盘
** 输 出  : ERROR CODE
** 全局变量:
** 调用模块:
                                           API 函数
*********************************************************************************************************/
LW_API
ULONG  API_DiskRiad0Create (PLW_BLK_DEV  pblkd[],
                            UINT         uiNDisks,
                            size_t       stStripe,
                            PLW_BLK_DEV *ppblkDiskRaid)
{
    INT                 i;
    PLW_DISKRAID0_CB    pdiskr = LW_NULL;
    ULONG               ulBytesPerSector;
    ULONG               ulBytesPerBlock;
    ULONG               ulTotalSector;

    if (!pblkd || !ppblkDiskRaid ||
        ((uiNDisks != 2) && (uiNDisks != 4)) ||
        (stStripe < (32 * LW_CFG_KB_SIZE)) ||
        (stStripe & (stStripe - 1))) {
        _ErrorHandle(EINVAL);
        return  (EINVAL);
    }

    pdiskr = (PLW_DISKRAID0_CB)__SHEAP_ALLOC(sizeof(LW_DISKRAID0_CB));
    if (pdiskr == LW_NULL) {
        goto    __handle_errror;
    }

    pdiskr->DISKR_ppblkdDisk = (PLW_BLK_DEV *)__SHEAP_ALLOC(sizeof(PLW_BLK_DEV) * uiNDisks);
    if (pdiskr->DISKR_ppblkdDisk == LW_NULL) {
        goto    __handle_errror;
    }

    for (i = 0; i < uiNDisks; i++) {
        pdiskr->DISKR_ppblkdDisk[i] = pblkd[i];
        if (pblkd[i] == LW_NULL) {
            goto    __handle_errror;
        }
    }

    pdiskr->DISKR_uiNDisks = uiNDisks;

    if (uiNDisks == 2) {
        pdiskr->DISKR_uiDiskShift = 1;
        pdiskr->DISKR_uiDiskMask  = 0x01;
    } else {
        pdiskr->DISKR_uiDiskShift = 2;
        pdiskr->DISKR_uiDiskMask  = 0x03;
    }

    if (__diskRaidCheck(pblkd, uiNDisks,
                        &ulBytesPerSector,
                        &ulBytesPerBlock,
                        &ulTotalSector)) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "RAID-0 system block disk not EQU.\r\n");
        _ErrorHandle(ENOTSUP);
        return  (ENOTSUP);
    }

    for (i = 0; i < 16; i++) {
        if (stStripe == (ulBytesPerSector << i)) {
            break;
        }
    }

    if (i >= 16) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "RAID-0 system stripe size error.\r\n");
        _ErrorHandle(ENOTSUP);
        return  (ENOTSUP);
    }

    pdiskr->DISKR_uiStripeShift = i;
    pdiskr->DISKR_uiStripeMask  = (1 << i) - 1;

    pdiskr->DISKR_blkdRaid.BLKD_pcName            = "RAID-0";
    pdiskr->DISKR_blkdRaid.BLKD_pfuncBlkRd        = __raid0DevRd;
    pdiskr->DISKR_blkdRaid.BLKD_pfuncBlkWrt       = __raid0DevWrt;
    pdiskr->DISKR_blkdRaid.BLKD_pfuncBlkIoctl     = __raid0DevIoctl;
    pdiskr->DISKR_blkdRaid.BLKD_pfuncBlkReset     = __raid0DevReset;
    pdiskr->DISKR_blkdRaid.BLKD_pfuncBlkStatusChk = __raid0DevStatusChk;

    pdiskr->DISKR_blkdRaid.BLKD_ulNSector        = ulTotalSector * uiNDisks;
    pdiskr->DISKR_blkdRaid.BLKD_ulBytesPerSector = ulBytesPerSector;
    pdiskr->DISKR_blkdRaid.BLKD_ulBytesPerBlock  = ulBytesPerBlock;

    pdiskr->DISKR_blkdRaid.BLKD_bRemovable  = pblkd[0]->BLKD_bRemovable;
    pdiskr->DISKR_blkdRaid.BLKD_bDiskChange = LW_FALSE;
    pdiskr->DISKR_blkdRaid.BLKD_iRetry      = pblkd[0]->BLKD_iRetry;
    pdiskr->DISKR_blkdRaid.BLKD_iFlag       = pblkd[0]->BLKD_iFlag;

    pdiskr->DISKR_blkdRaid.BLKD_iLogic        = LW_FALSE;
    pdiskr->DISKR_blkdRaid.BLKD_uiLinkCounter = 0;
    pdiskr->DISKR_blkdRaid.BLKD_pvLink        = LW_NULL;

    pdiskr->DISKR_blkdRaid.BLKD_uiPowerCounter = 0;
    pdiskr->DISKR_blkdRaid.BLKD_uiInitCounter  = 0;

    *ppblkDiskRaid = (PLW_BLK_DEV)pdiskr;

    _DebugHandle(__LOGMESSAGE_LEVEL, "RAID-0 system has been create.\r\n");
    return  (ERROR_NONE);

__handle_errror:
    if (pdiskr) {
        __SHEAP_FREE(pdiskr);
    }
    _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
    _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
    return  (ERROR_SYSTEM_LOW_MEMORY);
}
Пример #28
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);
}
Пример #29
0
/*********************************************************************************************************
** 函数名称: __tshellRoute
** 功能描述: 系统命令 "route"
** 输 入  : iArgC         参数个数
**           ppcArgV       参数表
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
INT  __tshellRoute (INT  iArgC, PCHAR  *ppcArgV)
{
#define LW_RT_PRINT_SIZE        74

    INT         iError;
    FUNCPTR     pfuncAddOrChange;
    PCHAR       pcOpAddorChange;

    UINT        uiFlag = 0;
    ip_addr_t   ipaddr;
    CHAR        cNetifName[IF_NAMESIZE];

    if (iArgC == 1) {
        PCHAR   pcBuffer;
        size_t  stSize;
        size_t  stOffset;
        UINT    uiNumEntries;

        uiNumEntries = (UINT)__rtSafeRun((FUNCPTR)__rtEntryMaxNum, 0, 0, 0, 0, 0, 0);
        if (uiNumEntries == 0) {
            printf("no route entry.\n");
            return  (ERROR_NONE);
        }

        /*
         *  在 net safe 状态下不允许调用 printf 等使用 IO 的语句. 所以只能打印到缓冲区中,
         *  然后统一使用 IO 打印.
         */
        stSize   = LW_RT_PRINT_SIZE * uiNumEntries;
        pcBuffer = (PCHAR)__SHEAP_ALLOC(stSize);
        if (pcBuffer == LW_NULL) {
            fprintf(stderr, "system low memory.\n");
            return  (PX_ERROR);
        }

        /*
         *  打印 kernel route entry
         */
        stOffset = 0;
        printf("kernel routing tables\n");
        printf("Destination        Gateway            Mask               Flag     Interface\n");
        __rtSafeRun((FUNCPTR)__rtTraversal, (void *)__rtEntryPrint,
                    pcBuffer, (PVOID)stSize, &stOffset, 0, 0);
        if (stOffset > 0) {
            fwrite(pcBuffer, stOffset, 1, stdout);
            fflush(stdout);                                             /*  这里必须确保输出完成        */
        }
        
        /*
         *  打印 lwip build-in route entry
         */
        stOffset = 0;
        printf("\nbuild-in routing tables\n");
        printf("Destination        Gateway            Mask               Flag     Interface\n");
        __rtSafeRun((FUNCPTR)__buildinRtPrint,
                    pcBuffer, (PVOID)stSize, &stOffset, 0, 0, 0);
        if (stOffset > 0) {
            fwrite(pcBuffer, stOffset, 1, stdout);
            fflush(stdout);                                             /*  这里必须确保输出完成        */
        }

        __SHEAP_FREE(pcBuffer);

        return  (ERROR_NONE);
        
    } else {                                                            /*  操作路由表                  */
        if (lib_strcmp(ppcArgV[1], "add") == 0) {
            pfuncAddOrChange = __rtAdd;
            pcOpAddorChange  = "add";

        } else if (lib_strcmp(ppcArgV[1], "change") == 0) {
            pfuncAddOrChange = __rtChange;
            pcOpAddorChange  = "change";

        } else {
            pfuncAddOrChange = LW_NULL;
        }

        if (pfuncAddOrChange && (iArgC == 6)) {                         /*  添加或者修改路由表          */
            if (!ipaddr_aton(ppcArgV[3], &ipaddr)) {
                fprintf(stderr, "inet address format error.\n");
                goto    __error_handle;
            }

            if (lib_strcmp(ppcArgV[4], "if") == 0) {                    /*  使用 ifindex 查询网卡       */
                INT   iIndex = lib_atoi(ppcArgV[5]);
                if (if_indextoname(iIndex, cNetifName) == LW_NULL) {
                    fprintf(stderr, "can not find net interface with ifindex %d.\n", iIndex);
                    goto    __error_handle;
                }

            } else if (lib_strcmp(ppcArgV[4], "dev") == 0) {
                lib_strlcpy(cNetifName, ppcArgV[5], IF_NAMESIZE);

            } else {
                fprintf(stderr, "net interface argument error.\n");
                goto    __error_handle;
            }

            if (lib_strcmp(ppcArgV[2], "-host") == 0) {                 /*  主机路由                    */
                uiFlag |= LW_RT_FLAG_H;

            } else if (lib_strcmp(ppcArgV[2], "-gw") == 0) {            /*  设置网卡网关                */
                uiFlag |= LW_RT_GW_FLAG_SET;
                pfuncAddOrChange = __rtSetGw;

            } else if (lib_strcmp(ppcArgV[2], "-net") != 0) {           /*  非网络路由                  */
                fprintf(stderr, "route add must determine -host or -net.\n");
                goto    __error_handle;
            }

            iError = pfuncAddOrChange(&ipaddr, uiFlag, cNetifName);     /*  操作路由表                  */
            if (iError >= 0) {
                printf("route %s %s successful.\n", ppcArgV[3], pcOpAddorChange);
                return  (ERROR_NONE);
            }
        
        } else if (pfuncAddOrChange && (iArgC == 5)) {                  /*  设置默认网关                */
            if (lib_strcmp(ppcArgV[2], "default") != 0) {
                goto    __error_handle;
            }
            
            if (lib_strcmp(ppcArgV[3], "if") == 0) {                    /*  使用 ifindex 查询网卡       */
                INT   iIndex = lib_atoi(ppcArgV[4]);
                if (if_indextoname(iIndex, cNetifName) == LW_NULL) {
                    fprintf(stderr, "can not find net interface with ifindex %d.\n", iIndex);
                    goto    __error_handle;
                }

            } else if (lib_strcmp(ppcArgV[3], "dev") == 0) {
                lib_strlcpy(cNetifName, ppcArgV[4], IF_NAMESIZE);

            } else {
                fprintf(stderr, "net interface argument error.\n");
                goto    __error_handle;
            }
            
            uiFlag |= LW_RT_GW_FLAG_DEFAULT;
            pfuncAddOrChange = __rtSetGw;
            
            iError = pfuncAddOrChange(&ipaddr, uiFlag, cNetifName);     /*  设置默认路由出口            */
            if (iError >= 0) {
                printf("default device set successful.\n");
                return  (ERROR_NONE);
            }

        } else if ((lib_strcmp(ppcArgV[1], "del") == 0) && iArgC == 3) {/*  删除一个路由表项            */
            if (!ipaddr_aton(ppcArgV[2], &ipaddr)) {
                fprintf(stderr, "inet address format error.\n");
                goto    __error_handle;
            }

            iError = __rtDel(&ipaddr);
            if (iError >= 0) {
                printf("route %s delete successful.\n", ppcArgV[2]);
                return  (ERROR_NONE);
            }
        }
    }
    
__error_handle:
    fprintf(stderr, "argments error!\n");
    return  (-ERROR_TSHELL_EPARAM);
}