Update of /cvsroot/linux-decnet/dnprogs/dapfs
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4653
Modified Files:
dapfs.c dapfs_dap.cc dapfs_dap.h filenames.c
Added Files:
dapfs.com
Log Message:
More!
--- NEW FILE: dapfs.com ---
$!-----------------------------------------------------------------------------
$! (C) Eduardo Marcelo Serrat <ems...@ge...>
$! dapfs DECnet OBJECT
$!
$! It is installed as a DECnet object to cooperate with
$! Linux dapfs filesystem implementation to create directories
$! and delete them.
$!
$!
$! Installation on VAX/OpenVMS DECnet PHASE IV:
$! -------------------------------------------
$! 1) copy dapfs.com to SYS$SYSTEM:
$!
$! 2) define the dapfs object in the DECnet database
$!
$! $ MCR NCP DEFINE OBJECT DAPFS NUMBER 0 FILE SYS$SYSTEM:LINUXDIR.COM
$! $ MCR NCP SET OBJECT DAPFS ALL
$!
$! Installation on Alpha/OpenVMS DECnet-Plus or VAX/DECnet OSI
$!
$! 1) copy dapfs.com to SYS$SYSTEM
$!
$! 2) define the dapfs object in the DECnet database
$!
$! $ mcr ncl create node 0 session control application dapfs
$! $ mcr ncl set node 0 session control application dapfs -
$! addresses = {name=dapfs}, image name = sys$system:dapfs.com
$!
$! 3) edit and include preceding commands into:
$! SYS$MANAGER:NET$STARTUP_APPLICATIONS.NCL
$!
$!----------------------------------------------------------------------------
$ if f$mode() .nes. "NETWORK" then exit
$!
$ open/read/write dapfs sys$net
$ read/prompt=""/time_out=5/error=out dapfs operation
$ read/prompt=""/time_out=5/error=out dapfs dirname
$!
$ if operation .eqs. "CREATE" then $goto create_op
$ if operation .eqs. "STATFS" then $goto statfs_op
$ set file/prot=(o:rwed) 'dirname'
$ delete/nolog 'dirname'
$ if $severity .ne. 1 then $goto del_error
$ write dapfs "OK"
$ goto out
$del_error:
$ set file/prot=(o:rwe) 'dirname'
$ goto dir_error
$!
$create_op:
$ create/directory 'dirname'
$ if $severity .ne. 1 then $goto dir_error
$ write dapfs "OK"
$ goto out
$!
$statfs_op:
$! TODO PJC
$dir_error:
$ write dapfs "ERROR"
$!
$out:
$ close/nolog dapfs
$ exit
Index: dapfs.c
===================================================================
RCS file: /cvsroot/linux-decnet/dnprogs/dapfs/dapfs.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -r1.3 -r1.4
*** dapfs.c 12 Oct 2005 12:57:43 -0000 1.3
--- dapfs.c 13 Oct 2005 09:50:23 -0000 1.4
***************
*** 57,61 ****
char vername[strlen(path)+3];
! sprintf(vername, "%s;1", path);
return dap_delete_file(vername);
}
--- 57,61 ----
char vername[strlen(path)+3];
! sprintf(vername, "%s;*", path);
return dap_delete_file(vername);
}
***************
*** 75,83 ****
}
static int dapfs_truncate(const char *path, off_t size)
{
! // TODO
! return -ENOSYS;
}
--- 75,131 ----
}
+ int dapfs_chmod(const char *path, mode_t mode)
+ {
+ // Can we do this ??
+ return 0;
+ }
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;
! }
!
! 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;
! }
!
!
! /* This gets called for normal files too... */
! // TODO mode is ignored.
! static int dapfs_mknod(const char *path, mode_t mode, dev_t dev)
! {
! RMSHANDLE rmsh;
! char fullname[2048];
! 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;
!
! make_vms_filespec(path, vmsname, 0);
! sprintf(fullname, "%s%s", prefix, vmsname);
!
! rmsh = rms_open(fullname, O_CREAT|O_WRONLY, NULL);
! if (!rmsh)
! return -errno;
! rms_close(rmsh);
! return 0;
}
***************
*** 94,101 ****
make_vms_filespec(path, vmsname, 0);
sprintf(fullname, "%s%s", prefix, vmsname);
- syslog(1, "dapfs: filename: %s\n", fullname);
h->rmsh = rms_open(fullname, fi->flags, NULL);
- syslog(1, "dapfs: rms_open %p, %d\n", h, errno);
if (!h->rmsh) {
int saved_errno = errno;
--- 142,147 ----
***************
*** 116,119 ****
--- 162,171 ----
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) {
***************
*** 127,132 ****
do {
res = rms_read(h->rmsh, buf+got, size-got, &rab);
! if (res)
got += res;
} while (res > 0);
--- 179,188 ----
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);
***************
*** 149,152 ****
--- 205,214 ----
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) {
***************
*** 156,172 ****
}
! do {
! res = rms_write(h->rmsh, (char *)buf+got, size-got, &rab);
! if (res)
! got += res;
!
! } while (res > 0);
! if (res >= 0)
! res = got;
!
! if (res == -1)
res = -errno;
!
! h->offset += res;
return res;
}
--- 218,229 ----
}
! res = rms_write(h->rmsh, (char *)buf+got, size-got, &rab);
! if (res == -1) {
res = -errno;
! }
! else {
! h->offset += res;
! res = size;
! }
return res;
}
***************
*** 177,180 ****
--- 234,240 ----
int ret;
+ if (!h)
+ return -EBADF;
+
ret = rms_close(h->rmsh);
free(h);
***************
*** 186,190 ****
{
int res;
- syslog(1, "dapfs - getattr on %s\n", path);
if (strcmp(path, "/") == 0) {
res = stat("/", stbuf);
--- 246,249 ----
***************
*** 206,209 ****
--- 265,272 ----
.rmdir = dapfs_rmdir,
.rename = dapfs_rename,
+ .mknod = dapfs_mknod,
+ .chmod = dapfs_chmod,
+ .mkdir = dapfs_mkdir,
+ .statfs = dapfs_statfs,
.release = dapfs_release,
};
***************
*** 214,217 ****
--- 277,288 ----
strcpy(prefix, argv[1]);
+ // Make a scratch connection - also verifies the path name nice and early
+ if (dap_init()) {
+ syslog(LOG_ERR, "Cannot connect to '%s'\n", prefix);
+ return -ENOTCONN;
+ }
+
return fuse_main(argc-1, argv+1, &dapfs_oper);
}
+
+ // TODO statfs & mkkdir, use DECnet object used by old dapfs!
Index: dapfs_dap.cc
===================================================================
RCS file: /cvsroot/linux-decnet/dnprogs/dapfs/dapfs_dap.cc,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -r1.3 -r1.4
*** dapfs_dap.cc 12 Oct 2005 12:57:43 -0000 1.3
--- dapfs_dap.cc 13 Oct 2005 09:50:23 -0000 1.4
***************
*** 35,42 ****
}
! static int dap_connect(dap_connection &conn)
{
char dirname[256] = {'\0'};
! if (!conn.connect(prefix, dap_connection::FAL_OBJECT, dirname))
{
return -ENOTCONN;
--- 35,45 ----
}
! // Use this for one-shot stuff like getattr & delete
! static dap_connection conn(0);
!
! static int dap_connect(dap_connection &c)
{
char dirname[256] = {'\0'};
! if (!c.connect(prefix, dap_connection::FAL_OBJECT, dirname))
{
return -ENOTCONN;
***************
*** 44,50 ****
// Exchange config messages
! if (!conn.exchange_config())
{
! fprintf(stderr, "Error in config: %s\n", conn.get_error());
return -ENOTCONN;
}
--- 47,53 ----
// Exchange config messages
! if (!c.exchange_config())
{
! fprintf(stderr, "Error in config: %s\n", c.get_error());
return -ENOTCONN;
}
***************
*** 64,68 ****
if (strstr(nm->get_namespec(), ".DIR;1")) {
stbuf->st_mode |= S_IFDIR;
- syslog(1, "%s is a directory\n", nm->get_namespec());
}
else {
--- 67,70 ----
***************
*** 94,98 ****
{
dap_date_message *dm = (dap_date_message *)m;
- syslog(1, "got date message\n");
stbuf->st_atime = dm->get_rdt_time();
stbuf->st_ctime = dm->get_cdt_time();
--- 96,99 ----
***************
*** 105,118 ****
int dapfs_getattr_dap(const char *path, struct stat *stbuf)
{
- dap_connection conn(0);
char vmsname[1024];
char name[80];
! int ret;
int size;
- ret = dap_connect(conn);
- if (ret)
- return ret;
-
make_vms_filespec(path, vmsname, 0);
--- 106,114 ----
int dapfs_getattr_dap(const char *path, struct stat *stbuf)
{
char vmsname[1024];
char name[80];
! int ret = 0;
int size;
make_vms_filespec(path, vmsname, 0);
***************
*** 132,144 ****
{
add_to_stat(m, stbuf);
! if (m->get_type() == dap_message::ACCOMP)
! {
goto finished;
}
delete m;
}
finished:
! conn.close();
! return 0;
}
--- 128,160 ----
{
add_to_stat(m, stbuf);
! if (m->get_type() == dap_message::ACCOMP) {
! delete m;
goto finished;
}
+
+ if (m->get_type() == dap_message::STATUS)
+ {
+ dap_status_message *sm = (dap_status_message *)m;
+ if (sm->get_code() == 0x4030)
+ {
+ dap_contran_message cm;
+ cm.set_confunc(dap_contran_message::SKIP);
+ cm.write(conn);
+ }
+ else
+ {
+ ret = -ENOENT; // TODO better error
+ // Clean connection status.
+ dap_contran_message cm;
+ cm.set_confunc(dap_contran_message::SKIP);
+ cm.write(conn);
+ }
+ // Wait for ACCOMP
+ break;
+ }
delete m;
}
finished:
! return ret;
}
***************
*** 146,150 ****
off_t offset, struct fuse_file_info *fi)
{
! dap_connection conn(0);
char vmsname[1024];
char wildname[strlen(path)+2];
--- 162,166 ----
off_t offset, struct fuse_file_info *fi)
{
! dap_connection c(0);
char vmsname[1024];
char wildname[strlen(path)+2];
***************
*** 154,170 ****
int ret;
! memset(&stbuf, 0, sizeof(stbuf));
! ret = dap_connect(conn);
if (ret)
return ret;
// Add wildcard to path
if (path[strlen(path)-1] == '/') {
! sprintf(wildname, "%s*", path);
path = wildname;
}
-
make_vms_filespec(path, vmsname, 0);
- syslog(1, "readdir: dir = %s: %s\n", path, vmsname);
dap_access_message acc;
--- 170,186 ----
int ret;
! // Use our own connection for this.
! ret = dap_connect(c);
if (ret)
return ret;
+ memset(&stbuf, 0, sizeof(stbuf));
+
// Add wildcard to path
if (path[strlen(path)-1] == '/') {
! sprintf(wildname, "%s*.*", path);
path = wildname;
}
make_vms_filespec(path, vmsname, 0);
dap_access_message acc;
***************
*** 175,179 ****
dap_access_message::DISPLAY_DATE_MASK |
dap_access_message::DISPLAY_PROT_MASK);
! acc.write(conn);
bool name_pending = false;
--- 191,195 ----
dap_access_message::DISPLAY_DATE_MASK |
dap_access_message::DISPLAY_PROT_MASK);
! acc.write(c);
bool name_pending = false;
***************
*** 182,186 ****
// Loop through the files we find
! while ( ((m=dap_message::read_message(conn, true) )) )
{
add_to_stat(m, &stbuf);
--- 198,202 ----
// Loop through the files we find
! while ( ((m=dap_message::read_message(c, true) )) )
{
add_to_stat(m, &stbuf);
***************
*** 190,193 ****
--- 206,210 ----
case dap_message::NAME:
{
+ // Got a new name, send the old stuff.
if (name_pending)
{
***************
*** 222,228 ****
dap_contran_message cm;
cm.set_confunc(dap_contran_message::SKIP);
! if (!cm.write(conn))
{
! fprintf(stderr, "Error sending skip: %s\n", conn.get_error());
goto finished;
}
--- 239,246 ----
dap_contran_message cm;
cm.set_confunc(dap_contran_message::SKIP);
! if (!cm.write(c))
{
! fprintf(stderr, "Error sending skip: %s\n", c.get_error());
! delete m;
goto finished;
}
***************
*** 244,259 ****
finished:
// An error:
! fprintf(stderr, "Error: %s\n", conn.get_error());
! conn.close();
return 2;
flush:
if (name_pending)
{
char unixname[1024];
make_unix_filespec(unixname, name);
! filler(buf, name, &stbuf, 0);
}
! conn.close();
return 0;
}
--- 262,278 ----
finished:
// An error:
! fprintf(stderr, "Error: %s\n", c.get_error());
! c.close();
return 2;
flush:
+ delete m;
if (name_pending)
{
char unixname[1024];
make_unix_filespec(unixname, name);
! filler(buf, unixname, &stbuf, 0);
}
! c.close();
return 0;
}
***************
*** 262,266 ****
int dap_delete_file(const char *path)
{
- dap_connection conn(0);
char vmsname[1024];
char name[80];
--- 281,284 ----
***************
*** 268,275 ****
int size;
- ret = dap_connect(conn);
- if (ret)
- return ret;
-
make_vms_filespec(path, vmsname, 0);
--- 286,289 ----
***************
*** 282,303 ****
// Wait for ACK or status
! dap_message *m = dap_message::read_message(conn, true);
! if (m)
! {
switch (m->get_type())
{
case dap_message::ACCOMP:
! case dap_message::ACK:
! ret = 0;
case dap_message::STATUS:
{
dap_status_message *sm = (dap_status_message *)m;
! ret = -EPERM; // Default error!
}
}
}
!
! conn.close();
return ret;
}
--- 296,321 ----
// Wait for ACK or status
! ret = 0;
! while(1) {
! dap_message *m = dap_message::read_message(conn, true);
!
switch (m->get_type())
{
case dap_message::ACCOMP:
! goto end;
! break;
case dap_message::STATUS:
{
dap_status_message *sm = (dap_status_message *)m;
! if (sm->get_code() & 1 != 1)
! ret = -EPERM; // Default error!
! goto end;
}
+ break;
}
+ delete m;
}
! end:
return ret;
}
***************
*** 305,309 ****
int dap_rename_file(const char *from, const char *to)
{
- dap_connection conn(0);
char vmsfrom[1024];
char vmsto[1024];
--- 323,326 ----
***************
*** 311,318 ****
int size;
- ret = dap_connect(conn);
- if (ret)
- return ret;
-
make_vms_filespec(from, vmsfrom, 0);
make_vms_filespec(to, vmsto, 0);
--- 328,331 ----
***************
*** 333,344 ****
// Wait for ACK or status
! dap_message *m = dap_message::read_message(conn, true);
! if (m)
! {
switch (m->get_type())
{
case dap_message::ACCOMP:
! case dap_message::ACK:
! ret = 0;
case dap_message::STATUS:
--- 346,356 ----
// Wait for ACK or status
! ret = 0;
! while (1) {
! dap_message *m = dap_message::read_message(conn, true);
switch (m->get_type())
{
case dap_message::ACCOMP:
! goto end;
case dap_message::STATUS:
***************
*** 349,354 ****
}
}
!
! conn.close();
return ret;
}
--- 361,371 ----
}
}
! end:
return ret;
}
+
+
+ int dap_init()
+ {
+ return dap_connect(conn);
+ }
Index: dapfs_dap.h
===================================================================
RCS file: /cvsroot/linux-decnet/dnprogs/dapfs/dapfs_dap.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -r1.2 -r1.3
*** dapfs_dap.h 12 Oct 2005 12:57:43 -0000 1.2
--- dapfs_dap.h 13 Oct 2005 09:50:23 -0000 1.3
***************
*** 9,12 ****
--- 9,13 ----
int dap_delete_file(const char *path);
int dap_rename_file(const char *from, const char *to);
+ int dap_init(void);
#ifdef __cplusplus
Index: filenames.c
===================================================================
RCS file: /cvsroot/linux-decnet/dnprogs/dapfs/filenames.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -r1.1 -r1.2
*** filenames.c 12 Oct 2005 10:31:31 -0000 1.1
--- filenames.c 13 Oct 2005 09:50:23 -0000 1.2
***************
*** 136,140 ****
if (!strchr(lastslash, '.'))
strcat(fullname, ".");
!
// If it's a directory then add .DIR;1
if (lstat(unixname, &st)==0 && S_ISDIR(st.st_mode))
--- 136,140 ----
if (!strchr(lastslash, '.'))
strcat(fullname, ".");
! #if 0
// If it's a directory then add .DIR;1
if (lstat(unixname, &st)==0 && S_ISDIR(st.st_mode))
***************
*** 151,155 ****
strcat(fullname, ";1");
}
!
// If we were only asked for the short name then return that bit now
if (!full)
--- 151,155 ----
strcat(fullname, ";1");
}
! #endif
// If we were only asked for the short name then return that bit now
if (!full)
|