cfs-cooja.c
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 #include <string.h>
00034 #include "lib/simEnvChange.h"
00035 #include "cfs/cfs.h"
00036 
00037 #define FLAG_FILE_CLOSED 0
00038 #define FLAG_FILE_OPEN   1
00039 
00040 struct filestate {
00041   char flag;
00042   int access;
00043   int fileptr;
00044   int endptr;
00045 };
00046 
00047 static struct filestate file;
00048 
00049 const struct simInterface cfs_interface;
00050 
00051 
00052 #define CFS_BUF_SIZE 4000 
00053 char simCFSData[CFS_BUF_SIZE] = { 0 };
00054 char simCFSChanged = 0;
00055 int simCFSRead = 0;
00056 int simCFSWritten = 0;
00057 
00058 
00059 int
00060 cfs_open(const char *n, int f)
00061 {
00062   if(file.flag == FLAG_FILE_CLOSED) {
00063     file.flag = FLAG_FILE_OPEN;
00064     file.access = f;
00065                 if(f & CFS_APPEND) {
00066                         file.fileptr = file.endptr;
00067                 } else {
00068             file.fileptr = 0;
00069                 }
00070     return 0;
00071   } else {
00072     return -1;
00073   }
00074 }
00075 
00076 void
00077 cfs_close(int f)
00078 {
00079   file.flag = FLAG_FILE_CLOSED;
00080 }
00081 
00082 int
00083 cfs_read(int f, void *buf, unsigned int len)
00084 {
00085         if(file.flag == FLAG_FILE_OPEN && file.access & CFS_READ) {
00086                 if(file.fileptr + len >= file.endptr) {
00087                         len = file.endptr - file.fileptr;
00088                 }
00089                 memcpy(buf, &simCFSData[file.fileptr], len);
00090     file.fileptr += len;
00091                 simCFSChanged = 1;
00092                 simCFSRead += len;
00093     return len;
00094   } else {
00095     return -1;
00096   }
00097 }
00098 
00099 int
00100 cfs_write(int f, const void *buf, unsigned int len)
00101 {
00102         if(file.flag == FLAG_FILE_OPEN && file.access & CFS_WRITE) {
00103                 if(file.fileptr + len > CFS_BUF_SIZE) {
00104                         len = CFS_BUF_SIZE - file.fileptr;
00105                         printf("cfs-cooja.c: warning: write truncated\n");
00106                 }
00107                 memcpy(&simCFSData[file.fileptr], buf, len);
00108         file.fileptr += len;
00109                 simCFSChanged = 1;
00110                 simCFSWritten += len;
00111                 if(file.fileptr > file.endptr) {
00112                         file.endptr = file.fileptr;
00113                 }
00114     return len;
00115   } else {
00116     return -1;
00117   }
00118 }
00119 
00120 cfs_offset_t
00121 cfs_seek(int f, cfs_offset_t o, int w)
00122 {
00123   if(file.flag == FLAG_FILE_OPEN) {
00124         if(w == CFS_SEEK_SET) {
00125         file.fileptr = o;
00126         } else if(w == CFS_SEEK_CUR) {
00127                         file.fileptr += o;
00128         } else if(w == CFS_SEEK_END) {
00129                 file.fileptr = file.endptr + o;
00130         }
00131         if(file.fileptr >= 0 && file.fileptr <= CFS_BUF_SIZE) {
00132                 if(file.fileptr > file.endptr) {
00133                         file.endptr = file.fileptr;
00134                 }
00135                   return file.fileptr;
00136         }
00137   }
00138   return -1;
00139 }
00140 
00141 int
00142 cfs_remove(const char *name)
00143 {
00144         memset(simCFSData, 0, sizeof(simCFSData));
00145   return 0;
00146 }
00147 
00148 int
00149 cfs_opendir(struct cfs_dir *p, const char *n)
00150 {
00151   return 0;
00152 }
00153 
00154 int
00155 cfs_readdir(struct cfs_dir *p, struct cfs_dirent *e)
00156 {
00157   return 0;
00158 }
00159 
00160 void
00161 cfs_closedir(struct cfs_dir *p)
00162 {
00163 }
00164 
00165 static void
00166 doInterfaceActionsBeforeTick(void)
00167 {
00168 }
00169 
00170 static void
00171 doInterfaceActionsAfterTick(void)
00172 {
00173 }
00174 
00175 SIM_INTERFACE(cfs_interface,
00176               doInterfaceActionsBeforeTick,
00177               doInterfaceActionsAfterTick);
00178