#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include "file_mode.h"

static mode_t leaf_mode;

char *progname;

static int make_fifo(char *dir)
{
	if (mkfifo(dir, leaf_mode)) {
		/*
		 * We failed, remove the directory we created.
		 */
		fprintf(stderr, "%s: ", progname);
		perror(dir);
		return -1;
	}
	return 0;
}

int main(int argc, char *argv[])
{
	int c, ret;
	mode_t saved_umask;

	progname = argv[0];

	saved_umask = umask(0);
	leaf_mode = (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) &
		     ~saved_umask;

	do {
		c = getopt(argc, argv, "m:");
		if (c == EOF)
			break;
		switch (c) {
		case 'm':
			leaf_mode = parse_file_mode(optarg, leaf_mode, saved_umask);
			break;

		case '?':
			fprintf(stderr, "%s: invalid option -%c\n",
				progname, optopt);
			exit(1);
		}
	} while (1);

	if (optind == argc) {
		fprintf(stderr, "Usage: %s [-m mode] file...\n",
			progname);
		exit(1);
	}

	while (optind < argc) {
		if (make_fifo(argv[optind]))
			ret = 255; /* seems to be what gnu mkdir does */
		optind++;
	}

	return ret;
}
