| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 | /* * Implementation of Filename for Windows. */#include "putty.h"#ifdef MPEXT#include <assert.h>#endifFilename *filename_from_str(const char *str){    Filename *ret = snew(Filename);    ret->path = dupstr(str);    return ret;}Filename *filename_copy(const Filename *fn){    return filename_from_str(fn->path);}#ifdef WINSCPconst char* in_memory_key_data(const Filename *fn){    const char* result = fn->path;    if (result[0] != '@')    {        result = NULL;    }    else    {        int len;        result++;        len = strlen(result);        if (((len % 2) != 0) ||            ((len / 2) < MAX_PATH))        {            result = NULL;        }        else        {            int i;            for (i = 0; (result != NULL) && (i < len); i++)            {                 if (!isxdigit(result[i]))                 {                     result = NULL;                 }            }        }    }    return result;}#endifconst char *filename_to_str(const Filename *fn){    #ifdef WINSCP    if (in_memory_key_data(fn) != NULL) return "in-memory";    #endif    return fn->path;}bool filename_equal(const Filename *f1, const Filename *f2){    return !strcmp(f1->path, f2->path);}bool filename_is_null(const Filename *fn){    return !*fn->path;}void filename_free(Filename *fn){    sfree(fn->path);    sfree(fn);}void filename_serialise(BinarySink *bs, const Filename *f){    put_asciz(bs, f->path);}Filename *filename_deserialise(BinarySource *src){    return filename_from_str(get_asciz(src));}char filename_char_sanitise(char c){    if (strchr("<>:\"/\\|?*", c))        return '.';    return c;}#ifdef WINSCPFILE * mp_wfopen(const char *filename, const char *mode){    size_t len = strlen(filename);    wchar_t * wfilename = snewn(len * 10, wchar_t);    size_t wlen = MultiByteToWideChar(CP_UTF8, 0, filename, -1, wfilename, len * 10);    FILE * file;    if (wlen <= 0)    {        file = NULL;    }    else    {        wchar_t wmode[3];        memset(wmode, 0, sizeof(wmode));        wmode[0] = (wchar_t)mode[0];        if (mode[0] != '\0')        {            wmode[1] = (wchar_t)mode[1];            if (mode[1] != '\0')            {                assert(mode[2] == '\0');            }        }        file = _wfopen(wfilename, wmode);    }    sfree(wfilename);    return file;}#endif
 |