X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Futil%2Fos_file.c;h=5771b27e5d0730d33a0a3a95235c2432320eb9a8;hb=50c2c76ea31edf987594e8b811b7d62be71f5a33;hp=a700f3aada3088b6f1164fbc78a7e6f9dc886ac2;hpb=93349d71183d4a50ef5ad90b32cb96b9f84d3eec;p=mesa.git diff --git a/src/util/os_file.c b/src/util/os_file.c index a700f3aada3..5771b27e5d0 100644 --- a/src/util/os_file.c +++ b/src/util/os_file.c @@ -6,14 +6,40 @@ #include "os_file.h" #include +#include #include +#include + + +#if defined(WIN32) +#include +#define open _open +#define fdopen _fdopen +#define O_CREAT _O_CREAT +#define O_EXCL _O_EXCL +#define O_WRONLY _O_WRONLY +#endif + + +FILE * +os_file_create_unique(const char *filename, int filemode) +{ + int fd = open(filename, O_CREAT | O_EXCL | O_WRONLY, filemode); + if (fd == -1) + return NULL; + return fdopen(fd, "w"); +} + #if defined(__linux__) #include #include +#include #include +/* copied from */ +#define KCMP_FILE 0 static ssize_t readN(int fd, char *buf, size_t len) @@ -41,7 +67,7 @@ readN(int fd, char *buf, size_t len) } char * -os_read_file(const char *filename) +os_read_file(const char *filename, size_t *size) { /* Note that this also serves as a slight margin to avoid a 2x grow when * the file is just a few bytes larger when we read it than when we @@ -92,18 +118,56 @@ os_read_file(const char *filename) if (actually_read > 0) offset += actually_read; + /* Final resize to actual size */ + len = offset + 1; + char *newbuf = realloc(buf, len); + if (!newbuf) { + free(buf); + errno = -ENOMEM; + return NULL; + } + buf = newbuf; + buf[offset] = '\0'; + if (size) + *size = offset; + return buf; } +int +os_same_file_description(int fd1, int fd2) +{ + pid_t pid = getpid(); + + /* Same file descriptor trivially implies same file description */ + if (fd1 == fd2) + return 0; + + return syscall(SYS_kcmp, pid, pid, KCMP_FILE, fd1, fd2); +} + #else +#include "u_debug.h" + char * -os_read_file(const char *filename) +os_read_file(const char *filename, size_t *size) { errno = -ENOSYS; return NULL; } +int +os_same_file_description(int fd1, int fd2) +{ + /* Same file descriptor trivially implies same file description */ + if (fd1 == fd2) + return 0; + + /* Otherwise we can't tell */ + return -1; +} + #endif