aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rfsv16.cc
diff options
context:
space:
mode:
authorFritz Elfert <felfert@to.com>2001-02-02 04:49:20 +0000
committerFritz Elfert <felfert@to.com>2001-02-02 04:49:20 +0000
commit9fac7af37460c6a73a7debac1ba82b094a8f066c (patch)
treec6ef3e0ebd088c62348f140289f82482d82db1cf /lib/rfsv16.cc
parent4da48658c8f1dfbf5960bb1768dc6d154c528734 (diff)
downloadplptools-9fac7af37460c6a73a7debac1ba82b094a8f066c.tar.gz
plptools-9fac7af37460c6a73a7debac1ba82b094a8f066c.tar.bz2
plptools-9fac7af37460c6a73a7debac1ba82b094a8f066c.zip
Replaced lot of ugly char * by string.
Fixed bug in plpftp's filename-completion, which was introduced yesterday. Added a class PlpUID for dealing with application-UIDs Added UID->mimetype mapping in kioslave.
Diffstat (limited to 'lib/rfsv16.cc')
-rw-r--r--lib/rfsv16.cc140
1 files changed, 37 insertions, 103 deletions
diff --git a/lib/rfsv16.cc b/lib/rfsv16.cc
index d42b270..c4798eb 100644
--- a/lib/rfsv16.cc
+++ b/lib/rfsv16.cc
@@ -30,7 +30,7 @@
#include <stream.h>
#include <stdlib.h>
#include <fstream.h>
-#include <iomanip.h>
+#include <iomanip>
#include <time.h>
#include <string>
@@ -50,55 +50,13 @@ rfsv16::rfsv16(ppsocket *_skt)
}
Enum<rfsv::errs> rfsv16::
-convertName(const char* orig, char *retVal)
-{
- int len = strlen(orig);
- char *temp = new char [len+1];
-
- // FIXME: need to return 1 if OOM?
- for (int i=0; i <= len; i++) {
- if (orig[i] == '/')
- temp[i] = '\\';
- else
- temp[i] = orig[i];
- }
-
- if (len == 0 || temp[1] != ':') {
- // We can automatically supply a drive letter
- strcpy(retVal, DDRIVE);
-
- if (len == 0 || temp[0] != '\\') {
- strcat(retVal, DBASEDIR);
- }
- else {
- retVal[strlen(retVal)-1] = 0;
- }
-
- strcat(retVal, temp);
- }
- else {
- strcpy(retVal, temp);
- }
-
- delete [] temp;
- cout << retVal << endl;
- return E_PSI_GEN_NONE;
-}
-
-Enum<rfsv::errs> rfsv16::
fopen(long attr, const char *name, long &handle)
{
bufferStore a;
- char realName[200];
- Enum<rfsv::errs> rv = convertName(name, realName);
- if (rv) return rv;
-
- // FIXME: anything that calls fopen should NOT do the name
- // conversion - it's just done here.
+ string realName = convertSlash(name);
a.addWord(attr & 0xFFFF);
- a.addString(realName);
- a.addByte(0x00); // Needs to be manually Null-Terminated.
+ a.addStringT(realName.c_str());
if (!sendCommand(FOPEN, a))
return E_PSI_FILE_DISC;
@@ -197,11 +155,11 @@ readdir(rfsvDirhandle &dH, PlpDirent &e) {
cerr << "dir: not version 2" << endl;
return E_PSI_GEN_FAIL;
}
- e.attr = attr2std((long)dH.b.getWord(2));
- e.size = dH.b.getDWord(4);
- e.time = PsiTime((time_t)dH.b.getDWord(8));
- e.name = dH.b.getString(16);
- e.uid[0] = e.uid[1] = e.uid[2] = 0;
+ e.attr = attr2std((long)dH.b.getWord(2));
+ e.size = dH.b.getDWord(4);
+ e.time = PsiTime((time_t)dH.b.getDWord(8));
+ e.name = dH.b.getString(16);
+ // e.UID = PlpUID(0,0,0);
e.attrstr = attr2String(e.attr);
dH.b.discardFirstBytes(17 + e.name.length());
@@ -295,11 +253,8 @@ fgetmtime(const char * const name, PsiTime &mtime)
cerr << "rfsv16::fgetmtime" << endl;
// NB: fgetattr, fgeteattr is almost identical...
bufferStore a;
- char realName[200];
- Enum<rfsv::errs> rv = convertName(name, realName);
- if (rv) return rv;
- a.addString(realName);
- a.addByte(0x00); // needs to be null-terminated,
+ string realName = convertSlash(name);
+ a.addStringT(realName.c_str());
// and this needs sending in the length word.
if (!sendCommand(FINFO, a))
return E_PSI_FILE_DISC;
@@ -310,10 +265,6 @@ cerr << "rfsv16::fgetmtime" << endl;
return res;
}
else if (a.getLen() == 16) {
- // struct timeval tv;
- // tv.tv_sec = a.getDWord(8);
- // tv.tv_usec = 0;
- // mtime.setUnixTime(&tv);
mtime.setUnixTime(a.getDWord(8));
return res;
}
@@ -335,11 +286,8 @@ fgetattr(const char * const name, long &attr)
{
// NB: fgetmtime, fgeteattr are almost identical...
bufferStore a;
- char realName[200];
- Enum<rfsv::errs> rv = convertName(name, realName);
- if (rv) return rv;
- a.addString(realName);
- a.addByte(0x00); // needs to be null-terminated,
+ string realName = convertSlash(name);
+ a.addStringT(realName.c_str());
// and this needs sending in the length word.
if (!sendCommand(FINFO, a))
return E_PSI_FILE_DISC;
@@ -358,28 +306,29 @@ fgetattr(const char * const name, long &attr)
}
Enum<rfsv::errs> rfsv16::
-fgeteattr(const char * const name, long &attr, long &size, PsiTime &time)
+fgeteattr(const char * const name, PlpDirent &e)
{
bufferStore a;
- char realName[200];
- Enum<rfsv::errs> rv = convertName(name, realName);
- if (rv) return rv;
- a.addString(realName);
- a.addByte(0x00); // needs to be null-terminated,
- // and this needs sending in the length word.
+ string realName = convertSlash(name);
+ a.addStringT(realName.c_str());
if (!sendCommand(FINFO, a))
return E_PSI_FILE_DISC;
-
Enum<rfsv::errs> res = getResponse(a);
if (res != 0) {
cerr << "fgeteattr: Error " << res << " on file " << name << endl;
return res;
}
else if (a.getLen() == 16) {
- attr = a.getWord(2);
- size = a.getDWord(4);
- time.setUnixTime(a.getDWord(8));
- //time = a.getDWord(8);
+ const char *p = strrchr(realName.c_str(), '\\');
+ if (p)
+ p++;
+ else
+ p = realName.c_str();
+ e.name = p;
+ e.attr = a.getWord(2);
+ e.size = a.getDWord(4);
+ e.time = PsiTime(a.getDWord(8));
+ e.UID = PlpUID(0,0,0);
return res;
}
cerr << "fgeteattr: Unknown response (" << name << ") " << a <<endl;
@@ -903,15 +852,11 @@ fseek(const long handle, const long pos, const long mode, long &resultpos)
Enum<rfsv::errs> rfsv16::
mkdir(const char* dirName)
{
- char realName[200];
- Enum<rfsv::errs> res = convertName(dirName, realName);
- if (res != E_PSI_GEN_NONE) return res;
+ string realName = convertSlash(dirName);
bufferStore a;
- a.addString(realName);
- a.addByte(0x00); // needs to be null-terminated,
- // and this needs sending in the length word.
+ a.addStringT(realName.c_str());
sendCommand(MKDIR, a);
- res = getResponse(a);
+ Enum<rfsv::errs> res = getResponse(a);
if (res == E_PSI_GEN_NONE) {
// Correct response
return res;
@@ -932,21 +877,14 @@ Enum<rfsv::errs> rfsv16::
rename(const char *oldName, const char *newName)
{
cerr << "rfsv16::rename ***" << endl;
- char realOldName[200];
- Enum<rfsv::errs> res = convertName(oldName, realOldName);
- if (res != E_PSI_GEN_NONE) return res;
- char realNewName[200];
- res = convertName(newName, realNewName);
- if (res != E_PSI_GEN_NONE) return res;
+
+ string realOldName = convertSlash(oldName);
+ string realNewName = convertSlash(newName);
bufferStore a;
- a.addString(realOldName);
- a.addByte(0x00); // needs to be null-terminated,
- // and this needs sending in the length word.
- a.addString(realNewName);
- a.addByte(0x00); // needs to be null-terminated,
- // and this needs sending in the length word.
+ a.addStringT(realOldName.c_str());
+ a.addStringT(realNewName.c_str());
sendCommand(RENAME, a);
- res = getResponse(a);
+ Enum<rfsv::errs> res = getResponse(a);
if (res == E_PSI_GEN_NONE) {
// Correct response
return res;
@@ -958,12 +896,10 @@ cerr << "rfsv16::rename ***" << endl;
Enum<rfsv::errs> rfsv16::
remove(const char* psionName)
{
- char realName[200];
- Enum<rfsv::errs> res = convertName(psionName, realName);
- if (res != E_PSI_GEN_NONE) return res;
+ Enum<rfsv::errs> res;
+ string realName = convertSlash(psionName);
bufferStore a;
- a.addString(realName);
- a.addByte(0x00); // needs to be null-terminated,
+ a.addStringT(realName.c_str());
// and this needs sending in the length word.
sendCommand(DELETE, a);
res = getResponse(a);
@@ -1054,5 +990,3 @@ std2attr(const long attr)
return res;
}
-
-