1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-22 13:34:15 +03:00

lib: Add fdopen_keepfd()

Capture the dup/fdopen pattern

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Martin Schwenke <mschwenke@ddn.com>
This commit is contained in:
Volker Lendecke 2024-04-10 13:07:56 +02:00 committed by Martin Schwenke
parent 0baae61e42
commit 28335cdb5d
2 changed files with 30 additions and 8 deletions

View File

@ -176,20 +176,13 @@ _PUBLIC_ char *fd_load(int fd, size_t *psize, size_t maxsize, TALLOC_CTX *mem_ct
size_t size = 0;
size_t chunk = 1024;
int err;
int fd_dup;
if (maxsize == 0) {
maxsize = SIZE_MAX;
}
fd_dup = dup(fd);
if (fd_dup == -1) {
return NULL;
}
file = fdopen(fd_dup, "r");
file = fdopen_keepfd(fd, "r");
if (file == NULL) {
close(fd_dup);
return NULL;
}
@ -497,3 +490,30 @@ char *file_ploadv(char * const argl[], size_t *size)
return p;
}
/*
* fopen a dup'ed fd. Prevent fclose to close the fd passed in.
*
* Don't use on fd's that have fcntl locks, on error it will close the
* dup'ed fd, thus killing your fcntl locks.
*/
FILE *fdopen_keepfd(int fd, const char *mode)
{
FILE *f = NULL;
int dup_fd;
dup_fd = dup(fd);
if (dup_fd == -1) {
return NULL;
}
f = fdopen(dup_fd, mode);
if (f == NULL) {
int err = errno;
close(dup_fd);
errno = err;
return NULL;
}
return f;
}

View File

@ -77,4 +77,6 @@ bool file_compare(const char *path1, const char *path2);
*/
char *file_ploadv(char * const argl[], size_t *size);
FILE *fdopen_keepfd(int fd, const char *mode);
#endif