亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? core.c

?? MMI層OBJ不能完全編譯
?? C
?? 第 1 頁 / 共 5 頁
字號:
/******************************************************************************
 * Flash File System (ffs)
 * Idea, design and coding by Mads Meisner-Jensen, mmj@ti.com
 *
 * FFS core functions (not public)
 *
 * $Id: core.c 1.156.1.13.1.1.1.50 Thu, 08 Jan 2004 15:05:23 +0100 tsj $
 *
 ******************************************************************************/

#ifndef TARGET
#include "ffs.cfg"
#endif

#include <string.h>
#include "ffs/ffs.h"
#include "ffs/board/core.h"
#include "ffs/board/drv.h"
#include "ffs/board/ffstrace.h"
#include "ffs/board/tmffs.h"
#include <string.h>
#include <limits.h>

#if (TARGET == 0)
#include "ffs/board/tffs.h"
#endif

#include "swconfig.cfg"

/******************************************************************************
 * Globals
 ******************************************************************************/

struct fs_s         fs;
struct block_stat_s bstat[FFS_BLOCKS_MAX];

struct ffs_stats_s stats;

// The following line is automatically expanded by the revision control
// system to make a unique ffs revision. The revision can be retrieved by
// ffs_query().

//$Format: "static const uint16 ffs_revision = ($ProjectMajorVersion$<<12)|(0x$ProjectMinorVersion$);"$
static const uint16 ffs_revision = (5<<12)|(0x60);


/******************************************************************************
 * Main Functions
 ******************************************************************************/

// Create a new ffs object (object type is undefined)
iref_t object_create(const char *name, const char *buf, int size, iref_t dir)
{
    iref_t i;
    int realsize, namelength;
    offset_t offset;
    char *dataaddr;
    char is_journal;
    char name_copy[FFS_FILENAME_MAX + 1]; // NOTEME: make dynamic?

    ttw(ttr(TTrObj, "ocr(%s){" NL, name));
    tw(tr(TR_BEGIN, TrObject, "object_create('%s', ?, %d, %d) {\n",
       name, size, dir));

    POWERFAIL_DOMAIN_BEGIN(PFM_CHUNK);

    // NOTEME: special case just for format()!?
    if (dir == 0)
        namelength = ffs_strlen(name);
    else
        namelength = is_filename(name);

    if (namelength < 0) {
        tw(tr(TR_END, TrObject, "} %d\n", namelength));
        ttw(ttr(TTrObj, "} %d" NL, namelength));
        return namelength;
    }

    is_journal = (name[0] == '.' && ffs_strcmp(name, FFS_JOURNAL_NAME) == 0);
    if (is_journal)
        tw(tr(TR_FUNC, TrObject, "Journal file creation!\n"));
    else    
        if (buf == NULL && size > 0) {
            tw(tr(TR_END, TrObject, "} %d\n", EFFS_INVALID));
            ttw(ttr(TTrObj, "} %d" NL, EFFS_INVALID));
            return EFFS_INVALID;
        }
    
    // We don't write the data null_terminator if no data exists
    realsize = namelength + 1 + size + (size > 0 ? 1 : 0);
    fs.journal_ram.size = realsize = atomalign(realsize);

    // We save the diri in the ram journal because this will be updated if
    // chunk_alloc trigger a data_reclaim
    fs.journal.diri = dir;

    // We have to make a local copy of name because name can be destroyed if
    // it points into an object that is relocated by an ffs_data_reclaim.
    memcpy(name_copy, name, ffs_strlen(name) + 1);

    if ((i = chunk_alloc(realsize, is_journal, &offset)) < 0)
        return i;

    POWERFAIL_SET_ADDR((uint32)addr2name(offset2addr(offset)));
    
    // Write filename including null-terminator
    ffsdrv.write(addr2name(offset2addr(offset)), name_copy, namelength + 1);

    // Write data and null terminator.  We null-terminate the data block,
    // such that blocks_fsck() can determine the amount of used data block
    // space correctly. Note that we don't write null-terminator for objects
    // with no data, e.g. empty files and directories.
    if (size > 0) {
        dataaddr = addr2name(offset2addr(offset)) + namelength + 1;
        // Do NOT write data if we are creating the journal file --- it must
        // be created as empty!
#if (LINEAR_FILE_SYSTEM)
        if (!is_journal && (unsigned long)(buf) != 0xFFFFFFFFUL)
            ffsdrv.write(dataaddr, buf, size);
#else
        if (!is_journal)
            ffsdrv.write(dataaddr, buf, size);
#endif
        ffsdrv_write_byte(dataaddr + size, 0);
    }

    // Insert object in parent directory if this is not the root dir
    if (dir != 0)
        fs.journal.diri = dir_traverse(fs.journal.diri, 0);
    else
        fs.journal.diri = 0;

    POWERFAIL_DOMAIN_END();

    tw(tr(TR_END, TrObject, "} %d\n", i));
    ttw(ttr(TTrObj, "} %d" NL,i));

    return i;
}

int file_read(const char *name, void *addr, int size)
{
    int size_read, object_size, total_read = 0;
    iref_t i, dir;
    char *not_used;
    fd_t fdi;

    if (size < 0)
        return EFFS_INVALID;

    if ((i = object_lookup(name, &not_used, &dir)) < 0)
        return i;

    if ((fdi = get_fdi(i)) >= 0) 
        if (is_open_option(fs.fd[fdi].options, FFS_O_WRONLY))
            return EFFS_LOCKED;

    object_size = object_datasize(i);

    do {
        size_read = segment_read(i, (char*)addr + total_read, 
                                     size - total_read, 0);
        total_read += size_read;
    } while ((i = segment_next(i)) != 0 && size > total_read);

    // Did we read the comlete object?
    if (object_size > size)
        return EFFS_FILETOOBIG;

	return total_read;     // number of bytes read  
}


int stream_read(fd_t fdi, void *src, int size)
{
    int offset, size_read = 0, copied = 0;
    iref_t i;
    
    if (!is_fd_valid(fdi)) 
        return EFFS_BADFD;
    
    if (!is_open_option(fs.fd[fdi].options, FFS_O_RDONLY)) 
        return EFFS_INVALID;  
   
    if (src == NULL || size < 0)
        return EFFS_INVALID;
  
    // NOTEME: do this in another way?
    // No data to read because fp is ad eof.
    if (fs.fd[fdi].fp >= fs.fd[fdi].size) { 
        tw(tr(TR_FUNC, TrObject, "eof(no data read)\n"));
        return 0;       
    }

#if (FFS_SEEK_OPT == 1)
    i =fs.fd[fdi].rch;
    offset = fs.fd[fdi].roffset;
#else
    segfile_seek(fs.fd[fdi].seghead, fs.fd[fdi].fp, &i, &offset);
#endif

    // Read data from chunks or buffer until all data is read or eof is reach.
    do {
        if (is_offset_in_buf(fs.fd[fdi].fp, fdi)) {
            offset = fs.fd[fdi].fp - fs.fd[fdi].wfp;
            size_read = size - copied;    // requested data that is left
            // Saturate size to max left in buf or max left to eof
            if (size_read > (fs.chunk_size_max - offset))  
                size_read = fs.chunk_size_max - offset; 
            if (size_read > (fs.fd[fdi].size - fs.fd[fdi].fp))   
                size_read = fs.fd[fdi].size - fs.fd[fdi].fp;    

            memcpy((char*)src + copied, fs.fd[fdi].buf + offset, size_read);
        }
        else {
#if (FFS_READ_CACHE_ENBALE == 1)
            size_read = segment_read_cache(fdi, i, (char*)src+copied, size-copied, offset);
 
#else
            // Data is only in the chunk
            size_read = segment_read(i, (char*) src + copied, 
                                         size - copied, offset);
#endif
#if (FFS_SEEK_OPT == 1)
         /* record the current chunk & offset */
 		 fs.fd[fdi].rch = i;
 		 fs.fd[fdi].roffset = (offset+size_read);
#endif
        }

        offset = 0;
        fs.fd[fdi].fp += size_read;
        copied += size_read;

        if ((i = segment_next(i)) < 0)
            return i;

    } while (copied != size && fs.fd[fdi].fp < fs.fd[fdi].size);

    if (copied == size) {   
        tw(tr(TR_FUNC, TrObject, "All requested data has been read\n"));
    }
    if (fs.fd[fdi].fp >= fs.fd[fdi].size) { 
        tw(tr(TR_FUNC, TrObject, "eof\n"));
    }

    return copied;     // number of bytes read  
}


int object_read(const char *name, char *buf, int size, int linkflag)
{
    iref_t i;
    struct inode_s *ip;
    struct xstat_s stat;
    char *p;

    tw(tr(TR_BEGIN, TrObject, "object_read('%s', 0x%x, %d, %d) {\n",
       name, buf, size, linkflag));

    if (buf == NULL || size < 0) {
     tw(tr(TR_END, TrObject, "} %d\n", EFFS_INVALID));
     return EFFS_INVALID;
    }

    i = object_stat(name, &stat, linkflag, 0, 0);
    if (i < 0) {
        tw(tr(TR_END, TrObject, "} %d\n", EFFS_NOTFOUND));
        return i;
    }

    ip = inode_addr(i);
    
    if (stat.size > size) {
        tw(tr(TR_END, TrObject, "} %d\n", EFFS_FILETOOBIG));
        return EFFS_FILETOOBIG;
    }
    
    // return error if called as readlink() and object is not a link
    if (!is_object(ip, OTE_LINK) && linkflag) {
        tw(tr(TR_END, TrObject, "} %d\n", EFFS_INVALID));
        return EFFS_INVALID;
    }

    // Even though the ffs architecture allows to have data in directory
    // objects, we don't want to complicate matters, so we return an error
    if (is_object(ip, OTE_DIR) && !(fs.flags & FS_DIR_DATA)) {
        tw(tr(TR_END, TrObject, "} %d\n", EFFS_NOTAFILE));
        return EFFS_NOTAFILE;
    }

    p = offset2addr(location2offset(ip->location));
    size = stat.size;

    p = addr2data(p, ip);

    // Copy data. NOTEME: Should be optimized!
    while (size--)
        *buf++ = *p++;

    tw(tr(TR_END, TrObject, "} %d\n", stat.size));
    return stat.size;
}


// Convert an object data addres to pure data address
char *addr2data(const char *addr, const struct inode_s *ip)
{
    // OT_SEGMENT is pure data so it do not have any name to skip
    if (!is_object(ip, OTE_SEGMENT)) {            
        while (*addr++)
            ;
    }

    return (char *) addr;
}

// Calculate exact size of file data; without filename and null terminator
// and without data null terminator and succeeding alignment padding.
// NOTEME: Does this also work for empty files and directories?
int object_datasize(iref_t i)
{
    iref_t not_used;
    return segfile_seek(i, INT_MAX, &not_used, 0);
}

iref_t object_stat(const char *name, struct xstat_s *stat,
                       int linkflag, int fdi, int extended)
{
    iref_t i;
    fd_t other_fdi;
    struct inode_s *ip;
    
    tw(tr(TR_BEGIN, TrObject, "object_stat('%s', ?, %x, %d, %d) {\n", 
          name, linkflag, fdi, extended));
    
    if (stat == NULL) {
        tw(tr(TR_END, TrObject, "} %d\n", EFFS_INVALID));
        return EFFS_INVALID;
    }
    
    if (linkflag)
        i = object_lookup_once(name, 0, 0);
    else if (name == 0) {
        fdi -= FFS_FD_OFFSET;
        if (!is_fd_valid(fdi)) {
            tw(tr(TR_END, TrObject, "} %d\n", EFFS_BADFD));
            return EFFS_BADFD;
        }
        i = fs.fd[fdi].seghead;
    }
    else
        i = object_lookup(name, 0, 0);

    if (i > 0) {
        ip = inode_addr(i);

        switch (ip->flags & OT_MASK) {
        case OTE_FILE:    stat->type = OT_FILE; break;
        case OTE_SEGMENT: stat->type = OT_SEGMENT; break;
        case OTE_DIR:     stat->type = OT_DIR; break;
        case OTE_LINK:    stat->type = OT_LINK; break;
        default: stat->type = ip->flags & OT_MASK;
        }

        switch (~ip->flags & 0x1) {
        case OFE_READONLY: stat->flags = OF_READONLY; break;
        default: stat->flags = ~ip->flags & 0x1;
        }

        stat->inode = i;

        // If the file is open so get the size from the file descriptor
        if ((other_fdi = get_fdi(i)) >= 0) {
            if (i == fs.fd[other_fdi].seghead) {
                stat->size = fs.fd[other_fdi].size;
            }
        }
                
        else
            stat->size = object_datasize(i);
                
        if (extended) {
            stat->location = ip->location;
            stat->block = offset2block(location2offset(stat->location));
            stat->space = ip->size;
            while ((i = segment_next(i)) > 0) {
                ip = inode_addr(i);
                stat->space += ip->size;
            }
            stat->reserved = 0;
            stat->sequence = ip->sequence;
            stat->updates = ip->updates;
        }
    }    

    tw(tr(TR_END, TrObject, "} %d\n", i));

    return i;
}


/******************************************************************************
 * Remove and Rename
 ******************************************************************************/

// Delete a ffs object
effs_t object_remove(iref_t i)
{
    struct inode_s *ip = inode_addr(i);
    iref_t entries;

    tw(tr(TR_BEGIN, TrObject, "object_remove(%d) {\n", i));

    // if object is a dir, ensure it is empty
    if (is_object(ip, OTE_DIR)) {
        dir_traverse(-i, &entries);
        if (entries) {
            tw(tr(TR_END, TrObject, "} %d\n", EFFS_DIRNOTEMPTY));
            return EFFS_DIRNOTEMPTY;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲大片一区二区三区| 亚洲一区二区三区爽爽爽爽爽 | 在线观看91视频| 亚洲aaa精品| 国产精品国产三级国产aⅴ无密码| 日本国产一区二区| 国产**成人网毛片九色| 日本怡春院一区二区| 亚洲私人黄色宅男| 久久久久久久久97黄色工厂| 欧美日韩在线三区| 99re热视频这里只精品| 国产成人精品亚洲777人妖| 五月天久久比比资源色| 亚洲另类中文字| 国产亚洲成aⅴ人片在线观看| 7777精品伊人久久久大香线蕉的| 一本大道av伊人久久综合| 国产毛片精品视频| 久久成人久久爱| 免费在线成人网| 天天影视网天天综合色在线播放| 亚洲自拍偷拍图区| 亚洲蜜臀av乱码久久精品蜜桃| 日本一区二区三区dvd视频在线 | 国产精品成人免费| 久久午夜羞羞影院免费观看| 欧美丰满高潮xxxx喷水动漫| 欧美影视一区二区三区| 一本到一区二区三区| 99热精品一区二区| 成人高清视频免费观看| 国产成人免费网站| 成人综合婷婷国产精品久久蜜臀 | 成人激情免费网站| 国产精品456露脸| 国产一区二区中文字幕| 韩国女主播成人在线| 久久99精品国产.久久久久久| 麻豆精品新av中文字幕| 九色|91porny| 国产成人aaa| www.欧美.com| 91小视频在线免费看| 91麻豆文化传媒在线观看| 99re66热这里只有精品3直播 | 精品噜噜噜噜久久久久久久久试看 | 9191精品国产综合久久久久久| 欧美在线视频日韩| 欧美日韩一区 二区 三区 久久精品| 在线观看国产精品网站| 欧美亚日韩国产aⅴ精品中极品| 日本高清成人免费播放| 欧美日韩高清一区二区不卡| 欧美三级资源在线| 91精品久久久久久久99蜜桃| 日韩精品一区二区三区中文不卡 | 裸体一区二区三区| 国产尤物一区二区在线| 福利电影一区二区| 一本到不卡精品视频在线观看| 91国偷自产一区二区使用方法| 欧美色爱综合网| 日韩欧美久久一区| 日本一区二区三区久久久久久久久不| 国产精品久线在线观看| 亚洲小说春色综合另类电影| 麻豆高清免费国产一区| 色88888久久久久久影院野外| 欧美日韩国产综合一区二区三区 | 久久99国产精品久久99果冻传媒| 国产一区二区三区不卡在线观看| 白白色亚洲国产精品| 欧美日韩亚洲国产综合| 久久午夜电影网| 欧美日韩1区2区| 亚洲日本va午夜在线影院| 精品国产一区二区三区忘忧草| 久久久蜜桃精品| 亚洲精品乱码久久久久久黑人| 亚洲一区二区在线免费观看视频| 美女一区二区久久| 色先锋aa成人| 精品成人一区二区三区| 亚洲少妇屁股交4| 久久99国内精品| 日本韩国精品在线| 久久精品免费在线观看| 亚洲国产精品视频| 国产91清纯白嫩初高中在线观看| 欧美在线免费视屏| 欧美国产精品一区| 日韩综合小视频| 91免费版pro下载短视频| 精品日韩99亚洲| 亚洲综合丝袜美腿| 成人国产视频在线观看| 日韩欧美一区电影| 一区二区三区中文字幕| 国产一区二区久久| 538prom精品视频线放| 国产精品女人毛片| 精品一区二区三区免费播放| 在线观看日韩毛片| 中文字幕第一区二区| 日产国产高清一区二区三区| 一本久久综合亚洲鲁鲁五月天 | 久久精品人人做人人爽97| 爽爽淫人综合网网站| 91色九色蝌蚪| 国产精品久久久久影院色老大| 久久精品国产一区二区| 欧美日韩精品三区| 亚洲国产综合人成综合网站| av中文字幕不卡| 亚洲国产岛国毛片在线| 精品一区二区三区在线观看国产| 欧美丰满美乳xxx高潮www| 亚洲自拍欧美精品| 色婷婷国产精品综合在线观看| 国产精品成人一区二区三区夜夜夜| 国产乱理伦片在线观看夜一区| 91精品国产综合久久婷婷香蕉 | 国产精品成人免费精品自在线观看| 精品无码三级在线观看视频| 欧美精品一级二级三级| 亚洲一区二区三区在线看| 91久久精品网| 亚洲精品国产成人久久av盗摄| 99久久精品国产导航| 日韩毛片精品高清免费| av男人天堂一区| 亚洲欧美偷拍另类a∨色屁股| aaa欧美日韩| 亚洲人一二三区| 在线精品国精品国产尤物884a | 国产在线一区二区| 精品久久久久av影院| 久久国产精品色婷婷| 欧美大肚乱孕交hd孕妇| 久久99精品视频| 国产亚洲一二三区| 成人禁用看黄a在线| 国产精品国产三级国产专播品爱网| 不卡av在线免费观看| 亚洲丝袜自拍清纯另类| 91福利精品视频| 日韩成人av影视| 欧美精品一区男女天堂| 国产精品一品二品| 亚洲日本韩国一区| 欧美男女性生活在线直播观看| 午夜激情综合网| 日韩精品一区二区在线| 国产一区欧美一区| 国产精品美女一区二区三区| 一本色道久久综合亚洲91| 亚洲大片在线观看| 欧美精品一区二区三区一线天视频| 国产高清在线精品| 亚洲视频在线一区观看| 欧美视频中文字幕| 久久成人免费日本黄色| 欧美国产一区二区| 欧美亚洲高清一区| 精品一二三四区| 国产精品久久看| 欧美乱妇一区二区三区不卡视频| 蜜桃av一区二区| 日本一区二区电影| 欧美三级电影一区| 国产九色sp调教91| 一区二区三区电影在线播| 日韩一区二区三免费高清| 成人黄色综合网站| 午夜不卡在线视频| 国产精品人妖ts系列视频| 欧美日韩三级一区二区| 国产精品一卡二| 亚洲国产一区二区在线播放| 亚洲精品一区二区三区在线观看| 91一区二区在线观看| 久久国产人妖系列| 亚洲综合一区二区三区| 国产亚洲精品免费| 欧美午夜电影一区| 国产91精品一区二区麻豆网站| 亚洲国产一区二区a毛片| 久久精品在线观看| 欧美精选一区二区| aaa亚洲精品一二三区| 另类综合日韩欧美亚洲| 亚洲一区二区偷拍精品| 欧美激情一区三区| 日韩美女视频在线| 欧美日韩综合一区| 成人动漫视频在线| 国产精品影音先锋| 青青草精品视频| 亚洲午夜羞羞片|