X-Git-Url: http://git.samba.org/?p=samba.git;a=blobdiff_plain;f=source4%2Flib%2Futil%2Futil_file.c;h=df4cb902f0bf9b8c95d9de5cbe88e308ba1a2784;hp=430472f25a42dc28757897823567d9fea1f75dc2;hb=4b71c210d5aa01fc5934ea1777a1c8a7ed1e1f37;hpb=af30a32b6924b0f2b701186e435defbca2ebd1aa diff --git a/source4/lib/util/util_file.c b/source4/lib/util/util_file.c index 430472f25a4..df4cb902f0b 100644 --- a/source4/lib/util/util_file.c +++ b/source4/lib/util/util_file.c @@ -7,7 +7,7 @@ * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) + * Software Foundation; either version 3 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT @@ -82,6 +82,7 @@ _PUBLIC_ char *fgets_slash(char *s2,int maxlen,XFILE *f) case ' ': if (start_of_line) break; + /* fall through */ default: start_of_line = False; s[len++] = c; @@ -124,6 +125,10 @@ _PUBLIC_ char *afdgets(int fd, TALLOC_CTX *mem_ctx, size_t hint) ret = read(fd, data + offset, hint); + if (ret == 0) { + return NULL; + } + if (ret == -1) { talloc_free(data); return NULL; @@ -236,6 +241,7 @@ _PUBLIC_ void *map_file(const char *fname, size_t size) /** parse a buffer into lines +'p' will be freed on error, and otherwise will be made a child of the returned array **/ static char **file_lines_parse(char *p, size_t size, int *numlines, TALLOC_CTX *mem_ctx) { @@ -254,10 +260,9 @@ static char **file_lines_parse(char *p, size_t size, int *numlines, TALLOC_CTX * return NULL; } - talloc_reference(ret, p); + talloc_steal(ret, p); memset(ret, 0, sizeof(ret[0])*(i+2)); - if (numlines) *numlines = i; ret[0] = p; for (s = p, i=0; s < p+size; s++) { @@ -269,6 +274,13 @@ static char **file_lines_parse(char *p, size_t size, int *numlines, TALLOC_CTX * if (s[0] == '\r') s[0] = 0; } + /* remove any blank lines at the end */ + while (i > 0 && ret[i-1][0] == 0) { + i--; + } + + if (numlines) *numlines = i; + return ret; } @@ -280,17 +292,12 @@ must be freed with talloc_free(). _PUBLIC_ char **file_lines_load(const char *fname, int *numlines, TALLOC_CTX *mem_ctx) { char *p; - char **lines; size_t size; p = file_load(fname, &size, mem_ctx); if (!p) return NULL; - lines = file_lines_parse(p, size, numlines, mem_ctx); - - talloc_free(p); - - return lines; + return file_lines_parse(p, size, numlines, mem_ctx); } /** @@ -301,17 +308,12 @@ the list. _PUBLIC_ char **fd_lines_load(int fd, int *numlines, TALLOC_CTX *mem_ctx) { char *p; - char **lines; size_t size; p = fd_load(fd, &size, mem_ctx); if (!p) return NULL; - lines = file_lines_parse(p, size, numlines, mem_ctx); - - talloc_free(p); - - return lines; + return file_lines_parse(p, size, numlines, mem_ctx); } @@ -355,31 +357,22 @@ _PUBLIC_ BOOL file_save(const char *fname, const void *packet, size_t length) return True; } -/** - see if a file exists -*/ -_PUBLIC_ BOOL file_exists(const char *path) -{ - struct stat st; - return (stat(path, &st) == 0); -} - -int vfdprintf(int fd, const char *format, va_list ap) _PRINTF_ATTRIBUTE(2,0) +_PUBLIC_ int vfdprintf(int fd, const char *format, va_list ap) _PRINTF_ATTRIBUTE(2,0) { char *p; int len, ret; va_list ap2; - VA_COPY(ap2, ap); - + va_copy(ap2, ap); len = vasprintf(&p, format, ap2); + va_end(ap2); if (len <= 0) return len; ret = write(fd, p, len); SAFE_FREE(p); return ret; } -int fdprintf(int fd, const char *format, ...) _PRINTF_ATTRIBUTE(2,3) +_PUBLIC_ int fdprintf(int fd, const char *format, ...) _PRINTF_ATTRIBUTE(2,3) { va_list ap; int ret; @@ -389,3 +382,24 @@ int fdprintf(int fd, const char *format, ...) _PRINTF_ATTRIBUTE(2,3) va_end(ap); return ret; } + + +/* + try to determine if the filesystem supports large files +*/ +_PUBLIC_ bool large_file_support(const char *path) +{ + int fd; + ssize_t ret; + char c; + + fd = open(path, O_RDWR|O_CREAT, 0600); + unlink(path); + if (fd == -1) { + /* have to assume large files are OK */ + return true; + } + ret = pread(fd, &c, 1, ((uint64_t)1)<<32); + close(fd); + return ret == 0; +}