static int memfs_seek(struct fnode *fno, int off, int whence) { struct memfs_fnode *mfno; int new_off; mfno = FNO_MOD_PRIV(fno, &mod_memfs); if (!mfno) return -1; switch(whence) { case SEEK_CUR: new_off = fno->off + off; break; case SEEK_SET: new_off = off; break; case SEEK_END: new_off = fno->size + off; break; default: return -1; } if (new_off < 0) new_off = 0; if (new_off > fno->size) { mfno->content = krealloc(mfno->content, new_off); memset(mfno->content + fno->size, 0, new_off - fno->size); fno->size = new_off; } fno->off = new_off; return 0; }
static int sysfs_close(struct fnode *fno) { struct sysfs_fnode *mfno; mfno = FNO_MOD_PRIV(fno, &mod_sysfs); if (!mfno) return -1; fno->off = 0; return 0; }
static int sysfs_write(struct fnode *fno, const void *buf, unsigned int len) { struct sysfs_fnode *mfno; if (len <= 0) return len; mfno = FNO_MOD_PRIV(fno, &mod_sysfs); if (mfno) return -1; if (mfno->do_write) { return mfno->do_write(mfno, buf, len); } return -1; }
static int sysfs_read(struct fnode *fno, void *buf, unsigned int len) { struct sysfs_fnode *mfno; if (len <= 0) return len; mfno = FNO_MOD_PRIV(fno, &mod_sysfs); if (!mfno) return -1; if (mfno->do_read) { return mfno->do_read(mfno, buf, len); } return -1; }
static int memfs_read(struct fnode *fno, void *buf, unsigned int len) { struct memfs_fnode *mfno; if (len <= 0) return len; mfno = FNO_MOD_PRIV(fno, &mod_memfs); if (!mfno) return -1; if (fno->size <= (fno->off)) return -1; if (len > (fno->size - fno->off)) len = fno->size - fno->off; memcpy(buf, mfno->content + fno->off, len); fno->off += len; return len; }
static int memfs_write(struct fnode *fno, const void *buf, unsigned int len) { struct memfs_fnode *mfno; if (len <= 0) return len; mfno = FNO_MOD_PRIV(fno, &mod_memfs); if (!mfno) return -1; if (fno->size < (fno->off + len)) { mfno->content = krealloc(mfno->content, fno->off + len); } if (!mfno->content) return -1; memcpy(mfno->content + fno->off, buf, len); fno->off += len; if (fno->size < fno->off) fno->size = fno->off; return len; }