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

📄 target.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/**********************************************************
 *
 * This is an auto-generated file. Do NOT edit!
 *
 **********************************************************/


/******************************************************************************
 * Flash File System (ffs)
 * Idea, design and coding by Mads Meisner-Jensen, mmj@ti.com
 *
 * ffs public API functions
 *
 * $Id: target.c,v 1.1.1.1 2004/06/19 06:00:30 root Exp $
 *
f ******************************************************************************/

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

#if (TARGET == 1)
#include "task.h"
#else
#include <stdlib.h>
#endif

#include <string.h>
#include <limits.h>

#include "ffs.h"
#include "core.h"
#include "ffstrace.h"

/******************************************************************************
 *
 ******************************************************************************/

extern struct fs_s fs; // defined in core.c

// These dummy defines and struct are only use to simulate FFS on the
// PC. The ones that is used in target are located in task.h
#if (TARGET == 0)
#define FFS_BLOCKING_CALL_BEGIN()
    int result; \
    struct ffs_blocking_s fb; 
#define FFS_BLOCKING_CALL_END()    
struct ffs_blocking_s { };
#endif

/******************************************************************************
 * Create, Read and Write
 ******************************************************************************/

req_id_t ffs_file_write_b(const char *pathname, void *src, int size, 
                        ffs_options_t option, T_RV_RETURN *cp, 
                        struct ffs_blocking_s *fb)
{
    iref_t i, dir;
    char *name;
    effs_t error;
    int chunk_size, size_remaining, bytes_free;

    tw(tr(TR_FUNC, TrApi, "ffs_file_write('%s', 0x%x, %d, %d) ?\n",
          pathname, (int) src, size, option));

    ttw(ttr(TTrApi, "ffs_file_write('%s', 0x%x, %d, %d) ?" NL,
            pathname, (int) src, size, option)); 

    {
        struct ffs_req_s *req;
        MSG_ALLOC(req);
        req->path = pathname;
        req->src = (char *) src;
        req->size = size;
        req->value16 = option;
        req->request_id = request_id_get();
        req->fb = fb;
        req->cp = cp;
        req->cmd = FILE_WRITE;
        MSG_SEND(req);
        return req->request_id;
    }
}

effs_t task_file_write(struct ffs_req_s *p)
{
    iref_t i, dir;
    char *name;
    effs_t error;
    int chunk_size, size_remaining, bytes_free;

#define pathname p->path
#define src p->src
#define size p->size
#define option p->value16

    if (fs.initerror)
        return fs.initerror;

    if (size < 0)
        return EFFS_INVALID;
    
    ffs_query(Q_BYTES_FREE, &bytes_free);
    if (bytes_free < size)
        return EFFS_NOSPACE;

    chunk_size = (size > fs.chunk_size_max ? fs.chunk_size_max : size);

    if ((i = object_lookup(pathname, &name, &dir)) < 0) {
        // Object not found, continue like fcreate()
        if (i != EFFS_NOTFOUND)
            return i;

        if (!is_open_option(option, FFS_O_CREATE))
            return EFFS_NOTFOUND;

        journal_begin(0);

        if ((dir = object_create(name, src, chunk_size, -dir)) < 0)
            return dir;

        journal_end(OT_FILE);
    }
    
    else {
        // Object found, continue like fupdate()
        if (is_open_option(option, (FFS_O_CREATE)) 
			&& is_open_option(option, (FFS_O_EXCL)))
            return EFFS_EXISTS;

        if (get_fdi(i) >= 0) 
            return EFFS_LOCKED;

        // 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(inode_addr(i), OT_DIR) && !(fs.flags & FS_DIR_DATA)) {
            return EFFS_NOTAFILE;
        }
    
        if ((i = is_readonly(i, pathname)) < 0)
            return i;

        // Save the segment (if any) in the global variable because this
        // global variable will be updated if the inode is going to be
        // relocated if an inode_reclaim() is triggeret by the object_create()
        fs.i_backup = segment_next(i);

        journal_begin(i);

        if ((dir = object_create(name, src, chunk_size, -dir)) < 0)
            return dir;
        
        // Do not link child - we are replacing the complete file!
        fs.link_child = 0;  
        journal_end(0);
        
        // If any other segments exist then remove them FIXME: If we get a
        // power failure here then the remaining segments wil not be removed
        // before inode_reclaim() has been executed
        if (fs.i_backup > 0) 
            if ((error = object_remove(fs.i_backup)) < 0)
                return error;
        
    }
    // Save dir in fs.i_backup because this will be updated if some of the
    // chunks below trigger a inode reclaim!
    fs.i_backup = dir;

    size_remaining = size - chunk_size;
    
    while (size_remaining > 0) {

        chunk_size = (size_remaining > fs.chunk_size_max ? 
                      fs.chunk_size_max : size_remaining);
        
        journal_begin(0);
        
        if ((i = segment_create((char*) src + size - size_remaining,
                                    chunk_size, fs.i_backup)) < 0)
            return i;
        
        journal_end(OT_SEGMENT);
        
        size_remaining -= chunk_size;
    }
    
    tw(tr_bstat());

    return EFFS_OK;

#undef pathname
#undef src
#undef size
#undef option

}


// Note: ffs_fcreate() is deprecated and should not be used. Use
// ffs_file_write(..., FFS_O_CREATE | FFS_O_EXCL) instead.
effs_t ffs_fcreate(const char *pathname, void *src, int size)
{
    FFS_BLOCKING_CALL_BEGIN();
  
    result = ffs_file_write_b(pathname, src, size, FFS_O_CREATE | FFS_O_EXCL, 
                              0, &fb);

    FFS_BLOCKING_CALL_END();

    return result;             
}


req_id_t ffs_fcreate_nb(const char *pathname, void *src, int size,
                      T_RV_RETURN *cp)
{
    return ffs_file_write_b(pathname, src, size, FFS_O_CREATE | FFS_O_EXCL, 
                            cp, 0);
}


// Note: ffs_fupdate() is deprecated and should not be used. Use
// ffs_file_write(...,FFS_O_TRUNC) instead.
effs_t ffs_fupdate(const char *pathname, void *src, int size)
{

    FFS_BLOCKING_CALL_BEGIN();

    result = ffs_file_write_b(pathname, src, size, FFS_O_TRUNC, 0, &fb);

    FFS_BLOCKING_CALL_END();

    return result;             
}


req_id_t ffs_fupdate_nb(const char *pathname, void *src, int size,
                      T_RV_RETURN *cp)
{
    return ffs_file_write_b(pathname, src, size, FFS_O_TRUNC, cp, 0);
}


// Note: ffs_fwrite() is deprecated and should not be used. Use
// ffs_file_write(...,FFS_O_CREATE | FFS_O_TRUNC) instead.
effs_t ffs_fwrite(const char *pathname, void *src, int size)
{

    FFS_BLOCKING_CALL_BEGIN();
    
    result = ffs_file_write_b(pathname, src, size, 
                              FFS_O_CREATE | FFS_O_TRUNC, 0, &fb);

    FFS_BLOCKING_CALL_END();

    return result;             
}


req_id_t ffs_fwrite_nb(const char *pathname, void *src, int size,
                     T_RV_RETURN *cp)
{
    return ffs_file_write_b(pathname, src, size, 
                            FFS_O_CREATE | FFS_O_TRUNC, cp, 0);
}


effs_t ffs_file_write(const char *pathname, void *src, int size, 
                      ffs_options_t option)
{

    FFS_BLOCKING_CALL_BEGIN();
    
    result = ffs_file_write_b(pathname, src, size, option, 0, &fb);

    FFS_BLOCKING_CALL_END();

    return result;             
}


req_id_t ffs_file_write_nb(const char *pathname, void *src, int size, 
                         ffs_options_t option,
                         T_RV_RETURN *cp)
{
    return ffs_file_write_b(pathname, src, size, option, cp, 0);
}


// Note important: ffs_fread() is deprecated and should not be used. Use
// ffs_file_read() instead.
int ffs_fread(const char *name, void *addr, int size)
{
    return ffs_file_read(name, addr, size);
}



int ffs_file_read(const char *name, void *addr, int size)
{
    int error;

    tw(tr(TR_BEGIN, TrApi, "file_read('%s', 0x%x, %d) {\n",
          name, (int) addr, size));
    
    if ((error = ffs_begin()) == EFFS_OK)  
    {
        error = file_read(name, addr, size);
    }
    
    tw(tr(TR_END, TrApi, "} %d\n", error));
    
    return ffs_end(error);     // number of bytes read  
}


/******************************************************************************
 * Stat, Symlink, Remove and Rename
 ******************************************************************************/

effs_t ffs_stat(const char *name, struct stat_s *stat)
{
    iref_t i;
 
    tw(tr(TR_FUNC, TrApi, "ffs_stat('%s', ?) ?\n", name));
	ttw(ttr(TTrApi, "ffs_stat('%s', ?) ?" NL, name)); 

    if (name == NULL)
        return EFFS_BADNAME;

    if ((i = ffs_begin()) == EFFS_OK)
    {
        if ((i = object_stat(name, (struct xstat_s*) stat, 0, 0, 0)) > 0)
            i = EFFS_OK;
    }
    
    return ffs_end(i);
}


// Note: ffs_linkstat() is deprecated and should not be used. Use
// ffs_lstat() instead. 
effs_t ffs_linkstat(const char *name, struct stat_s *stat)
{
    return ffs_lstat(name, stat);
}


effs_t ffs_lstat(const char *name, struct stat_s *stat)
{
    iref_t i;
 
    tw(tr(TR_FUNC, TrApi, "ffs_lstat('%s', ?) ?\n", name));
	ttw(ttr(TTrApi, "ffs_lstat('%s', ?) ?" NL, name)); 

    if ((i = ffs_begin()) == EFFS_OK) {
        if ((i = object_stat(name, (struct xstat_s*)stat, 1, 0, 0)) > 0)
            i = EFFS_OK;
    }

    return ffs_end(i);
}


effs_t ffs_xlstat(const char *name, struct xstat_s *stat)
{
    iref_t i;
 
    tw(tr(TR_FUNC, TrApi, "ffs_xlstat('%s', ?) ?\n", name));
	ttw(ttr(TTrApi, "ffs_xlstat('%s', ?) ?" NL, name)); 

    if ((i = ffs_begin()) == EFFS_OK) {
        if ((i = object_stat(name, stat, 1, 0, 1)) > 0)
            i = EFFS_OK;
    }

    return ffs_end(i);
}


effs_t ffs_fstat(fd_t fdi, struct stat_s *stat)
{
    iref_t i;
 
    tw(tr(TR_FUNC, TrApi, "ffs_fstat('%d', ?) ?\n", fdi));
	ttw(ttr(TTrApi, "ffs_fstat('%d', ?) ?" NL, fdi)); 

    if ((i = ffs_begin()) == EFFS_OK) {
        if ((i = object_stat( 0, (struct xstat_s*) stat, 0, fdi, 0)) > 0)
            i = EFFS_OK;
    }

    return ffs_end(i);
}


req_id_t ffs_symlink_b(const char *pathname, const char *src,
                      T_RV_RETURN *cp, struct ffs_blocking_s *fb)
{
    iref_t i, dir;
    char *name;
    int size;

    tw(tr(TR_FUNC, TrApi, "ffs_symlink('%s', '%s') ?\n", pathname, src));
	ttw(ttr(TTrApi, "ffs_symlink('%s', '%s') ?" NL, pathname, src)); 

    {
        struct ffs_req_s *req;
        MSG_ALLOC(req);
        req->path = pathname;
        req->src = (char *) src;
        req->request_id = request_id_get();
        req->fb = fb;
        req->cp = cp;
        req->cmd = SYMLINK;
        MSG_SEND(req);
        return req->request_id;
    }
}

effs_t task_symlink(struct ffs_req_s *p)
{
    iref_t i, dir;
    int size;
    char *name;

#define pathname p->path
#define src p->src

    if (fs.initerror)
        return fs.initerror;

    if (src == NULL)
        return EFFS_BADNAME;

    i = object_lookup(pathname, &name, &dir);
    if (i > 0)
        return EFFS_EXISTS;
    if (i != EFFS_NOTFOUND)
        return i;

    size = ffs_strlen(src) + 1;  // include null-terminator

    journal_begin(0);

    if ((i = object_create(name, src, size, -dir)) < 0)
        return i;

    journal_end(OT_LINK);

    tw(tr_bstat());

    return EFFS_OK;

#undef pathname
#undef src

}


effs_t ffs_symlink(const char *pathname, const char *actualpath)
{
    FFS_BLOCKING_CALL_BEGIN();

    result = ffs_symlink_b(pathname, actualpath, 0, &fb);

    FFS_BLOCKING_CALL_END();

    return result;             
}


req_id_t ffs_symlink_nb(const char *pathname, const char *src,
                      T_RV_RETURN *cp)
{
    return ffs_symlink_b(pathname, src, cp, 0);
}


int ffs_readlink(const char *name, char *addr, int size)
{
    int error;

    tw(tr(TR_FUNC, TrApi, "ffs_readlink('%s')\n", name));

    if ((error = ffs_begin()) == EFFS_OK)
    {
        error = object_read(name, addr, size, 1);
    }
    return ffs_end(error);
}


req_id_t ffs_remove_b(const char *pathname, T_RV_RETURN *cp, 
            struct ffs_blocking_s *fb)
{
    iref_t i;

    tw(tr(TR_FUNC, TrApi, "ffs_remove('%s')\n", pathname));
	ttw(ttr(TTrApi, "ffs_remove('%s') ?" NL, pathname)); 

    {
        struct ffs_req_s *req;
        MSG_ALLOC(req);
        req->path = pathname;
        req->request_id = request_id_get();
        req->fb = fb;
        req->cp = cp;
        req->cmd = REMOVE;
        MSG_SEND(req);
        return req->request_id;
    }
}

effs_t task_remove(struct ffs_req_s *p)
{
    iref_t i;

#define pathname p->path

    if (fs.initerror)
        return fs.initerror;

    if ((i = object_lookup_once(pathname, 0, 0)) < 0)
        return i;

    if (get_fdi(i) >= 0)
        return EFFS_LOCKED;

    if ((i = is_readonly(i, pathname)) < 0)
        return i;

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

    tw(tr_bstat());

    return EFFS_OK;

#undef pathname

}


effs_t ffs_remove(const char *pathname)
{
    FFS_BLOCKING_CALL_BEGIN();
    
    result = ffs_remove_b(pathname, 0, &fb);

    FFS_BLOCKING_CALL_END();

    return result; 
}


req_id_t ffs_remove_nb(const char *pathname, T_RV_RETURN *cp)
{
    return ffs_remove_b(pathname, cp, 0);
}


req_id_t ffs_fcontrol_b(const char *pathname, int8 action, int param,
              T_RV_RETURN *cp, struct ffs_blocking_s *fb)
{
    iref_t i;

    tw(tr(TR_FUNC, TrApi, "ffs_fcontrol('%s', %d, 0x%x) ?\n",
          pathname, action, param));
	ttw(ttr(TTrApi, "ffs_fcontrol('%s', %d, 0x%x) ?" NL, 
			pathname, action, param)); 

    {
        struct ffs_req_s *req;
        MSG_ALLOC(req);

⌨️ 快捷键说明

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