summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/auxiliary/util/u_stream_wd.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/src/gallium/auxiliary/util/u_stream_wd.c b/src/gallium/auxiliary/util/u_stream_wd.c
index 1e135c6ba06..864489e7755 100644
--- a/src/gallium/auxiliary/util/u_stream_wd.c
+++ b/src/gallium/auxiliary/util/u_stream_wd.c
@@ -69,13 +69,13 @@ util_stream_map(struct util_stream *stream)
if(stream->growable)
filename_len = util_snprintf(filename,
sizeof(filename),
- "\\??\\%s.%04x",
+ "%s.%04x",
stream->filename,
stream->suffix++);
else
filename_len = util_snprintf(filename,
sizeof(filename),
- "\\??\\%s",
+ "%s",
stream->filename);
EngMultiByteToUnicodeN(
@@ -111,6 +111,28 @@ util_stream_unmap(struct util_stream *stream)
}
+static INLINE void
+util_stream_full_qualified_filename(char *dst, size_t size, const char *src)
+{
+ boolean need_drive, need_root;
+
+ if((('A' <= src[0] && src[0] <= 'Z') || ('a' <= src[0] && src[0] <= 'z')) && src[1] == ':') {
+ need_drive = FALSE;
+ need_root = src[2] == '\\' ? FALSE : TRUE;
+ }
+ else {
+ need_drive = TRUE;
+ need_root = src[0] == '\\' ? FALSE : TRUE;
+ }
+
+ util_snprintf(dst, size,
+ "\\??\\%s%s%s",
+ need_drive ? "C:" : "",
+ need_root ? "\\" : "",
+ src);
+}
+
+
struct util_stream *
util_stream_create(const char *filename, size_t max_size)
{
@@ -120,7 +142,9 @@ util_stream_create(const char *filename, size_t max_size)
if(!stream)
goto error1;
- strncpy(stream->filename, filename, sizeof(stream->filename));
+ util_stream_full_qualified_filename(stream->filename,
+ sizeof(stream->filename),
+ filename);
if(max_size) {
stream->growable = FALSE;