Cygwin: path_conv: add serialization/deserialization facility

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2019-01-05 21:50:48 +01:00
parent 26d9536893
commit 91b264c76c
2 changed files with 67 additions and 0 deletions

View 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)

View 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;}