From 28a4fe477b372b2c7d3086fc2031f87a18696166 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Mon, 22 Apr 2013 11:37:29 +0200 Subject: [PATCH] Add tmpnam(3). --- libc/Makefile | 1 + libc/include/stdio.h | 7 +++++-- libc/tmpnam.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 libc/tmpnam.cpp diff --git a/libc/Makefile b/libc/Makefile index f7fce25e..a471c455 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -344,6 +344,7 @@ system.o \ tfork.o \ time.o \ tmpfile.o \ +tmpnam.o \ truncateat.o \ truncate.o \ ttyname.o \ diff --git a/libc/include/stdio.h b/libc/include/stdio.h index a31e6102..f3286e52 100644 --- a/libc/include/stdio.h +++ b/libc/include/stdio.h @@ -44,7 +44,7 @@ typedef off_t fpos_t; /* TODO: Implement L_ctermid */ #if __POSIX_OBSOLETE <= 200801 -/* TODO: Implement L_tmpnam */ +#define L_tmpnam 128 #endif /* The possibilities for the third argument to `setvbuf'. */ @@ -128,6 +128,10 @@ extern int vsnprintf(char* __restrict, size_t, const char* __restrict, __gnuc_va extern int vsprintf(char* __restrict s, const char* __restrict format, __gnuc_va_list ap); extern int vsscanf(const char* __restrict s, const char* __restrict format, __gnuc_va_list arg); +#if __POSIX_OBSOLETE <= 200801 +extern char* tmpnam(char* s); +#endif + /* TODO: These are not implemented in sortix libc yet. */ #if defined(__SORTIX_SHOW_UNIMPLEMENTED) extern char* ctermid(char* s); @@ -144,7 +148,6 @@ extern void flockfile(FILE* file); extern void funlockfile(FILE* file); #if __POSIX_OBSOLETE <= 200801 -extern char* tmpnam(char* s); extern char* tempnam(const char* dir, const char* pfx); #endif #endif diff --git a/libc/tmpnam.cpp b/libc/tmpnam.cpp new file mode 100644 index 00000000..cbea7d72 --- /dev/null +++ b/libc/tmpnam.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 . + + tmpnam.cpp + Create path names for temporary files. + +*******************************************************************************/ + +#include +#include +#include + +// TODO: Please remove this function and P_tmpdir and L_tmpnam once they have +// been removed from the C, C++ and POSIX standards. +extern "C" char* tmpnam(char* s) +{ + static char static_string[L_tmpnam+1]; + if ( !s ) + s = static_string; + static int current_index = 0; + // TODO: This isn't thread safe! + snprintf(s, L_tmpnam, "%s/tmpnam.pid%ju.%i", P_tmpdir, (uintmax_t) getpid(), + current_index++); + return s; +}