⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unixio.c

📁 gumstiz u-boot loader in linux
💻 C
字号:
/******************************************************************************                   SciTech OS Portability Manager Library**  ========================================================================**    The contents of this file are subject to the SciTech MGL Public*    License Version 1.0 (the "License"); you may not use this file*    except in compliance with the License. You may obtain a copy of*    the License at http://www.scitechsoft.com/mgl-license.txt**    Software distributed under the License is distributed on an*    "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or*    implied. See the License for the specific language governing*    rights and limitations under the License.**    The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.**    The Initial Developer of the Original Code is SciTech Software, Inc.*    All Rights Reserved.**  ========================================================================** Language:     ANSI C* Environment:  Any** Description:  Module containing Unix I/O functions.*****************************************************************************/#include "pmapi.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <unistd.h>#include <dirent.h>/*----------------------------- Implementation ----------------------------*//* {secret} */typedef struct {    DIR     *d;    char    path[PM_MAX_PATH];    char    mask[PM_MAX_PATH];    } PM_findHandle;/****************************************************************************REMARKS:Internal function to convert the find data to the generic interface.****************************************************************************/static void convertFindData(    PM_findData *findData,    struct dirent *blk,    const char *path){    ulong       dwSize = findData->dwSize;    struct stat st;    char        filename[PM_MAX_PATH];    memset(findData,0,findData->dwSize);    findData->dwSize = dwSize;    strcpy(filename,path);    PM_backslash(filename);    strcat(filename,blk->d_name);    stat(filename,&st);    if (!(st.st_mode & S_IWRITE))	findData->attrib |= PM_FILE_READONLY;    if (st.st_mode & S_IFDIR)	findData->attrib |= PM_FILE_DIRECTORY;    findData->sizeLo = st.st_size;    findData->sizeHi = 0;    strncpy(findData->name,blk->d_name,PM_MAX_PATH);    findData->name[PM_MAX_PATH-1] = 0;}/****************************************************************************REMARKS:Determines if a file name matches the passed in pattern.****************************************************************************/static ibool filematch(    char *pattern,    char *dirpath,    struct dirent *dire){    struct stat st;    int         i = 0,j = 0,lastchar = '\0';    char        fullpath[PM_MAX_PATH];    strcpy(fullpath,dirpath);    PM_backslash(fullpath);    strcat(fullpath, dire->d_name);    if (stat(fullpath, &st) != 0)	return false;    for (; i < (int)strlen(dire->d_name) && j < (int)strlen(pattern); i++, j++) {	if (pattern[j] == '*' && lastchar != '\\') {	    if (pattern[j+1] == '\0')		return true;	    while (dire->d_name[i++] != pattern[j+1]) {		if (dire->d_name[i] == '\0')		    return false;		}	    i -= 2;	    }	else if (dire->d_name[i] != pattern[j] &&		!(pattern[j] == '?' && lastchar != '\\'))	    return false;	lastchar = pattern[i];	}    if (j == (int)strlen(pattern) && i == (int)strlen(dire->d_name))	return true;    return false;}/****************************************************************************REMARKS:Function to find the first file matching a search criteria in a directory.****************************************************************************/void * PMAPI PM_findFirstFile(    const char *filename,    PM_findData *findData){    PM_findHandle   *d;    struct dirent   *dire;    char            name[PM_MAX_PATH];    char            ext[PM_MAX_PATH];    if ((d = PM_malloc(sizeof(*d))) == NULL)	return PM_FILE_INVALID;    PM_splitpath(filename,NULL,d->path,name,ext);    strcpy(d->mask,name);    strcat(d->mask,ext);    if (strlen(d->path) == 0)	strcpy(d->path, ".");    if (d->path[strlen(d->path)-1] == '/')	d->path[strlen(d->path)-1] = 0;    if ((d->d = opendir(d->path)) != NULL) {	while ((dire = readdir(d->d)) != NULL) {	    if (filematch(d->mask,d->path,dire)) {		convertFindData(findData,dire,d->path);		return d;		}	    }	closedir(d->d);	}    PM_free(d);    return PM_FILE_INVALID;}/****************************************************************************REMARKS:Function to find the next file matching a search criteria in a directory.****************************************************************************/ibool PMAPI PM_findNextFile(    void *handle,    PM_findData *findData){    PM_findHandle   *d = handle;    struct dirent   *dire;    while ((dire = readdir(d->d)) != NULL) {	if (filematch(d->mask,d->path,dire)) {	    convertFindData(findData,dire,d->path);	    return true;	    }	}    return false;}/****************************************************************************REMARKS:Function to close the find process****************************************************************************/void PMAPI PM_findClose(    void *handle){    PM_findHandle   *d = handle;    closedir(d->d);    free(d);}/****************************************************************************REMARKS:Function to determine if a drive is a valid drive or not. Under Unix thisfunction will return false for anything except a value of 3 (consideredthe root drive, and equivalent to C: for non-Unix systems). The drivenumbering is:    1   - Drive A:    2   - Drive B:    3   - Drive C:    etc****************************************************************************/ibool PMAPI PM_driveValid(    char drive){    if (drive == 3)	return true;    return false;}/****************************************************************************REMARKS:Function to get the current working directory for the specififed drive.Under Unix this will always return the current working directory regardlessof what the value of 'drive' is.****************************************************************************/void PMAPI PM_getdcwd(    int drive,    char *dir,    int len){    (void)drive;    getcwd(dir,len);}/****************************************************************************REMARKS:Function to change the file attributes for a specific file.****************************************************************************/void PMAPI PM_setFileAttr(    const char *filename,    uint attrib){    struct stat st;    mode_t      mode;    stat(filename,&st);    mode = st.st_mode;    if (attrib & PM_FILE_READONLY)	mode &= ~S_IWRITE;    else	mode |= S_IWRITE;    chmod(filename,mode);}/****************************************************************************REMARKS:Function to get the file attributes for a specific file.****************************************************************************/uint PMAPI PM_getFileAttr(    const char *filename){    struct stat st;    stat(filename,&st);    if (st.st_mode & S_IWRITE)	return 0;    return PM_FILE_READONLY;}/****************************************************************************REMARKS:Function to create a directory.****************************************************************************/ibool PMAPI PM_mkdir(    const char *filename){    return mkdir(filename,0x1FF) == 0;}/****************************************************************************REMARKS:Function to remove a directory.****************************************************************************/ibool PMAPI PM_rmdir(    const char *filename){    return rmdir(filename) == 0;}/****************************************************************************REMARKS:Function to get the file time and date for a specific file.****************************************************************************/ibool PMAPI PM_getFileTime(    const char *filename,    ibool gmTime,    PM_time *time){    /* TODO: Implement this! */    (void)filename;    (void)gmTime;    (void)time;    PM_fatalError("PM_getFileTime not implemented yet!");    return false;}/****************************************************************************REMARKS:Function to set the file time and date for a specific file.****************************************************************************/ibool PMAPI PM_setFileTime(    const char *filename,    ibool gmTime,    PM_time *time){    /* TODO: Implement this! */    (void)filename;    (void)gmTime;    (void)time;    PM_fatalError("PM_setFileTime not implemented yet!");    return false;}

⌨️ 快捷键说明

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