summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/util/util.c32
-rw-r--r--lib/util/util.h5
-rw-r--r--source3/smbd/process.c26
3 files changed, 37 insertions, 26 deletions
diff --git a/lib/util/util.c b/lib/util/util.c
index 7f30d436e8..4dd79266af 100644
--- a/lib/util/util.c
+++ b/lib/util/util.c
@@ -6,6 +6,7 @@
Copyright (C) Simo Sorce 2001
Copyright (C) Jim McDonough (jmcd@us.ibm.com) 2003.
Copyright (C) James J Myers 2003
+ Copyright (C) Volker Lendecke 2010
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
@@ -61,6 +62,37 @@ _PUBLIC_ const char *tmpdir(void)
/**
+ Create a tmp file, open it and immediately unlink it.
+ Returns the file descriptor or -1 on error.
+**/
+int create_unlink_tmp(const char *dir)
+{
+ char *fname;
+ int fd;
+
+ fname = talloc_asprintf(talloc_tos(), "%s/listenerlock_XXXXXX", dir);
+ if (fname == NULL) {
+ errno = ENOMEM;
+ return -1;
+ }
+ fd = mkstemp(fname);
+ if (fd == -1) {
+ TALLOC_FREE(fname);
+ return -1;
+ }
+ if (unlink(fname) == -1) {
+ int sys_errno = errno;
+ close(fd);
+ TALLOC_FREE(fname);
+ errno = sys_errno;
+ return -1;
+ }
+ TALLOC_FREE(fname);
+ return fd;
+}
+
+
+/**
Check if a file exists - call vfs_file_exist for samba files.
**/
_PUBLIC_ bool file_exist(const char *fname)
diff --git a/lib/util/util.h b/lib/util/util.h
index b9734b07c8..7f0de26781 100644
--- a/lib/util/util.h
+++ b/lib/util/util.h
@@ -623,6 +623,11 @@ bool file_compare(const char *path1, const char *path2);
_PUBLIC_ const char *tmpdir(void);
/**
+ * Creates and immediately unlinks a file. Returns open file descriptor.
+ **/
+_PUBLIC_ int create_unlink_tmp(const char *dir);
+
+/**
Check if a file exists - call vfs_file_exist for samba files.
**/
_PUBLIC_ bool file_exist(const char *fname);
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index fc6112c161..d96d5fb7e0 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -2422,32 +2422,6 @@ static bool housekeeping_fn(const struct timeval *now, void *private_data)
return true;
}
-static int create_unlink_tmp(const char *dir)
-{
- char *fname;
- int fd;
-
- fname = talloc_asprintf(talloc_tos(), "%s/listenerlock_XXXXXX", dir);
- if (fname == NULL) {
- errno = ENOMEM;
- return -1;
- }
- fd = mkstemp(fname);
- if (fd == -1) {
- TALLOC_FREE(fname);
- return -1;
- }
- if (unlink(fname) == -1) {
- int sys_errno = errno;
- close(fd);
- TALLOC_FREE(fname);
- errno = sys_errno;
- return -1;
- }
- TALLOC_FREE(fname);
- return fd;
-}
-
/*
* Read an smb packet in the echo handler child, giving the parent
* smbd one second to react once the socket becomes readable.