"Fossies" - the Fresh Open Source Software Archive

Member "schily-2021-09-18/fifo/fifo_main.c" (20 Aug 2021, 7214 Bytes) of package /linux/privat/schily-2021-09-18.tar.bz2:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 /* @(#)fifo_main.c  1.5 21/08/20 Copyright 1989, 2019-2021 J. Schilling */
    2 #include <schily/mconfig.h>
    3 #ifndef lint
    4 static  UConst char sccsid[] =
    5     "@(#)fifo_main.c    1.5 21/08/20 Copyright 1989, 2019-2021 J. Schilling";
    6 #endif
    7 /*
    8  *  Copyright (c) 1989, 2019-2021 J. Schilling
    9  *
   10  */
   11 /*
   12  * The contents of this file are subject to the terms of the
   13  * Common Development and Distribution License, Version 1.0 only
   14  * (the "License").  You may not use this file except in compliance
   15  * with the License.
   16  *
   17  * See the file CDDL.Schily.txt in this distribution for details.
   18  * A copy of the CDDL is also available via the Internet at
   19  * http://www.opensource.org/licenses/cddl1.txt
   20  *
   21  * When distributing Covered Code, include this CDDL HEADER in each
   22  * file and include the License file CDDL.Schily.txt from this distribution.
   23  */
   24 
   25 #include <schily/stdlib.h>
   26 #include <schily/unistd.h>
   27 #include <schily/limits.h>
   28 #include <schily/stat.h>
   29 #include <schily/signal.h>
   30 #include <schily/wait.h>
   31 #include <schily/errno.h>
   32 #include <schily/nlsdefs.h>
   33 #define GT_COMERR       /* #define comerr gtcomerr */
   34 #define GT_ERROR        /* #define error gterror   */
   35 #include <schily/schily.h>
   36 #include <schily/nlsdefs.h>
   37 #include "star.h"
   38 #include "starsubs.h"
   39 #include "fifo.h"
   40 
   41 #ifndef PIPE_BUF
   42 #define PIPE_BUF    4096
   43 #endif
   44 
   45 /* BEGIN CSTYLED */
   46 char    options[] =
   47 "help,version,debug,no-statistics,bs&,ibs&,obs&,fs&";
   48 /* END CSTYLED */
   49 
   50 LOCAL   void    usage       __PR((int exitcode));
   51 EXPORT  void    set_signal  __PR((int sig, RETSIGTYPE (*handler)(int)));
   52 EXPORT  int main        __PR((int ac, char **av));
   53 LOCAL   int getenum     __PR((char *arg, long *valp));
   54 EXPORT  void    exprstats   __PR((int ret));
   55 EXPORT  void    setprops    __PR((long htype));
   56 EXPORT  void    changetape  __PR((BOOL donext));
   57 EXPORT  void    closetape   __PR((void));
   58 EXPORT  void    runnewvolscript __PR((int volno, int nindex));
   59 EXPORT  long    startvol    __PR((char *buf, long amount));
   60 EXPORT  BOOL    verifyvol   __PR((char *buf, int amt, int volno,
   61                                 int *skipp));
   62 LOCAL   BOOL    ispipe      __PR((int));
   63 
   64 BOOL    debug     = FALSE;      /* -debug has been specified    */
   65 long    fs;             /* FIFO size            */
   66 long    bs;             /* TAPE block size (bytes)  */
   67 extern  long    ibs;
   68 extern  long    obs;
   69 int tarfindex;          /* Current index in list    */
   70 BOOL    multivol = FALSE;       /* -multivol specified      */
   71 long    chdrtype  = H_UNDEF;        /* command line hdrtype     */
   72 BOOL    cflag     = FALSE;      /* -c has been specified    */
   73 BOOL    copyflag  = FALSE;      /* -copy has been specified */
   74 BOOL    lowmem    = FALSE;      /* -lowmem use less memory  */
   75 BOOL    no_stats  = FALSE;      /* -no-statistics specified */
   76 m_stats *stats;
   77 int pid;
   78 extern  m_head  *mp;
   79 
   80 GINFO   _ginfo;             /* Global (volhdr) information  */
   81 GINFO   _grinfo;            /* Global read information  */
   82 GINFO   *gip  = &_ginfo;        /* Global information pointer   */
   83 GINFO   *grip = &_grinfo;       /* Global read info pointer */
   84 
   85 long    bufsize = 0;        /* Available buffer size */
   86 char    *bigbuf = NULL;
   87 char    *bigptr = NULL;
   88 
   89 LOCAL void
   90 usage(exitcode)
   91     int exitcode;
   92 {
   93     error("Usage:   fifo [options]\n");
   94     error("Options:\n");
   95     error(" fs=#    set fifo size to #\n");
   96     error(" bs=#    set buffer size to #\n");
   97     error(" ibs=#   set input buffer size to #\n");
   98     error(" obs=#   set output buffer size to #\n");
   99     error(" -no-statistics  do not print fifo statistics\n");
  100     error(" -help   print this help\n");
  101     error(" -debug  print additional debug messages\n");
  102     error(" -version print version information and exit\n");
  103 
  104     exit(exitcode);
  105 }
  106 
  107 EXPORT void
  108 set_signal(sig, handler)
  109     int     sig;
  110     RETSIGTYPE  (*handler)  __PR((int));
  111 {
  112 #if defined(HAVE_SIGPROCMASK) && defined(SA_RESTART)
  113     struct sigaction sa;
  114 
  115     sigemptyset(&sa.sa_mask);
  116     sa.sa_handler = handler;
  117     sa.sa_flags = SA_RESTART;
  118     (void) sigaction(sig, &sa, (struct sigaction *)0);
  119 #else
  120 #ifdef  HAVE_SIGSETMASK
  121     struct sigvec   sv;
  122 
  123     sv.sv_mask = 0;
  124     sv.sv_handler = handler;
  125     sv.sv_flags = 0;
  126     (void) sigvec(sig, &sv, (struct sigvec *)0);
  127 #else
  128     (void) signal(sig, handler);
  129 #endif
  130 #endif
  131 }
  132 
  133 
  134 EXPORT int
  135 main(ac, av)
  136     int ac;
  137     char    *av[];
  138 {
  139     int cac;
  140     char    *const *cav;
  141     BOOL    help = FALSE;
  142     BOOL    prvers = FALSE;
  143 
  144     save_args(ac, av);
  145 
  146     (void) setlocale(LC_ALL, "");
  147 
  148 #ifdef  USE_NLS
  149 #if !defined(TEXT_DOMAIN)   /* Should be defined by cc -D */
  150 #define TEXT_DOMAIN "fifo"  /* Use this only if it weren't */
  151 #endif
  152     { char  *dir;
  153     dir = searchfileinpath("share/locale", F_OK,
  154                     SIP_ANY_FILE|SIP_NO_PATH, NULL);
  155     if (dir)
  156         (void) bindtextdomain(TEXT_DOMAIN, dir);
  157     else
  158 #if defined(PROTOTYPES) && defined(INS_BASE)
  159     (void) bindtextdomain(TEXT_DOMAIN, INS_BASE "/share/locale");
  160 #else
  161     (void) bindtextdomain(TEXT_DOMAIN, "/usr/share/locale");
  162 #endif
  163     (void) textdomain(TEXT_DOMAIN);
  164     }
  165 #endif  /* USE_NLS */
  166 
  167     cac = --ac;
  168     cav = ++av;
  169 
  170     if (getallargs(&cac, &cav, options, &help, &prvers,
  171             &debug, &no_stats,
  172             getenum, &bs,
  173             getenum, &ibs,
  174             getenum, &obs,
  175             getenum, &fs) < 0) {
  176         errmsgno(EX_BAD, "Bad flag: %s.\n", cav[0]);
  177         usage(EX_BAD);
  178     }
  179     cac = ac;
  180     cav = av;
  181     if (getfiles(&cac, &cav, options) > 0)
  182         comerrno(EX_BAD, "Too many args.\n");
  183 
  184     if (help)
  185         usage(0);
  186     if (prvers) {
  187         /* BEGIN CSTYLED */
  188         gtprintf("fifo %s %s (%s-%s-%s)\n\n", "2.0", "2021/08/20", HOST_CPU, HOST_VENDOR, HOST_OS);
  189         gtprintf("Copyright (C) 1989, 2019-2021 %s\n", _("Jörg Schilling"));
  190         gtprintf("This is free software; see the source for copying conditions.  There is NO\n");
  191         gtprintf("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n");
  192         /* END CSTYLED */
  193         exit(0);
  194     }
  195     if (bs == 0)
  196         bs = 512;
  197     if (ibs == 0) {
  198         if (ispipe(STDIN_FILENO))
  199             ibs = PIPE_BUF;
  200         else
  201             ibs = bs;
  202     }
  203     if (obs == 0) {
  204         if (ispipe(STDOUT_FILENO))
  205             obs = PIPE_BUF;
  206         else
  207             obs = bs;
  208     }
  209     initfifo();
  210     fifo_prmp(0);
  211     on_comerr((void(*)__PR((int, void *)))fifo_stats, (void *)0);
  212     runfifo(ac, av);
  213     if (pid != 0) {
  214         wait(0);
  215         fifo_stats();
  216     } else {
  217         exit(0);
  218     }
  219     exit(fifo_errno());
  220 }
  221 
  222 LOCAL int
  223 getenum(arg, valp)
  224     char    *arg;
  225     long    *valp;
  226 {
  227     int ret = getnum(arg, valp);
  228 
  229     if (ret != 1)
  230         errmsgno(EX_BAD, "Badly formed number '%s'.\n", arg);
  231     return (ret);
  232 }
  233 
  234 EXPORT void
  235 exprstats(ret)
  236     int ret;
  237 {
  238 #if 0
  239     prstats();
  240     checkerrs();
  241     if (use_fifo)
  242         fifo_exit(ret);
  243 #endif
  244     exit(ret);
  245 }
  246 
  247 EXPORT void
  248 setprops(htype)
  249     long    htype;
  250 {
  251 }
  252 
  253 EXPORT void
  254 changetape(donext)
  255     BOOL    donext;
  256 {
  257 }
  258 
  259 EXPORT void
  260 closetape()
  261 {
  262 }
  263 
  264 EXPORT void
  265 runnewvolscript(volno, nindex)
  266     int volno;
  267     int nindex;
  268 {
  269 }
  270 
  271 EXPORT long
  272 startvol(buf, amount)
  273     char    *buf;       /* The original buffer address      */
  274     long    amount;     /* The related requested transfer count */
  275 {
  276     return (1);
  277 }
  278 
  279 EXPORT BOOL
  280 verifyvol(buf, amt, volno, skipp)
  281     char    *buf;
  282     int amt;
  283     int volno;
  284     int *skipp;
  285 {
  286     return (TRUE);
  287 }
  288 
  289 LOCAL BOOL
  290 ispipe(f)
  291     int f;
  292 {
  293     struct stat sb;
  294 
  295     if (fstat(f, &sb) < 0)
  296         return (FALSE);
  297 
  298     if (S_ISFIFO(sb.st_mode))
  299         return (TRUE);
  300 
  301     return (FALSE);
  302 }
  303 
  304 EXPORT ssize_t
  305 readtape(buf, amount)
  306     char    *buf;
  307     size_t  amount;
  308 {
  309     register ssize_t    ret;
  310         int     oerrno = geterrno();
  311 
  312     while ((ret = read(0, buf, amount)) < 0) {
  313         if (geterrno() == EINTR) {
  314             seterrno(oerrno);
  315             continue;
  316         }
  317     }
  318     return (ret);
  319 }
  320 
  321 EXPORT ssize_t
  322 writetape(buf, amount)
  323     char    *buf;
  324     size_t  amount;
  325 {
  326     register ssize_t    ret;
  327         int     oerrno = geterrno();
  328 
  329     while ((ret = write(1, buf, amount)) < 0) {
  330         if (geterrno() == EINTR) {
  331             seterrno(oerrno);
  332             continue;
  333         }
  334     }
  335     return (ret);
  336 }