]> sourceware.org Git - newlib-cygwin.git/commitdiff
Cygwin: path_conv: add serialization/deserialization facility
authorCorinna Vinschen <corinna@vinschen.de>
Sat, 5 Jan 2019 20:50:48 +0000 (21:50 +0100)
committerCorinna Vinschen <corinna@vinschen.de>
Sun, 6 Jan 2019 19:30:14 +0000 (20:30 +0100)
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
winsup/cygwin/path.cc
winsup/cygwin/path.h

index 563ba0e800aa98ba2dc7876a88ef6d9c4c8aa3f9..df11d533937e551a581848e510ac1c3a31e47e1f 100644 (file)
@@ -1258,6 +1258,70 @@ path_conv::check (const char *src, unsigned opt,
   __endtry
 }
 
+struct pc_flat
+{
+  path_conv pc;
+  HANDLE hdl;
+  size_t name_len;
+  size_t posix_len;
+  char data[0];
+};
+
+void *
+path_conv::serialize (HANDLE h, unsigned int &n) const
+{
+  pc_flat *pcf;
+  size_t nlen = 0, plen = 0;
+  char *p;
+
+  if (path)
+    nlen = strlen (path) + 1;
+  if (posix_path)
+    plen = strlen (posix_path) + 1;
+  n = sizeof (pc_flat) + nlen + plen;
+  pcf = (pc_flat *) cmalloc (HEAP_COMMUNE, n);
+  if (!pcf)
+    {
+      n = 0;
+      return NULL;
+    }
+  memcpy (&pcf->pc, this, sizeof *this);
+  pcf->hdl = h;
+  pcf->name_len = nlen;
+  pcf->posix_len = plen;
+  p = pcf->data;
+  if (nlen)
+    p = stpcpy (p, path) + 1;
+  if (plen)
+    stpcpy (p, posix_path);
+  return pcf;
+}
+
+HANDLE
+path_conv::deserialize (void *bufp)
+{
+  pc_flat *pcf = (pc_flat *) bufp;
+  char *p;
+  HANDLE ret;
+
+  memcpy (this, &pcf->pc, sizeof *this);
+  wide_path = uni_path.Buffer = NULL;
+  uni_path.MaximumLength = uni_path.Length = 0;
+  path = posix_path = NULL;
+  p = pcf->data;
+  if (pcf->name_len)
+    {
+      set_path (p);
+      p += pcf->name_len;
+    }
+  if (pcf->posix_len)
+    set_posix (p);
+  dev.parse (pcf->pc.dev);
+  ret = pcf->hdl;
+  cfree (bufp);
+  return ret;
+}
+
 path_conv::~path_conv ()
 {
   if (posix_path)
index b244b57b740af3703c71c1de05c78b2d1270dca5..1e3095ec9ca79034605e547c619f33f574f7811e 100644 (file)
@@ -160,6 +160,9 @@ class path_conv
   int error;
   device dev;
 
+  void *serialize (HANDLE, unsigned int &) const;
+  HANDLE deserialize (void *);
+
   const char *known_suffix () { return suffix; }
   bool isremote () const {return fs.is_remote_drive ();}
   ULONG objcaseinsensitive () const {return caseinsensitive;}
This page took 0.035684 seconds and 5 git commands to generate.