/* * mktemp.c * * Copyright (c) 2009, 2014, 2016-2018 The MacPorts Project * 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 MacPorts Project 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. */ #if HAVE_CONFIG_H #include #endif #ifndef __APPLE__ /* required for strdup(3)/mkdtemp(3) on Linux */ /* hides mkdtemp(3) on macOS */ #define _XOPEN_SOURCE 700L /* required for mktemp(3) if _XOPEN_SOURCE >= 600L on Linux */ #define _BSD_SOURCE #endif #include #include #include #include #include #include "mktemp.h" int MkdtempCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { char *template, *sp; Tcl_Obj *tcl_result; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "template"); return TCL_ERROR; } template = strdup(Tcl_GetString(objv[1])); if (template == NULL) return TCL_ERROR; if ((sp = mkdtemp(template)) == NULL) { Tcl_AppendResult(interp, "mkdtemp failed: ", strerror(errno), NULL); free(template); return TCL_ERROR; } tcl_result = Tcl_NewStringObj(sp, -1); Tcl_SetObjResult(interp, tcl_result); free(template); return TCL_OK; } int MktempCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { char *template, *sp; Tcl_Obj *tcl_result; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "template"); return TCL_ERROR; } template = strdup(Tcl_GetString(objv[1])); if (template == NULL) return TCL_ERROR; if ((sp = mktemp(template)) == NULL) { Tcl_AppendResult(interp, "mktemp failed: ", strerror(errno), NULL); free(template); return TCL_ERROR; } tcl_result = Tcl_NewStringObj(sp, -1); Tcl_SetObjResult(interp, tcl_result); free(template); return TCL_OK; }