]> git.ipfire.org Git - thirdparty/open-vm-tools.git/commitdiff
Changes in shared code that don't affect open-vm-tools functionality.
authorVMware, Inc <>
Tue, 28 Jun 2011 19:54:23 +0000 (12:54 -0700)
committerMarcelo Vanzin <mvanzin@vmware.com>
Tue, 28 Jun 2011 19:54:23 +0000 (12:54 -0700)
Signed-off-by: Marcelo Vanzin <mvanzin@vmware.com>
open-vm-tools/lib/file/fileIOPosix.c
open-vm-tools/lib/include/escape.h
open-vm-tools/lib/misc/escape.c

index 0d1936b4071b00b8eee56040c0aeb139ac41c243..6e02cbe8a5ce28dedde6032e953617e02e424d8a 100644 (file)
 
 #if defined(__APPLE__)
 #include <sys/sysctl.h>
+
+/*
+ * F_NODIRECT was added in Mac OS 10.7.0 "Lion".  We test at runtime for the
+ * right version before using it, but we also need to get the definition.
+ */
+
+#include <sys/fcntl.h>
+
+#ifndef F_NODIRECT
+#define F_NODIRECT 62
+#endif
+
 #endif
 
 /*
@@ -918,6 +930,20 @@ FileIOCreateRetry(FileIODescriptor *file,   // OUT:
          ret = FileIOErrno2Result(errno);
          goto error;
       }
+
+      if (!(access & FILEIO_OPEN_SYNC)) {
+         /*
+          * F_NODIRECT was added in Mac OS 10.7.0 "Lion" which has Darwin
+          * kernel 11.0.0.
+          */
+         if (Hostinfo_OSVersion(0) >= 11) {
+            error = fcntl(fd, F_NODIRECT, 1);
+            if (error == -1) {
+               ret = FileIOErrno2Result(errno);
+               goto error;
+            }
+         }
+      }
    }
 #endif
 
index 38b2a946be525d411be584cb61e9ca2acf43ec41..baca9c5ffcd477c360b2b40d33e8b46d8b5893a1 100644 (file)
@@ -32,20 +32,20 @@ Escape_DoString(const char *escStr,    // IN
                 int const *bytesToEsc, // IN
                 void const *bufIn,     // IN
                 size_t sizeIn,         // IN
-                size_t *sizeOut);      // OUT
+                size_t *sizeOut);      // OUT/OPT
 
 void *
 Escape_Do(char escByte,          // IN
           int const *bytesToEsc, // IN
           void const *bufIn,     // IN
           size_t sizeIn,         // IN
-          size_t *sizeOut);      // OUT
+          size_t *sizeOut);      // OUT/OPT
 
 void *
 Escape_Undo(char escByte,      // IN
             void const *bufIn, // IN
             size_t sizeIn,     // IN
-            size_t *sizeOut);  // OUT
+            size_t *sizeOut);  // OUT/OPT
 
 const char *
 Escape_Strchr(char escByte,      // IN
@@ -59,12 +59,17 @@ Escape_Unescape(char escByte,       // IN
 void *
 Escape_AnsiToUnix(void const *bufIn, // IN
                   size_t sizeIn,     // IN
-                  size_t *sizeOut);  // OUT
+                  size_t *sizeOut);  // OUT/OPT
 
 void *
 Escape_Sh(void const *bufIn, // IN
           size_t sizeIn,     // IN
-          size_t *sizeOut);  // OUT
+          size_t *sizeOut);  // OUT/OPT
+
+void *
+Escape_BRE(void const *bufIn, // IN
+           size_t sizeIn,     // IN
+           size_t *sizeOut);  // OUT/OPT
 
 void
 Escape_UnescapeCString(char *buf); // IN/OUT
index 0d460879dd694d88533ff04cdc027d54eac06812..5d33ef2244cf764982d7713d1cbd0e706fdafbf7 100644 (file)
@@ -91,7 +91,7 @@ Escape_DoString(const char *escStr,    // IN
                 int const *bytesToEsc, // IN
                 void const *bufIn,     // IN
                 size_t sizeIn,         // IN
-                size_t *sizeOut)       // OUT
+                size_t *sizeOut)       // OUT/OPT
 {
    char const *buf;
    DynBuf b;
@@ -180,7 +180,7 @@ Escape_Do(char escByte,          // IN
           int const *bytesToEsc, // IN
           void const *bufIn,     // IN
           size_t sizeIn,         // IN
-          size_t *sizeOut)       // OUT
+          size_t *sizeOut)       // OUT/OPT
 {
    const char escStr[] = { escByte, '\0' };
 
@@ -211,7 +211,7 @@ void *
 Escape_Undo(char escByte,      // IN
             void const *bufIn, // IN
             size_t sizeIn,     // IN
-            size_t *sizeOut)   // OUT
+            size_t *sizeOut)   // OUT/OPT
 {
    char const *buf;
    DynBuf b;
@@ -311,7 +311,7 @@ nem:
 void *
 Escape_AnsiToUnix(void const *bufIn, // IN
                   size_t sizeIn,     // IN
-                  size_t *sizeOut)   // OUT
+                  size_t *sizeOut)   // OUT/OPT
 {
    char const *buf;
    DynBuf b;
@@ -427,8 +427,8 @@ main(int argc,
  *
  * Escape_Sh --
  *
- *    Escape a buffer so that it is passed as one argument on a sh command
- *    line --hpreg
+ *    Escape a buffer so that it can be passed verbatim as part of an argument
+ *    on a shell command line.
  *
  * Results:
  *    The escaped, allocated, NUL terminated buffer on success. If not NULL,
@@ -445,7 +445,7 @@ main(int argc,
 void *
 Escape_Sh(void const *bufIn, // IN
           size_t sizeIn,     // IN
-          size_t *sizeOut)   // OUT
+          size_t *sizeOut)   // OUT/OPT
 {
    static const char be[] = { '\'', };
    static const char escSeq[] = { '\'', '"', '\'', '"', };
@@ -500,6 +500,104 @@ nem:
 }
 
 
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Escape_BRE --
+ *
+ *    Escape a buffer so that it can be passed verbatim as part of a Basic
+ *    (a.k.a. obsolete) Regular Expression.
+ *
+ * Results:
+ *    The escaped, allocated, NUL terminated buffer on success. If not NULL,
+ *     '*sizeOut' contains the size of the buffer (excluding the NUL
+ *     terminator)
+ *    NULL on failure (not enough memory)
+ *
+ * Side effects:
+ *    None
+ *
+ *-----------------------------------------------------------------------------
+ */
+
+void *
+Escape_BRE(void const *bufIn, // IN
+           size_t sizeIn,     // IN
+           size_t *sizeOut)   // OUT/OPT
+{
+   static const char escByte = '\\';
+   /* Escape ] [ ^ . * $ and 'escByte'. */
+   static const int bytesToEsc[] = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+   };
+   char const *buf;
+   DynBuf b;
+   size_t startUnescaped;
+   size_t index;
+
+   /* Unsigned does matter. */
+   ASSERT(bytesToEsc[(unsigned char)escByte]);
+
+   buf = (char const *)bufIn;
+   ASSERT(buf);
+
+   DynBuf_Init(&b);
+   startUnescaped = 0;
+
+   for (index = 0; index < sizeIn; index++) {
+      /* Unsigned does matter. */
+      unsigned char ubyte;
+
+      ubyte = buf[index];
+      if (bytesToEsc[ubyte]) {
+         /* We must escape that byte. */
+
+         if (DynBuf_Append(&b, &buf[startUnescaped],
+                           index - startUnescaped) == FALSE ||
+             DynBuf_Append(&b, &escByte, sizeof escByte) == FALSE) {
+            goto nem;
+         }
+         startUnescaped = index;
+      }
+   }
+
+   if (/* Last unescaped chunk (if any). */
+       DynBuf_Append(&b, &buf[startUnescaped],
+                     index - startUnescaped) == FALSE ||
+       /* NUL terminator. */
+       DynBuf_Append(&b, "", 1) == FALSE ||
+       DynBuf_Trim(&b) == FALSE) {
+      goto nem;
+   }
+
+   if (sizeOut) {
+      *sizeOut = DynBuf_GetSize(&b) - 1;
+   }
+
+   return DynBuf_Get(&b);
+
+nem:
+   DynBuf_Destroy(&b);
+
+   return NULL;
+}
+
+
 /*
  *-----------------------------------------------------------------------------
  *