Kaynağa Gözat

HPCC-14832 File perms and umask correclty honored for local and remote

Signed-off-by: Mark Kelly <mark.kelly@lexisnexis.com>
Mark Kelly 9 yıl önce
ebeveyn
işleme
7b162d4a1b

+ 1 - 1
common/remote/hooks/git/gitfile.cpp

@@ -241,7 +241,7 @@ public:
     virtual bool setCompression(bool set) { UNIMPLEMENTED; }
     virtual offset_t compressedSize() { UNIMPLEMENTED; }
     virtual unsigned getCRC() { UNIMPLEMENTED; }
-    virtual void setCreateFlags(unsigned cflags) { UNIMPLEMENTED; }
+    virtual void setCreateFlags(unsigned short cflags) { UNIMPLEMENTED; }
     virtual void setShareMode(IFSHmode shmode) { UNIMPLEMENTED; }
     virtual bool createDirectory() { UNIMPLEMENTED; }
     virtual IDirectoryDifferenceIterator *monitorDirectory(

+ 1 - 1
common/remote/hooks/libarchive/archive.cpp

@@ -402,7 +402,7 @@ public:
     virtual bool setCompression(bool set) { UNIMPLEMENTED; }
     virtual offset_t compressedSize() { UNIMPLEMENTED; }
     virtual unsigned getCRC() { UNIMPLEMENTED; }
-    virtual void setCreateFlags(unsigned cflags) { UNIMPLEMENTED; }
+    virtual void setCreateFlags(unsigned short cflags) { UNIMPLEMENTED; }
     virtual void setShareMode(IFSHmode shmode) { UNIMPLEMENTED; }
     virtual bool createDirectory() { UNIMPLEMENTED; }
     virtual IDirectoryDifferenceIterator *monitorDirectory(

+ 32 - 5
common/remote/sockfile.cpp

@@ -1530,7 +1530,7 @@ public:
     CRemoteFile(const SocketEndpoint &_ep, const char * _filename)
         : CRemoteBase(_ep, _filename)
     {
-        flags = ((unsigned)IFSHread)|((S_IRUSR|S_IWUSR)<<16);
+        flags = ((unsigned)IFSHread)|((S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)<<16);
     }
 
     bool exists()
@@ -1920,9 +1920,15 @@ public:
         return crc;
     }
 
-    void setCreateFlags(unsigned cflags)
+    void setCreateFlags(unsigned short cflags)
     {
-        flags |= (cflags<<16);
+        flags &= 0xffff;
+        flags |= ((unsigned)cflags<<16);
+    }
+
+    unsigned short getCreateFlags()
+    {
+        return (unsigned short)(flags>>16);
     }
 
     void setShareMode(IFSHmode shmode)
@@ -1931,6 +1937,11 @@ public:
         flags |= (unsigned)(shmode&(IFSHfull|IFSHread));
     }
 
+    unsigned short getShareMode()
+    {
+        return (unsigned short)(flags&0xffff);
+    }
+
     void remoteExtractBlobElements(const char * prefix, ExtractedBlobArray & extracted)
     {
         MemoryBuffer sendBuffer;
@@ -2208,7 +2219,10 @@ public:
         const char *localname = parent->queryLocalName();
         localname = skipSpecialPath(localname);
         // also send _extraFlags
-        sendBuffer.append((RemoteFileCommandType)RFCopenIO).append(localname).append((byte)_mode).append((byte)_compatmode).append((byte)_extraFlags);
+        // then also send sMode, cFlags
+        unsigned short sMode = parent->getShareMode();
+        unsigned short cFlags = parent->getCreateFlags();
+        sendBuffer.append((RemoteFileCommandType)RFCopenIO).append(localname).append((byte)_mode).append((byte)_compatmode).append((byte)_extraFlags).append(sMode).append(cFlags);
         parent->sendRemoteCommand(sendBuffer, replyBuffer);
 
         replyBuffer.read(handle);
@@ -3996,8 +4010,15 @@ public:
         msg.read(name->text).read(mode).read(share);  
         // also try to recv extra byte
         byte extra = 0;
+        unsigned short sMode = IFUnone;
+        unsigned short cFlags = IFUnone;
         if (msg.remaining() >= sizeof(byte))
+        {
             msg.read(extra);
+            // and then try to recv extra sMode, cFlags (always sent together)
+            if (msg.remaining() >= (sizeof(sMode) + sizeof(cFlags)))
+                msg.read(sMode).read(cFlags);
+        }
         IFEflags extraFlags = (IFEflags)extra;
         // none => nocache for remote (hint)
         // can revert to previous behavior with conf file setting "allow_pgcache_flush=false"
@@ -4023,8 +4044,14 @@ public:
             file->setShareMode(IFSHfull);
             break;
         }
+        // use sMode, cFlags if sent
+        if (sMode != IFUnone && cFlags != IFUnone)
+        {
+            file->setCreateFlags(cFlags);
+            file->setShareMode((IFSHmode)sMode);
+        }
         if (TF_TRACE_PRE_IO)
-            PROGLOG("before open file '%s',  (%d,%d,%d)",name->text.get(),(int)mode,(int)share,extraFlags);
+            PROGLOG("before open file '%s',  (%d,%d,%d,%d,0%o)",name->text.get(),(int)mode,(int)share,extraFlags,sMode,cFlags);
         IFileIO *fileio = file->open((IFOmode)mode,extraFlags);
         int handle;
         if (fileio) {

+ 1 - 0
initfiles/etc/DIR_NAME/environment.conf.in

@@ -12,6 +12,7 @@ pid=${PID_PATH}
 log=${LOG_PATH}
 user=${RUNTIME_USER}
 group=${RUNTIME_GROUP}
+#umask=022
 home=${HOME_DIR}
 environment=${ENV_XML_FILE}
 sourcedir=${CONFIG_SOURCE_PATH}

+ 5 - 4
system/jlib/jfile.cpp

@@ -245,12 +245,13 @@ static StringBuffer &getLocalOrRemoteName(StringBuffer &name,const RemoteFilenam
 CFile::CFile(const char * _filename)
 {
     filename.set(_filename);
-    flags = ((unsigned)IFSHread)|((S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)<<16);
+    flags = ((unsigned)IFSHread)|((S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)<<16);
 }
 
-void CFile::setCreateFlags(unsigned cflags)
+void CFile::setCreateFlags(unsigned short cflags)
 {
-    flags |= (cflags<<16);
+    flags &= 0xffff;
+    flags |= ((unsigned)cflags<<16);
 }
 
 void CFile::setShareMode(IFSHmode shmode)
@@ -1498,7 +1499,7 @@ public:
         return ifile->getCRC();
     }
 
-    void setCreateFlags(unsigned cflags)
+    void setCreateFlags(unsigned short cflags)
     {
         ifile->setCreateFlags(cflags);
     }

+ 2 - 1
system/jlib/jfile.hpp

@@ -56,6 +56,7 @@ interface IDirectoryIterator : extends IIteratorOf<IFile>
 #define DEFAULT_COPY_BLKSIZE  0x100000
 enum CFflags { CFnone=0x0, CFflush_read=0x1, CFflush_write=0x2, CFflush_rdwr=0x3 };
 
+#define IFUnone         0xffff
 
 #define IDDIunchanged   1
 #define IDDImodified    2
@@ -99,7 +100,7 @@ interface IFile :extends IInterface
     virtual bool setCompression(bool set) = 0;
     virtual offset_t compressedSize() = 0;
     virtual unsigned getCRC() = 0;
-    virtual void setCreateFlags(unsigned cflags) =0;    // I_S*
+    virtual void setCreateFlags(unsigned short cflags) =0;    // I_S*
     virtual void setShareMode(IFSHmode shmode) =0;
 
 // Directory functions

+ 1 - 1
system/jlib/jfile.ipp

@@ -70,7 +70,7 @@ public:
 
     virtual unsigned getCRC();
 
-    virtual void setCreateFlags(unsigned cflags);
+    virtual void setCreateFlags(unsigned short cflags);
     virtual void setShareMode(IFSHmode shmode);
     virtual bool getInfo(bool &isdir,offset_t &size,CDateTime &modtime);