2 * Unix SMB/CIFS implementation.
3 * SMB parameters and setup
4 * Copyright (C) Andrew Tridgell 1992-1998 Modified by Jeremy Allison 1995.
6 * Added afdgets() Jelmer Vernooij 2005
8 * This program is free software; you can redistribute it and/or modify it under
9 * the terms of the GNU General Public License as published by the Free
10 * Software Foundation; either version 3 of the License, or (at your option)
13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
18 * You should have received a copy of the GNU General Public License along with
19 * this program; if not, see <http://www.gnu.org/licenses/>.
23 #include "system/shmem.h"
24 #include "system/filesys.h"
26 #include "lib/util/samba_util.h"
27 #include "lib/util/debug.h"
30 * Read one line (data until next newline or eof) and allocate it
32 _PUBLIC_
char *afdgets(int fd
, TALLOC_CTX
*mem_ctx
, size_t hint
)
35 ssize_t alloc_size
= 0, offset
= 0, ret
;
38 if (hint
<= 0) hint
= 0x100;
43 data
= talloc_realloc(mem_ctx
, data
, char, alloc_size
);
48 ret
= read(fd
, data
+ offset
, hint
);
60 for (p
= 0; p
< ret
; p
++) {
61 if (data
[offset
+ p
] == '\n')
66 data
[offset
+ p
] = '\0';
68 /* Go back to position of newline */
69 lseek(fd
, p
- ret
+ 1, SEEK_CUR
);
75 } while (ret
== hint
);
82 char *fgets_slash(TALLOC_CTX
*mem_ctx
, char *s2
, int maxlen
, FILE *f
)
87 bool start_of_line
= true;
98 maxlen
= MIN(maxlen
,8);
99 s
= talloc_array(mem_ctx
, char, maxlen
);
108 while (len
< maxlen
-1) {
115 while (len
> 0 && s
[len
-1] == ' ') {
118 if (len
> 0 && s
[len
-1] == '\\') {
120 start_of_line
= true;
125 if (len
<= 0 && (s2
== NULL
)) {
128 return (len
>0) ? s
: NULL
;
135 start_of_line
= false;
139 if ((s2
== NULL
) && (len
> maxlen
-3)) {
145 DBG_ERR("length overflow");
151 t
= talloc_realloc(mem_ctx
, s
, char, maxlen
);
153 DBG_ERR("failed to expand buffer!\n");
166 load a file into memory from a fd.
168 _PUBLIC_
char *fd_load(int fd
, size_t *psize
, size_t maxsize
, TALLOC_CTX
*mem_ctx
)
174 if (fstat(fd
, &sbuf
) != 0) return NULL
;
179 size
= MIN(size
, maxsize
);
182 p
= (char *)talloc_size(mem_ctx
, size
+1);
185 if (read(fd
, p
, size
) != size
) {
191 if (psize
) *psize
= size
;
197 load a file into memory
199 _PUBLIC_
char *file_load(const char *fname
, size_t *size
, size_t maxsize
, TALLOC_CTX
*mem_ctx
)
204 if (!fname
|| !*fname
) return NULL
;
206 fd
= open(fname
,O_RDONLY
);
207 if (fd
== -1) return NULL
;
209 p
= fd_load(fd
, size
, maxsize
, mem_ctx
);
217 parse a buffer into lines
218 'p' will be freed on error, and otherwise will be made a child of the returned array
220 char **file_lines_parse(char *p
, size_t size
, int *numlines
, TALLOC_CTX
*mem_ctx
)
227 for (s
= p
, i
=0; s
< p
+size
; s
++) {
228 if (s
[0] == '\n') i
++;
231 ret
= talloc_zero_array(mem_ctx
, char *, i
+2);
237 talloc_steal(ret
, p
);
240 for (s
= p
, i
=0; s
< p
+size
; s
++) {
246 if (s
[0] == '\r') s
[0] = 0;
249 /* remove any blank lines at the end */
250 while (i
> 0 && ret
[i
-1][0] == 0) {
254 if (numlines
) *numlines
= i
;
261 load a file into memory and return an array of pointers to lines in the file
262 must be freed with talloc_free().
264 _PUBLIC_
char **file_lines_load(const char *fname
, int *numlines
, size_t maxsize
, TALLOC_CTX
*mem_ctx
)
269 p
= file_load(fname
, &size
, maxsize
, mem_ctx
);
272 return file_lines_parse(p
, size
, numlines
, mem_ctx
);
276 load a fd into memory and return an array of pointers to lines in the file
277 must be freed with talloc_free(). If convert is true calls unix_to_dos on
280 _PUBLIC_
char **fd_lines_load(int fd
, int *numlines
, size_t maxsize
, TALLOC_CTX
*mem_ctx
)
285 p
= fd_load(fd
, &size
, maxsize
, mem_ctx
);
288 return file_lines_parse(p
, size
, numlines
, mem_ctx
);
291 _PUBLIC_
bool file_save_mode(const char *fname
, const void *packet
,
292 size_t length
, mode_t mode
)
295 fd
= open(fname
, O_WRONLY
|O_CREAT
|O_TRUNC
, mode
);
299 if (write(fd
, packet
, length
) != (size_t)length
) {
308 save a lump of data into a file. Mostly used for debugging
310 _PUBLIC_
bool file_save(const char *fname
, const void *packet
, size_t length
)
312 return file_save_mode(fname
, packet
, length
, 0644);
315 _PUBLIC_
int vfdprintf(int fd
, const char *format
, va_list ap
)
322 len
= vasprintf(&p
, format
, ap2
);
324 if (len
<= 0) return len
;
325 ret
= write(fd
, p
, len
);
330 _PUBLIC_
int fdprintf(int fd
, const char *format
, ...)
335 va_start(ap
, format
);
336 ret
= vfdprintf(fd
, format
, ap
);
343 compare two files, return true if the two files have the same content
345 bool file_compare(const char *path1
, const char *path2
)
349 TALLOC_CTX
*mem_ctx
= talloc_new(NULL
);
351 p1
= file_load(path1
, &size1
, 0, mem_ctx
);
352 p2
= file_load(path2
, &size2
, 0, mem_ctx
);
353 if (!p1
|| !p2
|| size1
!= size2
) {
354 talloc_free(mem_ctx
);
357 if (memcmp(p1
, p2
, size1
) != 0) {
358 talloc_free(mem_ctx
);
361 talloc_free(mem_ctx
);