return dupstr(getenv("DISPLAY"));
}
-Filename filename_from_str(const char *str)
+Filename *filename_from_str(const char *str)
{
- Filename ret;
- strncpy(ret.path, str, sizeof(ret.path));
- ret.path[sizeof(ret.path)-1] = '\0';
+ Filename *ret = snew(Filename);
+ ret->path = dupstr(str);
return ret;
}
+Filename *filename_copy(const Filename *fn)
+{
+ return filename_from_str(fn->path);
+}
+
const char *filename_to_str(const Filename *fn)
{
return fn->path;
}
-int filename_equal(Filename f1, Filename f2)
+int filename_equal(const Filename *f1, const Filename *f2)
+{
+ return !strcmp(f1->path, f2->path);
+}
+
+int filename_is_null(const Filename *fn)
{
- return !strcmp(f1.path, f2.path);
+ return !*fn->path;
}
-int filename_is_null(Filename fn)
+void filename_free(Filename *fn)
+{
+ sfree(fn->path);
+ sfree(fn);
+}
+
+int filename_serialise(const Filename *f, void *vdata)
+{
+ char *data = (char *)vdata;
+ int len = strlen(f->path) + 1; /* include trailing NUL */
+ if (data) {
+ strcpy(data, f->path);
+ }
+ return len;
+}
+Filename *filename_deserialise(void *vdata, int maxsize, int *used)
{
- return !*fn.path;
+ char *data = (char *)vdata;
+ char *end;
+ end = memchr(data, '\0', maxsize);
+ if (!end)
+ return NULL;
+ end++;
+ *used = end - data;
+ return filename_from_str(data);
}
+#ifndef NO_SECUREZEROMEMORY
+/*
+ * Windows implementation of smemclr (see misc.c) using SecureZeroMemory.
+ */
+void smemclr(void *b, size_t n) {
+ if (b && n > 0)
+ SecureZeroMemory(b, n);
+}
+#endif
+
char *get_username(void)
{
DWORD namelen;
return ret;
}
+/*
+ * A tree234 containing mappings from system error codes to strings.
+ */
+
+struct errstring {
+ int error;
+ char *text;
+};
+
+static int errstring_find(void *av, void *bv)
+{
+ int *a = (int *)av;
+ struct errstring *b = (struct errstring *)bv;
+ if (*a < b->error)
+ return -1;
+ if (*a > b->error)
+ return +1;
+ return 0;
+}
+static int errstring_compare(void *av, void *bv)
+{
+ struct errstring *a = (struct errstring *)av;
+ return errstring_find(&a->error, bv);
+}
+
+static tree234 *errstrings = NULL;
+
+const char *win_strerror(int error)
+{
+ struct errstring *es;
+
+ if (!errstrings)
+ errstrings = newtree234(errstring_compare);
+
+ es = find234(errstrings, &error, errstring_find);
+
+ if (!es) {
+ int bufsize;
+
+ es = snew(struct errstring);
+ es->error = error;
+ /* maximum size for FormatMessage is 64K */
+ bufsize = 65535;
+ es->text = snewn(bufsize, char);
+ if (!FormatMessage((FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS), NULL, error,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ es->text, bufsize, NULL)) {
+ sprintf(es->text,
+ "Windows error code %d (and FormatMessage returned %d)",
+ error, GetLastError());
+ } else {
+ int len = strlen(es->text);
+ if (len > 0 && es->text[len-1] == '\n')
+ es->text[len-1] = '\0';
+ }
+ es->text = sresize(es->text, strlen(es->text) + 1, char);
+ add234(errstrings, es);
+ }
+
+ return es->text;
+}
+
#ifdef DEBUG
static FILE *debug_fp = NULL;
static HANDLE debug_hdl = INVALID_HANDLE_VALUE;