diff --git a/libc/Makefile b/libc/Makefile index e66ea4a1..ede4fc3a 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -305,6 +305,7 @@ stdlib/canonicalize_file_name.o \ stdlib/env.o \ stdlib/_Exit.o \ stdlib/exit.o \ +stdlib/mkstemp.o \ stdlib/mktemp.o \ stdlib/on_exit.o \ stdlib/rand.o \ diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index cda18afe..a8aab846 100644 --- a/libc/include/stdlib.h +++ b/libc/include/stdlib.h @@ -84,6 +84,7 @@ void* malloc(size_t); int mblen(const char*, size_t); size_t mbstowcs(wchar_t* __restrict, const char* __restrict, size_t); int mbtowc(wchar_t *__restrict, const char* __restrict, size_t); +int mkstemp(char*); #if !defined(_SORTIX_SOURCE) char* mktemp(char* templ); #endif @@ -137,7 +138,6 @@ char* l64a(long); void lcong48(unsigned short [7]); long lrand48(void); char* mkdtemp(char*); -int mkstemp(char*); long mrand48(void); long nrand48(unsigned short[3]); int posix_memalign(void**, size_t, size_t); diff --git a/libc/stdlib/mkstemp.cpp b/libc/stdlib/mkstemp.cpp new file mode 100644 index 00000000..9cf0824f --- /dev/null +++ b/libc/stdlib/mkstemp.cpp @@ -0,0 +1,41 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + This file is part of the Sortix C Library. + + The Sortix C Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + The Sortix C Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with the Sortix C Library. If not, see . + + stdlib/mkstemp.cpp + Make a unique temporary filepath and opens it. + +*******************************************************************************/ + +#include +#include +#include +#include + +extern "C" int mkstemp(char* templ) +{ + int fd; + do + { + size_t templ_len = strlen(templ); + for ( size_t i = templ_len - 6UL; i < templ_len; i++ ) + templ[i] = '0' + rand() % 10; + } while ( (fd = open(templ, O_RDWR | O_EXCL | O_CREAT, 0666)) < 0 && + (errno == EEXIST) ); + return fd; +}