/*
* Copyright (c) 1999
* Steven G. Kargl.  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.
*
* This software is provided by Steven G. Kargl 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 Steven G. Kargl 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.
*/

#include <sys/types.h>
#include <sys/stat.h>

#include <stdio.h>
#include <stdlib.h>

#include "proto.h"

char *gettmpdir(void) {
	
	struct stat sb;
	char *dir;

	dir = getenv("TMPDIR");

	if (!dir) { /* TMPDIR not set */
		dir = mkstring("/var/tmp");
		if (stat(dir, &sb) == 0) {
			/* Check that we have a directory with rwx permission */
			if (!(sb.st_mode & (S_IFDIR | S_IRUSR | S_IWUSR | S_IXUSR))) {
				fputs("f77: gettmpdir: check permissions for ", stderr);
				fprintf(stderr, "%s\n", dir);
				exit(1);
			}
		} else {
			free(dir);
			dir = mkstring("/tmp");
			if (stat(dir, &sb) == 0) {
				/* Check that we have a directory with rwx permission */
				if (!(sb.st_mode & (S_IFDIR | S_IRUSR | S_IWUSR | S_IXUSR))) {
					fputs("f77: gettmpdir: check permissions for ", stderr);
					fprintf(stderr, "%s\n", dir);
					exit(1);
				}
			} else {
				free(dir);
				dir = NULL;
			}
		}
	} else { /* TMPDIR */
		if (stat(dir, &sb) == 0) {
			/* Check that we have a directory with rwx permission */
			if (!(sb.st_mode & (S_IFDIR | S_IRUSR | S_IWUSR | S_IXUSR))) {
				fputs("f77: gettmpdir: check permissions for ", stderr);
				fprintf(stderr, "%s\n", dir);
				exit(1);
			}
		} else {
			fprintf(stderr, "f77: gettmpdir: can not stat %s\n", dir);
			exit(1);
		}
	}

	return dir;
}


syntax highlighted by Code2HTML, v. 0.9.1