[Linux-decnet-commit] CVS: dnprogs/dapfs dapfs.c,1.5,1.6
Brought to you by:
chrissie_c,
ph3-der-loewe
From: Patrick C. <pa...@us...> - 2005-10-16 10:46:49
|
Update of /cvsroot/linux-decnet/dnprogs/dapfs In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7447 Modified Files: dapfs.c Log Message: A bit more Index: dapfs.c =================================================================== RCS file: /cvsroot/linux-decnet/dnprogs/dapfs/dapfs.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** dapfs.c 13 Oct 2005 11:47:39 -0000 1.5 --- dapfs.c 16 Oct 2005 10:46:28 -0000 1.6 *************** *** 11,22 **** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ! ****************************************************************************** ! */ /* dapfs via FUSE */ ! ! /* ! This program can be distributed under the terms of the GNU GPL. ! See the file COPYING. ! */ #define _FILE_OFFSET_BITS 64 --- 11,18 ---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ! ****************************************************************************** ! */ /* dapfs via FUSE */ ! // mount -tfuse dapfs#'alpha1"patrick password"::' /mnt/dap #define _FILE_OFFSET_BITS 64 *************** *** 38,44 **** --- 34,49 ---- #include "filenames.h" + /* Copied from dncopy */ + struct dapfs_handle { RMSHANDLE rmsh; + /* RMS File attributes */ + int org; + int rat; + int rfm; + int mrs; + int fsz; + /* Last known offset in the file */ off_t offset; }; *************** *** 46,49 **** --- 51,119 ---- char prefix[1024]; + static const int RAT_DEFAULT = -1; // Use RMS defaults + static const int RAT_FTN = 1; // RMS RAT values from fab.h + static const int RAT_CR = 2; + static const int RAT_PRN = 4; + static const int RAT_NONE = 0; + + static const int RFM_DEFAULT = -1; // Use RMS defaults + static const int RFM_UDF = 0; // RMS RFM values from fab.h + static const int RFM_FIX = 1; + static const int RFM_VAR = 2; + static const int RFM_VFC = 3; + static const int RFM_STM = 4; + static const int RFM_STMLF = 5; + static const int RFM_STMCR = 6; + + + /* Convert RMS record carriage control into something more unixy */ + static int convert_rms_record(char *buf, int len, struct dapfs_handle *fh) + { + int retlen = len; + + /* If the file has implied carriage control then add an LF to the end of the line */ + if ((fh->rfm != RFM_STMLF) && + (fh->rat & RAT_CR || fh->rat & RAT_PRN)) + buf[retlen++] = '\n'; + + /* Print files have a two-byte header indicating the line length. */ + if (fh->rat & RAT_PRN) + { + memmove(buf, buf + fh->fsz, retlen - fh->fsz); + retlen -= fh->fsz; + } + + /* FORTRAN files have a leading character that indicates carriage control */ + if (fh->rat & RAT_FTN) + { + switch (buf[0]) + { + + case '+': // No new line + buf[0] = '\r'; + break; + + case '1': // Form Feed + buf[0] = '\f'; + break; + + case '0': // Two new lines + memmove(buf+1, buf, retlen+1); + buf[0] = '\n'; + buf[1] = '\n'; + retlen++; + break; + + + case ' ': // new line + default: // Default to a new line. This seems to be what VMS does. + buf[0] = '\n'; + break; + } + } + + return retlen; + } + static int dapfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) *************** *** 81,95 **** } static int dapfs_truncate(const char *path, off_t size) { ! // TODO - DAP::CONTROL::TRUNCATE message. ! // NOTE: This can also be called at create time to overwrite an ! // existing file ! return 0; } static int dapfs_mkdir(const char *path, mode_t mode) { ! syslog(1, "PJC: dapfs_mkdir called for %s\n", path); // TODO Use remote object return -ENOSYS; --- 151,201 ---- } + int dapfs_chown(const char *path, uid_t u, gid_t g) + { + // Can we do this ?? + return 0; + } + + static int dapfs_flush(const char *path, struct fuse_file_info *fi) + { + // NO-OP + return 0; + } + static int dapfs_truncate(const char *path, off_t size) { ! RMSHANDLE rmsh; ! int offset; ! int res; ! struct RAB rab; ! char fullname[2048]; ! char vmsname[2048]; ! ! make_vms_filespec(path, vmsname, 0); ! sprintf(fullname, "%s%s", prefix, vmsname); ! ! rmsh = rms_open(fullname, O_WRONLY, NULL); ! if (!rmsh) { ! return -errno; ! } ! ! memset(&rab, 0, sizeof(rab)); ! if (size) { ! rab.rab$l_kbf = &offset; ! rab.rab$b_rac = 2;//FB$RFA; ! rab.rab$b_ksz = sizeof(offset); ! } ! res = rms_find(rmsh, &rab); ! if (!res) ! goto finish; ! res = rms_truncate(rmsh, NULL); ! finish: ! rms_close(rmsh); ! return res; } static int dapfs_mkdir(const char *path, mode_t mode) { ! syslog(LOG_DEBUG, "PJC: dapfs_mkdir called for %s\n", path); // TODO Use remote object return -ENOSYS; *************** *** 98,102 **** static int dapfs_statfs(const char *path, struct statfs *stbuf) { ! syslog(1, "PJC: dapfs_statfs called for %s\n", path); // TODO Use remote object return -ENOSYS; --- 204,208 ---- static int dapfs_statfs(const char *path, struct statfs *stbuf) { ! syslog(LOG_DEBUG, "PJC: dapfs_statfs called for %s\n", path); // TODO Use remote object return -ENOSYS; *************** *** 112,120 **** char vmsname[2048]; - syslog(1, "PJC: mknod, path=%s, mode=%x\n", path, mode); - - if (S_ISDIR(mode)) - return -ENOSYS; // Does this happen ?? - if (!S_ISREG(mode)) return -ENOSYS; --- 218,221 ---- *************** *** 123,127 **** sprintf(fullname, "%s%s", prefix, vmsname); ! rmsh = rms_open(fullname, O_CREAT|O_WRONLY, NULL); if (!rmsh) return -errno; --- 224,228 ---- sprintf(fullname, "%s%s", prefix, vmsname); ! rmsh = rms_t_open(fullname, O_CREAT|O_WRONLY, "rfm=stmlf"); if (!rmsh) return -errno; *************** *** 132,155 **** static int dapfs_open(const char *path, struct fuse_file_info *fi) { ! struct dapfs_handle *h; ! char fullname[2048]; ! char vmsname[2048]; ! ! h = malloc(sizeof(struct dapfs_handle)); ! if (!h) ! return -ENOMEM; ! ! make_vms_filespec(path, vmsname, 0); ! sprintf(fullname, "%s%s", prefix, vmsname); ! ! h->rmsh = rms_open(fullname, fi->flags, NULL); ! if (!h->rmsh) { ! int saved_errno = errno; ! free(h); ! return -saved_errno; ! } ! fi->fh = (unsigned long)h; ! h->offset = 0; ! return 0; } --- 233,268 ---- static int dapfs_open(const char *path, struct fuse_file_info *fi) { ! struct dapfs_handle *h; ! struct FAB fab; ! char fullname[2048]; ! char vmsname[2048]; ! ! syslog(LOG_DEBUG, "open %s, flags=%x\n", path, fi->flags); ! h = malloc(sizeof(struct dapfs_handle)); ! if (!h) ! return -ENOMEM; ! ! memset(&fab, 0, sizeof(struct FAB)); ! make_vms_filespec(path, vmsname, 0); ! sprintf(fullname, "%s%s", prefix, vmsname); ! if (fi->flags & O_CREAT) ! fab.fab$b_rfm = RFM_STMLF; ! ! h->rmsh = rms_open(fullname, fi->flags, &fab); ! if (!h->rmsh) { ! int saved_errno = errno; ! free(h); ! return -saved_errno; ! } ! /* Save RMS attributes */ ! h->org = fab.fab$b_org; ! h->rat = fab.fab$b_rat; ! h->rfm = fab.fab$b_rfm; ! h->mrs = fab.fab$w_mrs; ! h->fsz = fab.fab$b_fsz; ! ! fi->fh = (unsigned long)h; ! h->offset = 0; ! return 0; } *************** *** 157,230 **** struct fuse_file_info *fi) { ! int res; ! int got = 0; ! struct RAB rab; ! struct dapfs_handle *h = (struct dapfs_handle *)fi->fh; ! if (!h) { ! res = dapfs_open(path, fi); ! if (!res) ! return res; ! } ! memset(&rab, 0, sizeof(rab)); ! if (offset && offset != h->offset) { ! rab.rab$l_kbf = &offset; ! rab.rab$b_rac = 2;//FB$RFA; ! rab.rab$b_ksz = sizeof(offset); ! } ! ! // TODO this can be quite slow, because it reads records. Maybe we ! // should abandon librms and pull blocks down as per dncopy ! do { ! res = rms_read(h->rmsh, buf+got, size-got, &rab); ! if (res > 0) ! got += res; ! if (res < 0 && got) { ! // Not enough room for a record but we read something ! return got; ! } ! ! } while (res > 0); ! if (res >= 0) ! res = got; ! if (res == -1) ! res = -errno; ! h->offset += res; ! return res; } static int dapfs_write(const char *path, const char *buf, size_t size, ! off_t offset, struct fuse_file_info *fi) { ! int res; ! int got = 0; ! struct RAB rab; ! struct dapfs_handle *h = (struct dapfs_handle *)fi->fh; ! ! if (!h) { ! res = dapfs_open(path, fi); ! if (!res) ! return res; ! } ! ! memset(&rab, 0, sizeof(rab)); ! if (offset && offset != h->offset) { ! rab.rab$l_kbf = &offset; ! rab.rab$b_rac = 2;//FB$RFA; ! rab.rab$b_ksz = sizeof(offset); ! } ! ! res = rms_write(h->rmsh, (char *)buf+got, size-got, &rab); ! if (res == -1) { ! res = -errno; ! } ! else { ! h->offset += res; ! res = size; ! } ! return res; } --- 270,347 ---- struct fuse_file_info *fi) { ! int res; ! int got = 0; ! struct RAB rab; ! struct dapfs_handle *h = (struct dapfs_handle *)fi->fh; ! if (!h) { ! res = dapfs_open(path, fi); ! if (!res) ! return res; ! } ! memset(&rab, 0, sizeof(rab)); ! if (offset && offset != h->offset) { ! rab.rab$l_kbf = &offset; ! rab.rab$b_rac = 2;//FB$RFA; ! rab.rab$b_ksz = sizeof(offset); ! } ! ! /* This can be quite slow, because it reads records. ! However, it's safer this way as we can make sense of sequential files. */ ! do { ! res = rms_read(h->rmsh, buf+got, size-got, &rab); ! if (res > 0) { ! res = convert_rms_record(buf+got, res, h); ! got += res; ! } ! if (res < 0 && got) { ! // Not enough room for a record but we read something ! return got; ! } ! } while (res > 0); ! if (res >= 0) ! res = got; ! if (res == -1) ! res = -errno; ! ! h->offset += res; ! return res; } static int dapfs_write(const char *path, const char *buf, size_t size, ! off_t offset, struct fuse_file_info *fi) { ! int res; ! struct RAB rab; ! struct dapfs_handle *h = (struct dapfs_handle *)fi->fh; ! ! if (!h) { ! res = dapfs_open(path, fi); ! if (!res) ! return res; ! } ! ! syslog(LOG_DEBUG, "dapfs_write. offset=%d, (%p) fh->offset=%d\n", (int)offset, h, (int)h->offset); ! memset(&rab, 0, sizeof(rab)); ! if (offset && offset != h->offset) { ! rab.rab$l_kbf = &offset; ! rab.rab$b_rac = 2;//FB$RFA; ! rab.rab$b_ksz = sizeof(offset); ! } ! ! res = rms_write(h->rmsh, (char *)buf, size, &rab); ! if (res == -1) { ! syslog(LOG_DEBUG, "rms_write returned %d, errno=%d\n", res, errno); ! res = -errno; ! } ! else { ! h->offset += size; ! res = size; ! syslog(LOG_DEBUG, "rms_write returned 0, offset (%p) now=%d\n", h, (int)h->offset); ! } ! return res; } *************** *** 239,246 **** --- 356,365 ---- ret = rms_close(h->rmsh); free(h); + fi->fh = 0L; return ret; } + static int dapfs_getattr(const char *path, struct stat *stbuf) { *************** *** 274,278 **** --- 393,399 ---- .mknod = dapfs_mknod, .chmod = dapfs_chmod, + .chown = dapfs_chown, .mkdir = dapfs_mkdir, + .flush = dapfs_flush, .statfs = dapfs_statfs, .release = dapfs_release, *************** *** 293,295 **** } - // TODO statfs & mkkdir, use DECnet object used by old dapfs! --- 414,415 ---- |