"Fossies" - the Fresh Open Source Software Archive

Member "schily-2021-09-18/strar/strar.c" (20 Aug 2021, 6491 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 /* @(#)strar.c  1.8 21/08/20 Copyright 2017-2018 J. Schilling */
    2 #include <schily/mconfig.h>
    3 #ifndef lint
    4 static  UConst char sccsid[] =
    5     "@(#)strar.c    1.8 21/08/20 Copyright 2017-2018 J. Schilling";
    6 #endif
    7 /*
    8  *  Manage a StreamArchive
    9  *
   10  *  Copyright (c) 2017-2018 J. Schilling
   11  */
   12 /*
   13  * The contents of this file are subject to the terms of the
   14  * Common Development and Distribution License, Version 1.0 only
   15  * (the "License").  You may not use this file except in compliance
   16  * with the License.
   17  *
   18  * See the file CDDL.Schily.txt in this distribution for details.
   19  * A copy of the CDDL is also available via the Internet at
   20  * http://www.opensource.org/licenses/cddl1.txt
   21  *
   22  * When distributing Covered Code, include this CDDL HEADER in each
   23  * file and include the License file CDDL.Schily.txt from this distribution.
   24  */
   25 
   26 #include <schily/stdio.h>
   27 #include <schily/types.h>
   28 #define GT_COMERR       /* #define comerr gtcomerr */
   29 #define GT_ERROR        /* #define error gterror   */
   30 #include <schily/schily.h>
   31 #include <schily/stdlib.h>
   32 #include <schily/strar.h>
   33 #include <schily/nlsdefs.h>
   34 
   35 LOCAL   BOOL    debug;
   36     BOOL    cflag;
   37     BOOL    xflag;
   38 LOCAL   BOOL    tflag;
   39 EXPORT  int verbose;
   40 
   41 EXPORT  BOOL    Ctime;
   42 EXPORT  time_t  now;
   43 EXPORT  time_t  sixmonth;
   44 
   45 LOCAL   char    *options = "help,version,debug,c,x,t,v+,f*,list*,nometa,basemeta";
   46 
   47 LOCAL   void    usage   __PR((int exitcode));
   48 LOCAL   void    pvers   __PR((void));
   49 EXPORT  int main    __PR((int ac, char *av[]));
   50 LOCAL   int create  __PR((strar *info, int ac, char * const av[], FILE *f));
   51 LOCAL   int send    __PR((strar *info, char *name));
   52 LOCAL   int extract __PR((strar *info));
   53 LOCAL   int list    __PR((strar *info));
   54 LOCAL   FILE    *openlist __PR((char *listfile));
   55 
   56 LOCAL void
   57 usage(exitcode)
   58     int exitcode;
   59 {
   60     error("Usage:   strar [options] [file1...filen]\n");
   61     error("Options:\n");
   62     error("\t-help\t\tprint this online help\n");
   63     error("\t-version\tprint version number\n");
   64     error("\t-debug\t\tprint additional debug output\n");
   65     error("\t-c\t\tcreate archive with named files\n");
   66     error("\t-x\t\textract archive\n");
   67     error("\t-t\t\tlist archive\n");
   68     error("\t-v\t\tincrement verbose level\n");
   69     error("\tlist=name\tread filenames from named file\n");
   70     error("\t-nometa\t\tdo not add meta data except path and size\n");
   71     error("\t-basemeta\tonly add basic meta data: path, mode, size, filetype\n");
   72     exit(exitcode);
   73 }
   74 
   75 LOCAL void
   76 pvers()
   77 {
   78     gtprintf("strar %s %s (%s-%s-%s)\n\n", "1.8", "2021/08/20",
   79         HOST_CPU, HOST_VENDOR, HOST_OS);
   80     gtprintf("Copyright (C) 2017-2021 %s\n", _("Jörg Schilling"));
   81     gtprintf("This is free software; see the source for copying conditions.  There is NO\n");
   82     gtprintf("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n");
   83     exit(0);
   84 }
   85 
   86 int
   87 main(ac, av)
   88     int ac;
   89     char    *av[];
   90 {
   91     int i;
   92     int cac;
   93     char    *const *cav;
   94     int fac;
   95     char    *const *fav;
   96     BOOL    prvers = FALSE;
   97     BOOL    help = FALSE;
   98     BOOL    nometa = FALSE;
   99     BOOL    basemeta = FALSE;
  100     FINFO   finfo;
  101     char    *archive = NULL;
  102     char    *listfile = NULL;
  103     char    *codeset = NULL;
  104 
  105     save_args(ac, av);
  106 
  107 #ifdef  USE_NLS
  108     setlocale(LC_ALL, "");
  109     if (setlocale(LC_ALL, "") != NULL) {
  110 #ifdef  CODESET
  111         codeset = nl_langinfo(CODESET);
  112 #endif
  113     }
  114 
  115 #if !defined(TEXT_DOMAIN)   /* Should be defined by cc -D */
  116 #define TEXT_DOMAIN "strar" /* Use this only if it weren't */
  117 #endif
  118     { char  *dir;
  119     dir = searchfileinpath("share/locale", F_OK,
  120                     SIP_ANY_FILE|SIP_NO_PATH, NULL);
  121     if (dir)
  122         (void) bindtextdomain(TEXT_DOMAIN, dir);
  123     else
  124 #if defined(PROTOTYPES) && defined(INS_BASE)
  125     (void) bindtextdomain(TEXT_DOMAIN, INS_BASE "/share/locale");
  126 #else
  127     (void) bindtextdomain(TEXT_DOMAIN, "/usr/share/locale");
  128 #endif
  129     (void) textdomain(TEXT_DOMAIN);
  130     }
  131 #endif  /* USE_NLS */
  132 
  133 
  134     cac = --ac;
  135     cav = ++av;
  136 
  137     if (getallargs(&cac, &cav, options, &help, &prvers, &debug,
  138             &cflag, &xflag, &tflag, &verbose, &archive,
  139             &listfile,
  140             &nometa, &basemeta) < 0) {
  141         errmsgno(EX_BAD, _("Bad flag: %s.\n"), cav[0]);
  142         usage(EX_BAD);
  143     }
  144     if (help)
  145         usage(0);
  146     if (prvers)
  147         pvers();
  148 
  149     if ((cflag + xflag + tflag) > 1)
  150         comerrno(EX_BAD, _("Only one of -c -x -l.\n"));
  151 
  152     fac = ac;
  153     fav = av;
  154     for (i = 0; getfiles(&fac, &fav, options) > 0; i++, fac--, fav++);
  155 
  156     if (cflag && i == 0 && listfile == NULL) {
  157         comerrno(EX_BAD,
  158         _("Too few arguments; will not create an empty archive..\n"));
  159     }
  160     if (strar_open(&finfo, archive, 0, cflag ? OM_WRITE : OM_READ,
  161         codeset) < 0) {
  162         comerr(_("Cannot open archive.\n"));
  163     }
  164     if (finfo.f_fp == stdout) {
  165         finfo.f_list = stderr;
  166         finfo.f_listname = "stderr";
  167     } else {
  168         finfo.f_list = stdout;
  169         finfo.f_listname = "stdout";
  170     }
  171     if (verbose > CMD_VERBOSE)
  172         verbose = CMD_VERBOSE;
  173     finfo.f_cmdflags |= verbose;
  174 
  175     if (cflag) {
  176         FILE    *f = NULL;
  177 
  178         if (listfile)
  179             f = openlist(listfile);
  180         finfo.f_cmdflags |= CMD_CREATE;
  181         if (nometa)
  182             finfo.f_xflags = 0;
  183         else if (basemeta)
  184             finfo.f_xflags = XF_BASE_FILEMETA;
  185         else
  186             finfo.f_xflags = XF_ALL_FILEMETA;
  187 #ifdef  __future__
  188         finfo.f_xflags |= XF_BINARY;
  189 #endif
  190         return (create(&finfo, ac, av, f));
  191     } else if (xflag) {
  192         finfo.f_cmdflags |= CMD_XTRACT;
  193         strar_receive(&finfo, extract);
  194     } else if (tflag) {
  195         finfo.f_cmdflags |= CMD_LIST;
  196         strar_receive(&finfo, list);
  197     } else {
  198         errmsgno(EX_BAD, _("No function specified.\n"));
  199         usage(EX_BAD);
  200     }
  201     strar_close(&finfo);
  202     exit(0);
  203 }
  204 
  205 LOCAL int
  206 create(info, ac, av, f)
  207     strar   *info;
  208     int ac;
  209     char    * const av[];
  210     FILE    *f;
  211 {
  212 
  213     strar_archtype(info);
  214     if (f) {
  215         char    *buf = NULL;
  216         size_t  len = 0;
  217         ssize_t amt;
  218 
  219         while ((amt = getdelim(&buf, &len, '\n', f)) >= 0) {
  220             if (buf[amt-1] == '\n')
  221                 buf[amt-1] = '\0';
  222             (void) send(info, buf);
  223         }
  224     } else {
  225         for (; getfiles(&ac, &av, options) > 0; ac--, av++) {
  226             if (strar_send(info, av[0]) != 0)
  227                 errmsg(_("Cannot archive '%s'.\n"), av[0]);
  228         }
  229     }
  230     strar_eof(info);
  231     return (0);
  232 }
  233 
  234 
  235 LOCAL int
  236 send(info, name)
  237     strar   *info;
  238     char    *name;
  239 {
  240     int ret;
  241 
  242     ret = strar_send(info, name);
  243     if (ret < 0) {
  244         if (ret == -2)
  245             errmsgno(EX_BAD,
  246                 _("Skipping '%s', not a file.\n"), name);
  247         else
  248             errmsg(_("Cannot archive '%s'.\n"), name);
  249     }
  250     return (ret);
  251 }
  252 
  253 LOCAL int
  254 extract(info)
  255     strar   *info;
  256 {
  257     return (strar_get(info));
  258 }
  259 
  260 LOCAL int
  261 list(info)
  262     strar   *info;
  263 {
  264     strar_list_file(info);
  265     if (info->f_size == 0)
  266         return (0);
  267     strar_skip(info);
  268     return (0);
  269 }
  270 
  271 LOCAL FILE *
  272 openlist(listfile)
  273     char    *listfile;
  274 {
  275     FILE    *listf;
  276 
  277     if (streql(listfile, "-")) {
  278         listf = stdin;
  279     } else if ((listf = fileopen(listfile, "r")) == (FILE *)NULL)
  280         comerr(_("Cannot open '%s'.\n"), listfile);
  281 
  282     return (listf);
  283 }