From 96d1e80bdaded9211b3becc82a2e6c58ccc9a33a Mon Sep 17 00:00:00 2001 From: Nicolas Williams Date: Fri, 6 Sep 2019 16:40:55 -0500 Subject: [PATCH] roken: add mkostemp() --- cf/roken-frag.m4 | 1 + lib/roken/Makefile.am | 1 + lib/roken/NTMakefile | 1 + lib/roken/mkostemp.c | 87 ++++++++++++++++++++++++++++++++++++ lib/roken/roken.h.in | 5 +++ lib/roken/version-script.map | 1 + 6 files changed, 96 insertions(+) create mode 100644 lib/roken/mkostemp.c diff --git a/cf/roken-frag.m4 b/cf/roken-frag.m4 index 7c003bc7d..8c567677a 100644 --- a/cf/roken-frag.m4 +++ b/cf/roken-frag.m4 @@ -194,6 +194,7 @@ AC_CHECK_FUNCS([ \ getspnam \ issetugid \ memmem \ + mkostemp \ on_exit \ poll \ random \ diff --git a/lib/roken/Makefile.am b/lib/roken/Makefile.am index 602fd1f6e..322a3c6d5 100644 --- a/lib/roken/Makefile.am +++ b/lib/roken/Makefile.am @@ -105,6 +105,7 @@ libroken_la_SOURCES = \ memmem.c \ mini_inetd.c \ mkdir.c \ + mkostemp.c \ net_read.c \ net_write.c \ parse_bytes.c \ diff --git a/lib/roken/NTMakefile b/lib/roken/NTMakefile index bf4e95d89..01f79d165 100644 --- a/lib/roken/NTMakefile +++ b/lib/roken/NTMakefile @@ -78,6 +78,7 @@ libroken_la_OBJS = \ $(OBJ)\mkdir.obj \ $(OBJ)\mini_inetd.obj \ $(OBJ)\mkstemp.obj \ + $(OBJ)\mkostemp.obj \ $(OBJ)\net_read.obj \ $(OBJ)\net_write.obj \ $(OBJ)\parse_bytes.obj \ diff --git a/lib/roken/mkostemp.c b/lib/roken/mkostemp.c new file mode 100644 index 000000000..8d739d80e --- /dev/null +++ b/lib/roken/mkostemp.c @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2019 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#include + +#include + +#ifndef O_APPEND +#define O_APPEND 0 +#endif +#ifndef O_CLOEXEC +#define O_CLOEXEC 0 +#endif +#ifndef O_SYNC +#define O_SYNC 0 +#endif + +#ifndef HAVE_MKOSTEMP +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +mkostemp(char *template, int flags) +{ + int fd = mkstemp(template); + + if (flags == 0) + return fd; + + if ((flags & O_CLOEXEC)) + rk_cloexec(fd); + + /* fcntl F_SETFL O_APPEND and O_SYNC. */ +#ifdef HAVE_FCNTL + if ((flags & (O_APPEND | O_SYNC))) { + int fl; + + if ((fl = fcntl(fd, F_GETFL)) == -1 || + fcntl(fd, F_SETFD, fl | (flags & (O_APPEND | O_SYNC))) == -1) { + int save_errno = errno; + + (void) unlink(template); + (void) close(fd); + errno = save_errno; + return -1; + } + } +#endif + return fd; +} +#endif diff --git a/lib/roken/roken.h.in b/lib/roken/roken.h.in index 47fe27812..bbb77ddee 100644 --- a/lib/roken/roken.h.in +++ b/lib/roken/roken.h.in @@ -703,6 +703,11 @@ ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL lstat(const char *, struct stat *); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL mkstemp(char *); #endif +#ifndef HAVE_MKOSTEMP +#define mkostemp rk_mkostemp +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL mkostemp(char *, int); +#endif + #ifndef HAVE_CGETENT #define cgetent rk_cgetent #define cgetstr rk_cgetstr diff --git a/lib/roken/version-script.map b/lib/roken/version-script.map index 5c0579249..96d082da6 100644 --- a/lib/roken/version-script.map +++ b/lib/roken/version-script.map @@ -86,6 +86,7 @@ HEIMDAL_ROKEN_2.0 { rk_memmem; rk_memset_s; rk_mkdir; + rk_mkostemp; rk_mkstemp; rk_parse_flags; rk_parse_time;