L4Re/departure

libext2fs/lib/libet/com_err.c

617:2733e5770ee9
9 months ago Paul Boddie Made the run command wait for completion, introducing the spawn command to run programs in the background. Introduced conveniences for waiting for the last job to be initiated and for piping from the last job, also subscribing to signals from pipe-supplying jobs so that they may be transparently removed from the job list upon completion. Augmented the job listing with the "+" notation familiar from Unix. Prevented new jobs from being started when no job slots are available.
     1 /*     2  * Copyright 1987, 1988 by MIT Student Information Processing Board.     3  *     4  * Permission to use, copy, modify, and distribute this software and     5  * its documentation for any purpose is hereby granted, provided that     6  * the names of M.I.T. and the M.I.T. S.I.P.B. not be used in     7  * advertising or publicity pertaining to distribution of the software     8  * without specific, written prior permission.  M.I.T. and the     9  * M.I.T. S.I.P.B. make no representations about the suitability of    10  * this software for any purpose.  It is provided "as is" without    11  * express or implied warranty.    12  */    13     14 #include "config.h"    15 #include <stdio.h>    16 #ifdef HAVE_TERMIOS_H    17 #include <termios.h>    18 #endif    19 #ifdef HAVE_UNISTD_H    20 #include <unistd.h>    21 #endif    22 #include "com_err.h"    23 #include "error_table.h"    24 #include "internal.h"    25     26 static void    27 default_com_err_proc (const char *whoami, errcode_t code, const    28 		      char *fmt, va_list args)    29 	COM_ERR_ATTR((format(printf, 3, 0)));    30     31 static void    32 default_com_err_proc (const char *whoami, errcode_t code, const    33 		      char *fmt, va_list args)    34 {    35     int do_cr = 1, fd = fileno(stderr);    36     37     if (whoami) {    38 	fputs(whoami, stderr);    39 	fputs(": ", stderr);    40     }    41     if (code) {    42 	fputs(error_message(code), stderr);    43 	fputs(" ", stderr);    44     }    45     if (fmt) {    46         vfprintf (stderr, fmt, args);    47     }    48     if (!isatty(fd))    49 	do_cr = 0;    50 #ifdef HAVE_TERMIOS_H    51     else {    52 	struct termios t;    53     54 	if ((tcgetattr(fd, &t)) == 0 &&    55 	    (t.c_oflag & OPOST) && (t.c_oflag & ONLCR))    56 	do_cr = 0;    57     }    58 #endif    59     if (do_cr)    60 	fputc('\r', stderr);    61     fputc('\n', stderr);    62     fflush(stderr);    63 }    64     65 typedef void (*errf) (const char *, errcode_t, const char *, va_list);    66     67 errf com_err_hook = default_com_err_proc;    68     69 void com_err_va (const char *whoami, errcode_t code, const char *fmt,    70 		 va_list args)    71 {    72     (*com_err_hook) (whoami, code, fmt, args);    73 }    74     75 void com_err (const char *whoami,    76 	      errcode_t code,    77 	      const char *fmt, ...)    78 {    79     va_list pvar;    80     81     if (!com_err_hook)    82 	com_err_hook = default_com_err_proc;    83     va_start(pvar, fmt);    84     com_err_va (whoami, code, fmt, pvar);    85     va_end(pvar);    86 }    87     88 errf set_com_err_hook(errf new_proc)    89 {    90     errf x = com_err_hook;    91     92     if (new_proc)    93 	com_err_hook = new_proc;    94     else    95 	com_err_hook = default_com_err_proc;    96     97     return x;    98 }    99    100 errf reset_com_err_hook(void) {   101     errf x = com_err_hook;   102     com_err_hook = default_com_err_proc;   103     return x;   104 }