"Fossies" - the Fresh Open Source Software Archive

Member "tin-2.4.4/src/my_tmpfile.c" (20 Nov 2019, 3661 Bytes) of package /linux/misc/tin-2.4.4.tar.xz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "my_tmpfile.c" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 2.4.3_vs_2.4.4.

    1 /*
    2  *  Project   : tin - a Usenet reader
    3  *  Module    : my_tmpfile.c
    4  *  Author    : Urs Janssen <urs@tin.org>
    5  *  Created   : 2001-03-11
    6  *  Updated   : 2014-05-13
    7  *  Notes     :
    8  *
    9  * Copyright (c) 2001-2020 Urs Janssen <urs@tin.org>
   10  * All rights reserved.
   11  *
   12  * Redistribution and use in source and binary forms, with or without
   13  * modification, are permitted provided that the following conditions
   14  * are met:
   15  * 1. Redistributions of source code must retain the above copyright notice,
   16  *    this list of conditions and the following disclaimer.
   17  *
   18  * 2. Redistributions in binary form must reproduce the above copyright
   19  *    notice, this list of conditions and the following disclaimer in the
   20  *    documentation and/or other materials provided with the distribution.
   21  *
   22  * 3. Neither the name of the copyright holder nor the names of its
   23  *    contributors may be used to endorse or promote products derived from
   24  *    this software without specific prior written permission.
   25  *
   26  * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   27  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   29  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
   30  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   36  * POSSIBILITY OF SUCH DAMAGE.
   37  */
   38 
   39 #ifndef TIN_H
   40 #   include "tin.h"
   41 #endif /* !TIN_H */
   42 
   43 
   44 /*
   45  * my_tmpfile(filename, name_size, base_dir)
   46  *
   47  * try to create a unique tmp-file descriptor
   48  *
   49  * return codes:
   50  * >0 = file descriptor of tmpfile
   51  *      if need_name is set to true and/or we have to unlink the file
   52  *      ourself filename is set to the name of the tmp file located in
   53  *      base_dir
   54  * -1 = some error occurred
   55  */
   56 int
   57 my_tmpfile(
   58     char *filename,
   59     size_t name_size,
   60     const char *base_dir)
   61 {
   62     int fd = -1;
   63     char buf[PATH_LEN];
   64     mode_t mask;
   65 #if defined(HAVE_MKTEMP) && !defined(HAVE_MKSTEMP)
   66     char *t;
   67 #endif /* HAVE_MKTEMP && !HAVE_MKSTEMP */
   68 #ifdef DEBUG
   69     int sverrno;
   70 #endif /* DEBUG */
   71 
   72     errno = 0;
   73 
   74     if (filename != NULL && name_size > 0) {
   75         if (base_dir) {
   76 #ifdef HAVE_LONG_FILE_NAMES
   77             snprintf(buf, MIN(name_size, (sizeof(buf) - 1)), "tin-%s-%ld-XXXXXX", get_host_name(), (long) process_id);
   78 #else
   79             snprintf(buf, MIN(name_size, (sizeof(buf) - 1)), "tin-XXXXXX");
   80 #endif /* HAVE_LONG_FILE_NAMES */
   81             joinpath(filename, name_size, base_dir, buf);
   82         } else {
   83             snprintf(buf, MIN(name_size, (sizeof(buf) - 1)), "tin_XXXXXX");
   84             joinpath(filename, name_size, TMPDIR, buf);
   85         }
   86         mask = umask((mode_t) (S_IRWXO|S_IRWXG));
   87 #ifdef DEBUG
   88         errno = 0;
   89 #endif /* DEBUG */
   90 #ifdef HAVE_MKSTEMP
   91         fd = mkstemp(filename);
   92 #   ifdef DEBUG
   93         sverrno = errno;
   94         if (fd == -1 && sverrno)
   95             wait_message(5, "HAVE_MKSTEMP %s: %s", filename, strerror(sverrno));
   96 #   endif /* DEBUG */
   97 #else
   98 #   ifdef HAVE_MKTEMP
   99         if ((t = mktemp(filename)) != NULL)
  100             fd = open(t, (O_WRONLY|O_CREAT|O_EXCL), (mode_t) (S_IRUSR|S_IWUSR));
  101 #       ifdef DEBUG
  102         sverrno = errno;
  103         if (sverrno)
  104             wait_message(5, "HAVE_MKTEMP %s: %s", filename, strerror(sverrno));
  105 #       endif /* DEBUG */
  106 #   endif /* HAVE_MKTEMP */
  107 #endif /* HAVE_MKSTEMP */
  108         umask(mask);
  109     }
  110     if (fd == -1)
  111         error_message(2, _(txt_cannot_create_uniq_name));
  112     return fd;
  113 }