da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1992-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Bell Laboratories
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * mkfifo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const char usage[] =
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[-?\n@(#)$Id: mkfifo (AT&T Research) 2009-01-02 $\n]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinUSAGE_LICENSE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+NAME?mkfifo - make FIFOs (named pipes)]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+DESCRIPTION?\bmkfifo\b creates one or more FIFO's. By "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "default, the mode of created FIFO is \ba=rw\b minus the "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "bits set in the \bumask\b(1).]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[m:mode]:[mode?Set the mode of created FIFO to \amode\a. "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "\amode\a is symbolic or octal mode as in \bchmod\b(1). Relative "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "modes assume an initial mode of \ba=rw\b.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\nfile ...\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+EXIT STATUS?]{"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "[+0?All FIFO's created successfully.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "[+>0?One or more FIFO's could not be created.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"}"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+SEE ALSO?\bchmod\b(1), \bumask\b(1)]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <cmd.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ls.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinb_mkfifo(int argc, char *argv[], void* context)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz register char* arg;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz register mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz register mode_t mask = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz register int mflag = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cmdinit(argc, argv, context, ERROR_CATALOG, 0);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz switch (optget(argv, usage))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case 0:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case 'm':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz mflag = 1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz mode = strperm(arg = opt_info.arg, &opt_info.arg, mode);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (*opt_info.arg)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz error(ERROR_exit(0), "%s: invalid mode", arg);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz continue;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case ':':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz error(2, "%s", opt_info.arg);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz continue;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case '?':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz error(ERROR_usage(2), "%s", opt_info.arg);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz continue;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv += opt_info.index;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (error_info.errors || !*argv)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz error(ERROR_usage(2), "%s", optusage(NiL));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz mask = umask(0);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (!mflag)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz mode &= ~mask;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz umask(mask);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz mask = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz while (arg = *argv++)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (mkfifo(arg, mode) < 0)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz error(ERROR_system(0), "%s:", arg);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (mask)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin umask(mask);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return error_info.errors != 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}