/*
 * Copyright (c) 1987, 1993
 *  The Regents of the University of California.  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. ***REMOVED*** - see
 *    ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
 * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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 defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)mktemp.c    8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */

#ifdef macintosh
#include <unix.h>
#else
#include <sys/types.h>
#include <sys/stat.h>
#endif
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <ctype.h>
#include "mcom_db.h"

#ifndef _WINDOWS
#include <unistd.h>
#endif

#ifdef _WINDOWS
#include <process.h>
#include "winfile.h"
#endif

static int _gettemp(char *path, register int *doopen, int extraFlags);

int
mkstemp(char *path)
{
#ifdef XP_OS2
    FILE *temp = tmpfile();

    return (temp ? fileno(temp) : -1);
#else
    int fd;

    return (_gettemp(path, &fd, 0) ? fd : -1);
#endif
}

int
mkstempflags(char *path, int extraFlags)
{
    int fd;

    return (_gettemp(path, &fd, extraFlags) ? fd : -1);
}

/* NB: This routine modifies its input string, and does not always restore it.
** returns 1 on success, 0 on failure.
*/
static int
_gettemp(char *path, register int *doopen, int extraFlags)
{
    register char *start, *trv;
    struct stat sbuf;
    unsigned int pid;

    pid = getpid();
    for (trv = path; *trv; ++trv)
        ; /* extra X's get set to 0's */
    while (*--trv == 'X') {
        *trv = (pid % 10) + '0';
        pid /= 10;
    }

    /*
     * check the target directory; if you have six X's and it
     * doesn't exist this runs for a *very* long time.
     */
    for (start = trv + 1;; --trv) {
        char saved;
        if (trv <= path)
            break;
        saved = *trv;
        if (saved == '/' || saved == '\\') {
            int rv;
            *trv = '\0';
            rv = stat(path, &sbuf);
            *trv = saved;
            if (rv)
                return (0);
            if (!S_ISDIR(sbuf.st_mode)) {
                errno = ENOTDIR;
                return (0);
            }
            break;
        }
    }

    for (;;) {
        if (doopen) {
            if ((*doopen =
                     open(path, O_CREAT | O_EXCL | O_RDWR | extraFlags, 0600)) >= 0)
                return (1);
            if (errno != EEXIST)
                return (0);
        } else if (stat(path, &sbuf))
            return (errno == ENOENT ? 1 : 0);

        /* tricky little algorithm for backward compatibility */
        for (trv = start;;) {
            if (!*trv)
                return (0);
            if (*trv == 'z')
                *trv++ = 'a';
            else {
                if (isdigit(*trv))
                    *trv = 'a';
                else
                    ++*trv;
                break;
            }
        }
    }
    /*NOTREACHED*/
}
