| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- /*
- * Implementation of Filename for Windows.
- */
- #include "putty.h"
- #ifdef MPEXT
- #include <assert.h>
- #endif
- Filename *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 WINSCP
- const 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;
- }
- #endif
- const 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 WINSCP
- FILE * 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
|