diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2019-01-05 21:50:48 +0100 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2019-01-06 20:30:14 +0100 |
commit | 91b264c76c34290a31b14844e59bac0deeb62afd (patch) | |
tree | 24983b95f8a7f5239827ac629bda64d58714ddbd | |
parent | 26d953689337a93c31c55083c2073f309ba33c38 (diff) | |
download | cygnal-91b264c76c34290a31b14844e59bac0deeb62afd.tar.gz cygnal-91b264c76c34290a31b14844e59bac0deeb62afd.tar.bz2 cygnal-91b264c76c34290a31b14844e59bac0deeb62afd.zip |
Cygwin: path_conv: add serialization/deserialization facility
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r-- | winsup/cygwin/path.cc | 64 | ||||
-rw-r--r-- | winsup/cygwin/path.h | 3 |
2 files changed, 67 insertions, 0 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 563ba0e80..df11d5339 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -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) diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h index b244b57b7..1e3095ec9 100644 --- a/winsup/cygwin/path.h +++ b/winsup/cygwin/path.h @@ -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;} |