|
@@ -312,6 +312,7 @@ enum {
|
|
|
RFCsetthrottle, // legacy version
|
|
|
// 1.9
|
|
|
RFCsetthrottle2,
|
|
|
+ RFCsetfileperms,
|
|
|
RFCmax,
|
|
|
RFCunknown = 255 // 0 would have been more sensible, but can't break backward compatibility
|
|
|
};
|
|
@@ -359,6 +360,7 @@ const char *RFCStrings[] =
|
|
|
RFCText(RFCtreecopytmp),
|
|
|
RFCText(RFCsetthrottle), // legacy version
|
|
|
RFCText(RFCsetthrottle2),
|
|
|
+ RFCText(RFCsetfileperms),
|
|
|
RFCText(RFCunknown),
|
|
|
};
|
|
|
static const char *getRFCText(RemoteFileCommandType cmd) { return RFCStrings[cmd]; }
|
|
@@ -1743,6 +1745,14 @@ public:
|
|
|
sendRemoteCommand(sendBuffer, replyBuffer);
|
|
|
}
|
|
|
|
|
|
+ void setFilePermissions(unsigned fPerms)
|
|
|
+ {
|
|
|
+ MemoryBuffer sendBuffer;
|
|
|
+ initSendBuffer(sendBuffer);
|
|
|
+ MemoryBuffer replyBuffer;
|
|
|
+ sendBuffer.append((RemoteFileCommandType)RFCsetfileperms).append(filename).append(fPerms);
|
|
|
+ sendRemoteCommand(sendBuffer, replyBuffer);
|
|
|
+ }
|
|
|
|
|
|
offset_t size()
|
|
|
{
|
|
@@ -2981,6 +2991,10 @@ inline void appendErr3(MemoryBuffer &reply, RemoteFileCommandType e, int code, c
|
|
|
{
|
|
|
StringBuffer msg;
|
|
|
msg.appendf("ERROR: %s(%d) '%s'", getRFCText(e), code, errMsg?errMsg:"");
|
|
|
+ // some errors are RemoteFileCommandType, some are RFSERR_*
|
|
|
+ // RFCOpenIO needs remapping to non-zero for client to know its an error
|
|
|
+ if ((RemoteFileCommandType)e == RFCopenIO)
|
|
|
+ e = (RemoteFileCommandType)RFSERR_OpenFailed;
|
|
|
reply.append((unsigned)e);
|
|
|
reply.append(msg.str());
|
|
|
}
|
|
@@ -4339,6 +4353,20 @@ public:
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ bool cmdSetFilePerms(MemoryBuffer &msg, MemoryBuffer &reply, CRemoteClientHandler &client)
|
|
|
+ {
|
|
|
+ IMPERSONATE_USER(client);
|
|
|
+ StringAttr name;
|
|
|
+ unsigned fPerms;
|
|
|
+ msg.read(name).read(fPerms);
|
|
|
+ if (TF_TRACE)
|
|
|
+ PROGLOG("setFilePerms, '%s' 0%o",name.get(),fPerms);
|
|
|
+ Owned<IFile> file=createIFile(name);
|
|
|
+ file->setFilePermissions(fPerms);
|
|
|
+ reply.append((unsigned)RFEnoerror);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
bool cmdGetTime(MemoryBuffer &msg, MemoryBuffer &reply, CRemoteClientHandler &client)
|
|
|
{
|
|
|
IMPERSONATE_USER(client);
|
|
@@ -4889,6 +4917,7 @@ public:
|
|
|
case RFCisdirectory:
|
|
|
case RFCisreadonly:
|
|
|
case RFCsetreadonly:
|
|
|
+ case RFCsetfileperms:
|
|
|
case RFCgettime:
|
|
|
case RFCsettime:
|
|
|
case RFCcreatedir:
|
|
@@ -4940,6 +4969,7 @@ public:
|
|
|
MAPCOMMANDCLIENT(RFCisdirectory, cmdIsDir, *client);
|
|
|
MAPCOMMANDCLIENT(RFCisreadonly, cmdIsReadOnly, *client);
|
|
|
MAPCOMMANDCLIENT(RFCsetreadonly, cmdSetReadOnly, *client);
|
|
|
+ MAPCOMMANDCLIENT(RFCsetfileperms, cmdSetFilePerms, *client);
|
|
|
MAPCOMMANDCLIENT(RFCgettime, cmdGetTime, *client);
|
|
|
MAPCOMMANDCLIENT(RFCsettime, cmdSetTime, *client);
|
|
|
MAPCOMMANDCLIENT(RFCcreatedir, cmdCreateDir, *client);
|