Radix cross Linux package tools

Package Tools – is a set of utilities to create, install, and update RcL packages

3 Commits   0 Branches   2 Tags
11c606a6 (kx 2023-04-11 01:18:34 +0300    1) 
11c606a6 (kx 2023-04-11 01:18:34 +0300    2) /**********************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300    3) 
11c606a6 (kx 2023-04-11 01:18:34 +0300    4)   Copyright 2019 Andrey V.Kosteltsev
11c606a6 (kx 2023-04-11 01:18:34 +0300    5) 
11c606a6 (kx 2023-04-11 01:18:34 +0300    6)   Licensed under the Radix.pro License, Version 1.0 (the "License");
11c606a6 (kx 2023-04-11 01:18:34 +0300    7)   you may not use this file  except  in compliance with the License.
11c606a6 (kx 2023-04-11 01:18:34 +0300    8)   You may obtain a copy of the License at
11c606a6 (kx 2023-04-11 01:18:34 +0300    9) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   10)      https://radix.pro/licenses/LICENSE-1.0-en_US.txt
11c606a6 (kx 2023-04-11 01:18:34 +0300   11) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   12)   Unless required by applicable law or agreed to in writing, software
11c606a6 (kx 2023-04-11 01:18:34 +0300   13)   distributed under the License is distributed on an "AS IS" BASIS,
11c606a6 (kx 2023-04-11 01:18:34 +0300   14)   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
11c606a6 (kx 2023-04-11 01:18:34 +0300   15)   implied.
11c606a6 (kx 2023-04-11 01:18:34 +0300   16) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   17)  **********************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300   18) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   19) #include <config.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   20) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   21) #include <stdlib.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   22) #include <stdio.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   23) #include <sys/types.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   24) #include <stdint.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   25) #include <dirent.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   26) #include <sys/stat.h> /* chmod(2)    */
11c606a6 (kx 2023-04-11 01:18:34 +0300   27) #include <fcntl.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   28) #include <linux/limits.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   29) #include <alloca.h>   /* alloca(3)   */
11c606a6 (kx 2023-04-11 01:18:34 +0300   30) #include <string.h>   /* strdup(3)   */
11c606a6 (kx 2023-04-11 01:18:34 +0300   31) #include <strings.h>  /* index(3)    */
11c606a6 (kx 2023-04-11 01:18:34 +0300   32) #include <libgen.h>   /* basename(3) */
11c606a6 (kx 2023-04-11 01:18:34 +0300   33) #include <ctype.h>    /* tolower(3)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300   34) #include <errno.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   35) #include <time.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   36) #include <sys/time.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   37) #include <pwd.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   38) #include <grp.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   39) #include <stdarg.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   40) #include <unistd.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   41) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   42) #include <sys/resource.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   43) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   44) #include <signal.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   45) #if !defined SIGCHLD && defined SIGCLD
11c606a6 (kx 2023-04-11 01:18:34 +0300   46) # define SIGCHLD SIGCLD
11c606a6 (kx 2023-04-11 01:18:34 +0300   47) #endif
11c606a6 (kx 2023-04-11 01:18:34 +0300   48) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   49) #define _GNU_SOURCE
11c606a6 (kx 2023-04-11 01:18:34 +0300   50) #include <getopt.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   51) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   52) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   53) #include <msglog.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   54) #include <wrapper.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   55) #include <system.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   56) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   57) #define PROGRAM_NAME "pkginfo"
11c606a6 (kx 2023-04-11 01:18:34 +0300   58) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   59) #include <defs.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   60) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   61) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   62) char *program     = PROGRAM_NAME;
11c606a6 (kx 2023-04-11 01:18:34 +0300   63) char *destination = NULL, *operation = NULL, *pkglog_fname = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   64) int   exit_status = EXIT_SUCCESS; /* errors counter */
11c606a6 (kx 2023-04-11 01:18:34 +0300   65) char *selfdir     = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   66) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   67) char           *pkgname = NULL,
11c606a6 (kx 2023-04-11 01:18:34 +0300   68)                 *pkgver = NULL,
11c606a6 (kx 2023-04-11 01:18:34 +0300   69)                   *arch = NULL,
11c606a6 (kx 2023-04-11 01:18:34 +0300   70)             *distroname = NULL,
11c606a6 (kx 2023-04-11 01:18:34 +0300   71)              *distrover = NULL,
11c606a6 (kx 2023-04-11 01:18:34 +0300   72)                  *group = NULL,
11c606a6 (kx 2023-04-11 01:18:34 +0300   73)                    *url = NULL,
11c606a6 (kx 2023-04-11 01:18:34 +0300   74)                *license = NULL,
11c606a6 (kx 2023-04-11 01:18:34 +0300   75)      *uncompressed_size = NULL,
11c606a6 (kx 2023-04-11 01:18:34 +0300   76)            *total_files = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   77) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   78) FILE *pkglog = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   79) FILE *output = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   80) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   81) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   82) #define FREE_PKGINFO_VARIABLES() \
11c606a6 (kx 2023-04-11 01:18:34 +0300   83)   if( pkgname )           { free( pkgname );           } pkgname = NULL;            \
11c606a6 (kx 2023-04-11 01:18:34 +0300   84)   if( pkgver )            { free( pkgver );            } pkgver = NULL;             \
11c606a6 (kx 2023-04-11 01:18:34 +0300   85)   if( arch )              { free( arch );              } arch = NULL;               \
11c606a6 (kx 2023-04-11 01:18:34 +0300   86)   if( distroname )        { free( distroname );        } distroname = NULL;         \
11c606a6 (kx 2023-04-11 01:18:34 +0300   87)   if( distrover )         { free( distrover );         } distrover = NULL;          \
11c606a6 (kx 2023-04-11 01:18:34 +0300   88)   if( group )             { free( group );             } group = NULL;              \
11c606a6 (kx 2023-04-11 01:18:34 +0300   89)   if( url )               { free( url );               } url = NULL;                \
11c606a6 (kx 2023-04-11 01:18:34 +0300   90)   if( license )           { free( license );           } license = NULL;            \
11c606a6 (kx 2023-04-11 01:18:34 +0300   91)   if( uncompressed_size ) { free( uncompressed_size ); } uncompressed_size = NULL;  \
11c606a6 (kx 2023-04-11 01:18:34 +0300   92)   if( total_files )       { free( total_files );       } total_files = NULL
11c606a6 (kx 2023-04-11 01:18:34 +0300   93) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   94) void free_resources()
11c606a6 (kx 2023-04-11 01:18:34 +0300   95) {
11c606a6 (kx 2023-04-11 01:18:34 +0300   96)   if( selfdir )      { free( selfdir );      selfdir     = NULL;  }
11c606a6 (kx 2023-04-11 01:18:34 +0300   97)   if( destination )  { free( destination );  destination = NULL;  }
11c606a6 (kx 2023-04-11 01:18:34 +0300   98)   if( operation )    { free( operation );    operation = NULL;    }
11c606a6 (kx 2023-04-11 01:18:34 +0300   99)   if( pkglog_fname ) { free( pkglog_fname ); pkglog_fname = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  100) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  101)   FREE_PKGINFO_VARIABLES();
11c606a6 (kx 2023-04-11 01:18:34 +0300  102) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  103) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  104) void usage()
11c606a6 (kx 2023-04-11 01:18:34 +0300  105) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  106)   free_resources();
11c606a6 (kx 2023-04-11 01:18:34 +0300  107) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  108)   fprintf( stdout, "\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  109)   fprintf( stdout, "Usage: %s [options] <pkglog|package>\n", program );
11c606a6 (kx 2023-04-11 01:18:34 +0300  110)   fprintf( stdout, "\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  111)   fprintf( stdout, "Read information from <pkglog> or <package> file and create\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  112)   fprintf( stdout, "requested package's service files in the destination directory.\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  113)   fprintf( stdout, "\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  114)   fprintf( stdout, "Options:\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  115)   fprintf( stdout, "  -h,--help                     Display this information.\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  116)   fprintf( stdout, "  -v,--version                  Display the version of %s utility.\n", program );
11c606a6 (kx 2023-04-11 01:18:34 +0300  117)   fprintf( stdout, "  -d,--destination=<DIR>        Target directory to save output files.\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  118)   fprintf( stdout, "  -o,--operations=<OP1,..,OPn>  Comma separated list of:\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  119)   fprintf( stdout, "\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  120)   fprintf( stdout, "Operations:\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  121)   fprintf( stdout, "  ----------------+----------------\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  122)   fprintf( stdout, "   operation name | output file\n"     );
11c606a6 (kx 2023-04-11 01:18:34 +0300  123)   fprintf( stdout, "  ----------------+----------------\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  124)   fprintf( stdout, "   pkginfo        | .PKGINFO\n"        );
11c606a6 (kx 2023-04-11 01:18:34 +0300  125)   fprintf( stdout, "   references     | .REFERENCES\n"     );
11c606a6 (kx 2023-04-11 01:18:34 +0300  126)   fprintf( stdout, "   requires       | .REQUIRES\n"       );
11c606a6 (kx 2023-04-11 01:18:34 +0300  127)   fprintf( stdout, "   description    | .DESCRIPTION\n"    );
11c606a6 (kx 2023-04-11 01:18:34 +0300  128)   fprintf( stdout, "   restore-links  | .RESTORELINKS\n"   );
11c606a6 (kx 2023-04-11 01:18:34 +0300  129)   fprintf( stdout, "   install-script | .INSTALL\n"        );
11c606a6 (kx 2023-04-11 01:18:34 +0300  130)   fprintf( stdout, "   filelist       | .FILELIST\n"       );
11c606a6 (kx 2023-04-11 01:18:34 +0300  131)   fprintf( stdout, "  ----------------+----------------\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  132)   fprintf( stdout, "\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  133)   fprintf( stdout, "Parameter:\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  134)   fprintf( stdout, "  <pkglog|package>              PKGLOG file or package tarball.\n"  );
11c606a6 (kx 2023-04-11 01:18:34 +0300  135)   fprintf( stdout, "\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  136) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  137)   exit( EXIT_FAILURE );
11c606a6 (kx 2023-04-11 01:18:34 +0300  138) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  139) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  140) void to_lowercase( char *s )
11c606a6 (kx 2023-04-11 01:18:34 +0300  141) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  142)   char *p = s;
11c606a6 (kx 2023-04-11 01:18:34 +0300  143)   while( p && *p ) { int c = *p; *p = tolower( c ); ++p; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  144) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  145) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  146) void to_uppercase( char *s )
11c606a6 (kx 2023-04-11 01:18:34 +0300  147) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  148)   char *p = s;
11c606a6 (kx 2023-04-11 01:18:34 +0300  149)   while( p && *p ) { int c = *p; *p = toupper( c ); ++p; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  150) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  151) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  152) void version()
11c606a6 (kx 2023-04-11 01:18:34 +0300  153) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  154)   char *upper = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  155) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  156)   upper = (char *)alloca( strlen( program ) + 1 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  157) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  158)   strcpy( (char *)upper, (const char *)program );
11c606a6 (kx 2023-04-11 01:18:34 +0300  159)   to_uppercase( upper );
11c606a6 (kx 2023-04-11 01:18:34 +0300  160) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  161)   fprintf( stdout, "%s (%s) %s\n", program, upper, PROGRAM_VERSION );
11c606a6 (kx 2023-04-11 01:18:34 +0300  162) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  163)   fprintf( stdout, "Copyright (C) 2019 Andrey V.Kosteltsev.\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  164)   fprintf( stdout, "This is free software.   There is NO warranty; not even\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  165)   fprintf( stdout, "for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  166)   fprintf( stdout, "\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  167) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  168)   free_resources();
11c606a6 (kx 2023-04-11 01:18:34 +0300  169)   exit( EXIT_SUCCESS );
11c606a6 (kx 2023-04-11 01:18:34 +0300  170) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  171) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  172) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  173) static void remove_trailing_slash( char *dir )
11c606a6 (kx 2023-04-11 01:18:34 +0300  174) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  175)   char *s;
11c606a6 (kx 2023-04-11 01:18:34 +0300  176) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  177)   if( !dir || dir[0] == '\0' ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300  178) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  179)   s = dir + strlen( dir ) - 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  180)   while( *s == '/' )
11c606a6 (kx 2023-04-11 01:18:34 +0300  181)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  182)     *s = '\0'; --s;
11c606a6 (kx 2023-04-11 01:18:34 +0300  183)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  184) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  185) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  186) void fatal_error_actions( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300  187) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  188)   logmsg( errlog, MSG_NOTICE, "Free resources on FATAL error..." );
11c606a6 (kx 2023-04-11 01:18:34 +0300  189)   free_resources();
11c606a6 (kx 2023-04-11 01:18:34 +0300  190) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  191) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  192) void sigint( int signum )
11c606a6 (kx 2023-04-11 01:18:34 +0300  193) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  194)   (void)signum;
11c606a6 (kx 2023-04-11 01:18:34 +0300  195)   free_resources();
11c606a6 (kx 2023-04-11 01:18:34 +0300  196) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  197) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  198) static void set_signal_handlers()
11c606a6 (kx 2023-04-11 01:18:34 +0300  199) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  200)   struct sigaction  sa;
11c606a6 (kx 2023-04-11 01:18:34 +0300  201)   sigset_t          set;
11c606a6 (kx 2023-04-11 01:18:34 +0300  202) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  203)   memset( &sa, 0, sizeof( sa ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  204)   sa.sa_handler = sigint;          /* TERM, INT */
11c606a6 (kx 2023-04-11 01:18:34 +0300  205)   sa.sa_flags = SA_RESTART;
11c606a6 (kx 2023-04-11 01:18:34 +0300  206)   sigemptyset( &set );
11c606a6 (kx 2023-04-11 01:18:34 +0300  207)   sigaddset( &set, SIGTERM );
11c606a6 (kx 2023-04-11 01:18:34 +0300  208)   sigaddset( &set, SIGINT );
11c606a6 (kx 2023-04-11 01:18:34 +0300  209)   sa.sa_mask = set;
11c606a6 (kx 2023-04-11 01:18:34 +0300  210)   sigaction( SIGTERM, &sa, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300  211)   sigaction( SIGINT, &sa,  NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300  212) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  213)   memset( &sa, 0, sizeof( sa ) );  /* ignore SIGPIPE */
11c606a6 (kx 2023-04-11 01:18:34 +0300  214)   sa.sa_handler = SIG_IGN;
11c606a6 (kx 2023-04-11 01:18:34 +0300  215)   sa.sa_flags = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  216)   sigaction( SIGPIPE, &sa, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300  217) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  218)   /* System V fork+wait does not work if SIGCHLD is ignored */
11c606a6 (kx 2023-04-11 01:18:34 +0300  219)   signal( SIGCHLD, SIG_DFL );
11c606a6 (kx 2023-04-11 01:18:34 +0300  220) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  221) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  222) enum _pkglog_type
11c606a6 (kx 2023-04-11 01:18:34 +0300  223) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  224)   PKGLOG_TEXT = 0,
11c606a6 (kx 2023-04-11 01:18:34 +0300  225)   PKGLOG_GZ,
11c606a6 (kx 2023-04-11 01:18:34 +0300  226)   PKGLOG_BZ2,
11c606a6 (kx 2023-04-11 01:18:34 +0300  227)   PKGLOG_XZ,
11c606a6 (kx 2023-04-11 01:18:34 +0300  228)   PKGLOG_TAR,
11c606a6 (kx 2023-04-11 01:18:34 +0300  229) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  230)   PKGLOG_UNKNOWN
11c606a6 (kx 2023-04-11 01:18:34 +0300  231) };
11c606a6 (kx 2023-04-11 01:18:34 +0300  232) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  233) static enum _pkglog_type pkglog_type = PKGLOG_UNKNOWN;
11c606a6 (kx 2023-04-11 01:18:34 +0300  234) static char uncompress[2] = { 0, 0 };
11c606a6 (kx 2023-04-11 01:18:34 +0300  235) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  236) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  237) static enum _pkglog_type check_pkglog_file( const char *fname )
11c606a6 (kx 2023-04-11 01:18:34 +0300  238) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  239)   struct stat st;
11c606a6 (kx 2023-04-11 01:18:34 +0300  240)   size_t pkglog_size = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  241)   unsigned char buf[8];
11c606a6 (kx 2023-04-11 01:18:34 +0300  242)   int rc, fd;
11c606a6 (kx 2023-04-11 01:18:34 +0300  243) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  244)   /* SIGNATURES: https://www.garykessler.net/library/file_sigs.html */
11c606a6 (kx 2023-04-11 01:18:34 +0300  245) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  246)   uncompress[0] = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300  247) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  248)   if( stat( fname, &st ) == -1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300  249)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  250)     FATAL_ERROR( "Cannot access %s file: %s", basename( (char *)fname ), strerror( errno ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  251)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  252) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  253)   pkglog_size = st.st_size;
11c606a6 (kx 2023-04-11 01:18:34 +0300  254) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  255)   if( (fd = open( fname, O_RDONLY )) == -1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300  256)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  257)     FATAL_ERROR( "Cannot open %s file: %s", basename( (char *)fname ), strerror( errno ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  258)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  259) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  260)   rc = (int)read( fd, (void *)&buf[0], 7 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  261)   if( rc != 7 )
11c606a6 (kx 2023-04-11 01:18:34 +0300  262)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  263)     FATAL_ERROR( "Unknown type of input file %s", basename( (char *)fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  264)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  265)   buf[7] = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300  266) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  267)   /* TEXT */
11c606a6 (kx 2023-04-11 01:18:34 +0300  268)   if( !strncmp( (const char *)&buf[0], "PACKAGE", 7 ) )
11c606a6 (kx 2023-04-11 01:18:34 +0300  269)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  270)     close( fd ); return PKGLOG_TEXT;
11c606a6 (kx 2023-04-11 01:18:34 +0300  271)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  272) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  273)   /* GZ */
11c606a6 (kx 2023-04-11 01:18:34 +0300  274)   if( buf[0] == 0x1F && buf[1] == 0x8B && buf[2] == 0x08 )
11c606a6 (kx 2023-04-11 01:18:34 +0300  275)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  276)     uncompress[0] = 'x';
11c606a6 (kx 2023-04-11 01:18:34 +0300  277)     close( fd ); return PKGLOG_GZ;
11c606a6 (kx 2023-04-11 01:18:34 +0300  278)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  279) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  280)   /* BZ2 */
11c606a6 (kx 2023-04-11 01:18:34 +0300  281)   if( buf[0] == 0x42 && buf[1] == 0x5A && buf[2] == 0x68 )
11c606a6 (kx 2023-04-11 01:18:34 +0300  282)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  283)     uncompress[0] = 'j';
11c606a6 (kx 2023-04-11 01:18:34 +0300  284)     close( fd ); return PKGLOG_BZ2;
11c606a6 (kx 2023-04-11 01:18:34 +0300  285)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  286) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  287)   /* XZ */
11c606a6 (kx 2023-04-11 01:18:34 +0300  288)   if( buf[0] == 0xFD && buf[1] == 0x37 && buf[2] == 0x7A &&
11c606a6 (kx 2023-04-11 01:18:34 +0300  289)       buf[3] == 0x58 && buf[4] == 0x5A && buf[5] == 0x00   )
11c606a6 (kx 2023-04-11 01:18:34 +0300  290)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  291)     uncompress[0] = 'J';
11c606a6 (kx 2023-04-11 01:18:34 +0300  292)     close( fd ); return PKGLOG_XZ;
11c606a6 (kx 2023-04-11 01:18:34 +0300  293)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  294) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  295)   if( pkglog_size > 262 )
11c606a6 (kx 2023-04-11 01:18:34 +0300  296)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  297)     if( lseek( fd, 257, SEEK_SET ) == -1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300  298)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  299)       FATAL_ERROR( "Cannot check signature of %s file: %s", basename( (char *)fname ), strerror( errno ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  300)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  301)     rc = (int)read( fd, &buf[0], 5 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  302)     if( rc != 5 )
11c606a6 (kx 2023-04-11 01:18:34 +0300  303)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  304)       FATAL_ERROR( "Cannot read signature of %s file", basename( (char *)fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  305)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  306)     /* TAR */
11c606a6 (kx 2023-04-11 01:18:34 +0300  307)     if( buf[0] == 0x75 && buf[1] == 0x73 && buf[2] == 0x74 && buf[3] == 0x61 && buf[4] == 0x72 )
11c606a6 (kx 2023-04-11 01:18:34 +0300  308)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  309)       close( fd ); return PKGLOG_TAR;
11c606a6 (kx 2023-04-11 01:18:34 +0300  310)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  311)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  312) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  313)   close( fd ); return PKGLOG_UNKNOWN;
11c606a6 (kx 2023-04-11 01:18:34 +0300  314) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  315) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  316) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  317) void get_args( int argc, char *argv[] )
11c606a6 (kx 2023-04-11 01:18:34 +0300  318) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  319)   const char* short_options = "hvd:o:";
11c606a6 (kx 2023-04-11 01:18:34 +0300  320) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  321)   const struct option long_options[] =
11c606a6 (kx 2023-04-11 01:18:34 +0300  322)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  323)     { "help",        no_argument,       NULL, 'h' },
11c606a6 (kx 2023-04-11 01:18:34 +0300  324)     { "version",     no_argument,       NULL, 'v' },
11c606a6 (kx 2023-04-11 01:18:34 +0300  325)     { "destination", required_argument, NULL, 'd' },
11c606a6 (kx 2023-04-11 01:18:34 +0300  326)     { "operations",  required_argument, NULL, 'o' },
11c606a6 (kx 2023-04-11 01:18:34 +0300  327)     { NULL,          0,                 NULL,  0  }
11c606a6 (kx 2023-04-11 01:18:34 +0300  328)   };
11c606a6 (kx 2023-04-11 01:18:34 +0300  329) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  330)   int ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  331)   int option_index = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  332) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  333)   while( (ret = getopt_long( argc, argv, short_options, long_options, &option_index )) != -1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300  334)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  335)     switch( ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300  336)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  337)       case 'h':
11c606a6 (kx 2023-04-11 01:18:34 +0300  338)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  339)         usage();
11c606a6 (kx 2023-04-11 01:18:34 +0300  340)         break;
11c606a6 (kx 2023-04-11 01:18:34 +0300  341)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  342)       case 'v':
11c606a6 (kx 2023-04-11 01:18:34 +0300  343)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  344)         version();
11c606a6 (kx 2023-04-11 01:18:34 +0300  345)         break;
11c606a6 (kx 2023-04-11 01:18:34 +0300  346)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  347) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  348)       case 'd':
11c606a6 (kx 2023-04-11 01:18:34 +0300  349)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  350)         if( optarg != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  351)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300  352)           destination = xstrdup( (const char *)optarg );
11c606a6 (kx 2023-04-11 01:18:34 +0300  353)           remove_trailing_slash( destination );
11c606a6 (kx 2023-04-11 01:18:34 +0300  354)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300  355)         else
11c606a6 (kx 2023-04-11 01:18:34 +0300  356)           /* option is present but without value */
11c606a6 (kx 2023-04-11 01:18:34 +0300  357)           usage();
11c606a6 (kx 2023-04-11 01:18:34 +0300  358)         break;
11c606a6 (kx 2023-04-11 01:18:34 +0300  359)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  360)       case 'o':
11c606a6 (kx 2023-04-11 01:18:34 +0300  361)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  362)         operation = xstrdup( (const char *)optarg );
11c606a6 (kx 2023-04-11 01:18:34 +0300  363)         to_lowercase( operation );
11c606a6 (kx 2023-04-11 01:18:34 +0300  364)         break;
11c606a6 (kx 2023-04-11 01:18:34 +0300  365)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  366) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  367)       case '?': default:
11c606a6 (kx 2023-04-11 01:18:34 +0300  368)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  369)         usage();
11c606a6 (kx 2023-04-11 01:18:34 +0300  370)         break;
11c606a6 (kx 2023-04-11 01:18:34 +0300  371)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  372)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  373)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  374) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  375)   if( destination == NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  376)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  377)     char cwd[PATH_MAX];
11c606a6 (kx 2023-04-11 01:18:34 +0300  378)     if( getcwd( cwd, sizeof(cwd) ) != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  379)       destination = xstrdup( (const char *)cwd );
11c606a6 (kx 2023-04-11 01:18:34 +0300  380)     else
11c606a6 (kx 2023-04-11 01:18:34 +0300  381)       destination = xstrdup( "." );
11c606a6 (kx 2023-04-11 01:18:34 +0300  382)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  383) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  384)   if( operation == NULL ) usage();
11c606a6 (kx 2023-04-11 01:18:34 +0300  385) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  386)   /* last command line argument is the LOGFILE */
11c606a6 (kx 2023-04-11 01:18:34 +0300  387)   if( optind < argc )
11c606a6 (kx 2023-04-11 01:18:34 +0300  388)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  389)     pkglog_fname = xstrdup( (const char *)argv[optind++] );
11c606a6 (kx 2023-04-11 01:18:34 +0300  390)     if( pkglog_fname == NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  391)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  392)       usage();
11c606a6 (kx 2023-04-11 01:18:34 +0300  393)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  394)     pkglog_type = check_pkglog_file( (const char *)pkglog_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300  395)     if( pkglog_type == PKGLOG_UNKNOWN )
11c606a6 (kx 2023-04-11 01:18:34 +0300  396)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  397)       ERROR( "%s: Unknown input file format", basename( pkglog_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  398)       usage();
11c606a6 (kx 2023-04-11 01:18:34 +0300  399)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  400)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  401)   else
11c606a6 (kx 2023-04-11 01:18:34 +0300  402)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  403)     usage();
11c606a6 (kx 2023-04-11 01:18:34 +0300  404)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  405) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  406) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  407) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  408) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300  409)   Especialy for pkginfo lines.
11c606a6 (kx 2023-04-11 01:18:34 +0300  410)   Remove leading spaces and take non-space characters only:
11c606a6 (kx 2023-04-11 01:18:34 +0300  411)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300  412) static char *skip_spaces( char *s )
11c606a6 (kx 2023-04-11 01:18:34 +0300  413) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  414)   char *q, *p = (char *)0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  415) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  416)   if( !s || *s == '\0' ) return p;
11c606a6 (kx 2023-04-11 01:18:34 +0300  417) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  418)   p = s;
11c606a6 (kx 2023-04-11 01:18:34 +0300  419) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  420)   while( (*p == ' ' || *p == '\t') && *p != '\0' ) { ++p; } q = p;
11c606a6 (kx 2023-04-11 01:18:34 +0300  421)   while(  *q != ' ' && *q != '\t'  && *q != '\0' ) { ++q; } *q = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300  422) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  423)   if( *p == '\0' ) return (char *)0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  424) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  425)   return( xstrdup( (const char *)p ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  426) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  427) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  428) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300  429)   remove spaces at end of line:
11c606a6 (kx 2023-04-11 01:18:34 +0300  430)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300  431) static void skip_eol_spaces( char *s )
11c606a6 (kx 2023-04-11 01:18:34 +0300  432) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  433)   char *p = (char *)0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  434) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  435)   if( !s || *s == '\0' ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300  436) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  437)   p = s + strlen( s ) - 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  438)   while( isspace( *p ) ) { *p-- = '\0'; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  439) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  440) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  441) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  442) int printf_variable( FILE *output, char *log_fname, char *name, char *value, char *pattern, int error )
11c606a6 (kx 2023-04-11 01:18:34 +0300  443) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  444)   int   exit_status = 0; /* local errors counter */
11c606a6 (kx 2023-04-11 01:18:34 +0300  445)   char  buf[24];
11c606a6 (kx 2023-04-11 01:18:34 +0300  446)   char *p;
11c606a6 (kx 2023-04-11 01:18:34 +0300  447) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  448)   bzero( (void *)buf, 24 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  449) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  450)   if( pattern )
11c606a6 (kx 2023-04-11 01:18:34 +0300  451)     (void)sprintf( (char *)&buf[0], "%s", pattern );
11c606a6 (kx 2023-04-11 01:18:34 +0300  452) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  453)   p = (char *)&buf[0];
11c606a6 (kx 2023-04-11 01:18:34 +0300  454)   p[strlen(buf) - 1] = '\0'; /* skip colon at end of pattern */
11c606a6 (kx 2023-04-11 01:18:34 +0300  455) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  456)   if( value )
11c606a6 (kx 2023-04-11 01:18:34 +0300  457)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  458)     fprintf( output, "%s=%s\n", name, value );
11c606a6 (kx 2023-04-11 01:18:34 +0300  459)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  460)   else
11c606a6 (kx 2023-04-11 01:18:34 +0300  461)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  462)     if( error )
11c606a6 (kx 2023-04-11 01:18:34 +0300  463)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  464)       ERROR( "There is no %s declaration in the %s file", p, log_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300  465)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  466)     else
11c606a6 (kx 2023-04-11 01:18:34 +0300  467)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  468)       if( ! DO_NOT_WARN_ABOUT_OPT_PKGINFO_ITEMS )
11c606a6 (kx 2023-04-11 01:18:34 +0300  469)         WARNING( "There is no %s declaration in the %s file", p, log_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300  470)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  471)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  472) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  473)   return( exit_status );
11c606a6 (kx 2023-04-11 01:18:34 +0300  474) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  475) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  476) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  477) static void get_short_description( char *buf, const char *line )
11c606a6 (kx 2023-04-11 01:18:34 +0300  478) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  479)   char *s, *p, *q;
11c606a6 (kx 2023-04-11 01:18:34 +0300  480) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  481)   if( buf ) { buf[0] = '\0'; s = buf; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  482)   if( !line || line[0] == '\0' ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300  483) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  484)   p = index( line, '(' );
11c606a6 (kx 2023-04-11 01:18:34 +0300  485)   q = index( line, ')' );
11c606a6 (kx 2023-04-11 01:18:34 +0300  486)   if( p && q && q > p )
11c606a6 (kx 2023-04-11 01:18:34 +0300  487)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  488)     *s = '"'; ++s; /* start " */
11c606a6 (kx 2023-04-11 01:18:34 +0300  489)     ++p;
11c606a6 (kx 2023-04-11 01:18:34 +0300  490)     while( *p && p < q )
11c606a6 (kx 2023-04-11 01:18:34 +0300  491)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  492)       *s = *p;
11c606a6 (kx 2023-04-11 01:18:34 +0300  493)       ++p; ++s;
11c606a6 (kx 2023-04-11 01:18:34 +0300  494)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  495)     *s++ = '"';    /* stop "  */
11c606a6 (kx 2023-04-11 01:18:34 +0300  496)     *s   = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300  497)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  498) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  499) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  500) int write_pkginfo()
11c606a6 (kx 2023-04-11 01:18:34 +0300  501) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  502)   int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  503) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  504)   if( pkglog_fname != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  505)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  506)     pkglog = fopen( (const char *)pkglog_fname, "r" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  507)     if( !pkglog )
11c606a6 (kx 2023-04-11 01:18:34 +0300  508)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  509)       FATAL_ERROR( "Cannot open %s file", pkglog_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300  510)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  511)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  512) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  513)   if( destination != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  514)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  515)     char *output_fname = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  516) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  517)     output_fname = (char *)alloca( strlen( destination ) + 10 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  518)     strcpy( output_fname, destination );
11c606a6 (kx 2023-04-11 01:18:34 +0300  519)     strcat( output_fname, "/.PKGINFO" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  520)     output = fopen( (const char *)output_fname, "w" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  521)     if( !output )
11c606a6 (kx 2023-04-11 01:18:34 +0300  522)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  523)       FATAL_ERROR( "Cannot create %s file", output_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300  524)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  525)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  526) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  527)   if( (pkglog != NULL) && (output != NULL) )
11c606a6 (kx 2023-04-11 01:18:34 +0300  528)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  529)     char *ln   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  530)     char *line = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  531)     char *desc = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  532) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  533)     char           *pkgname_pattern = "PACKAGE NAME:",
11c606a6 (kx 2023-04-11 01:18:34 +0300  534)                     *pkgver_pattern = "PACKAGE VERSION:",
11c606a6 (kx 2023-04-11 01:18:34 +0300  535)                       *arch_pattern = "ARCH:",
11c606a6 (kx 2023-04-11 01:18:34 +0300  536)                 *distroname_pattern = "DISTRO:",
11c606a6 (kx 2023-04-11 01:18:34 +0300  537)                  *distrover_pattern = "DISTRO VERSION:",
11c606a6 (kx 2023-04-11 01:18:34 +0300  538)                      *group_pattern = "GROUP:",
11c606a6 (kx 2023-04-11 01:18:34 +0300  539)                        *url_pattern = "URL:",
11c606a6 (kx 2023-04-11 01:18:34 +0300  540)                    *license_pattern = "LICENSE:",
11c606a6 (kx 2023-04-11 01:18:34 +0300  541)          *uncompressed_size_pattern = "UNCOMPRESSED SIZE:",
11c606a6 (kx 2023-04-11 01:18:34 +0300  542)                *total_files_pattern = "TOTAL FILES:";
11c606a6 (kx 2023-04-11 01:18:34 +0300  543) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  544)     line = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300  545)     if( !line )
11c606a6 (kx 2023-04-11 01:18:34 +0300  546)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  547)       FATAL_ERROR( "Cannot allocate memory" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  548)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  549) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  550)     ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  551) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  552)     while( (ln = fgets( line, PATH_MAX, pkglog )) )
11c606a6 (kx 2023-04-11 01:18:34 +0300  553)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  554)       char *match = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  555) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  556)       ln[strlen(ln) - 1] = '\0'; /* replace new-line symbol      */
11c606a6 (kx 2023-04-11 01:18:34 +0300  557)       skip_eol_spaces( ln );     /* remove spaces at end-of-line */
11c606a6 (kx 2023-04-11 01:18:34 +0300  558) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  559)       if( (match = strstr( ln, pkgname_pattern )) && match == ln ) /* at start of line only */
11c606a6 (kx 2023-04-11 01:18:34 +0300  560)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  561)         pkgname = skip_spaces( ln + strlen( pkgname_pattern ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  562)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  563)       if( (match = strstr( ln, pkgver_pattern )) && match == ln )
11c606a6 (kx 2023-04-11 01:18:34 +0300  564)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  565)         pkgver = skip_spaces( ln + strlen( pkgver_pattern ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  566)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  567)       if( (match = strstr( ln, arch_pattern )) && match == ln )
11c606a6 (kx 2023-04-11 01:18:34 +0300  568)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  569)         arch = skip_spaces( ln + strlen( arch_pattern ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  570)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  571)       if( (match = strstr( ln, distroname_pattern )) && match == ln )
11c606a6 (kx 2023-04-11 01:18:34 +0300  572)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  573)         distroname = skip_spaces( ln + strlen( distroname_pattern ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  574)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  575)       if( (match = strstr( ln, distrover_pattern )) && match == ln )
11c606a6 (kx 2023-04-11 01:18:34 +0300  576)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  577)         distrover = skip_spaces( ln + strlen( distrover_pattern ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  578)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  579)       if( (match = strstr( ln, group_pattern )) && match == ln )
11c606a6 (kx 2023-04-11 01:18:34 +0300  580)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  581)         group = skip_spaces( ln + strlen( group_pattern ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  582)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  583)       if( (match = strstr( ln, url_pattern )) && match == ln )
11c606a6 (kx 2023-04-11 01:18:34 +0300  584)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  585)         url = skip_spaces( ln + strlen( url_pattern ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  586)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  587)       if( (match = strstr( ln, license_pattern )) && match == ln )
11c606a6 (kx 2023-04-11 01:18:34 +0300  588)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  589)         license = skip_spaces( ln + strlen( license_pattern ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  590)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  591)       if( (match = strstr( ln, uncompressed_size_pattern )) && match == ln )
11c606a6 (kx 2023-04-11 01:18:34 +0300  592)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  593)         uncompressed_size = skip_spaces( ln + strlen( uncompressed_size_pattern ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  594)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  595)       if( (match = strstr( ln, total_files_pattern )) && match == ln )
11c606a6 (kx 2023-04-11 01:18:34 +0300  596)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  597)         total_files = skip_spaces( ln + strlen( total_files_pattern ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  598)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  599)       if( (match = strstr( ln, "PACKAGE DESCRIPTION:" )) && match == ln )
11c606a6 (kx 2023-04-11 01:18:34 +0300  600)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  601)         char *buf = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  602) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  603)         buf = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300  604)         if( !buf )
11c606a6 (kx 2023-04-11 01:18:34 +0300  605)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300  606)           FATAL_ERROR( "Cannot allocate memory" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  607)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300  608) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  609)         /* Get short_description from PACKAGE DESCRIPTION */
11c606a6 (kx 2023-04-11 01:18:34 +0300  610)         ln = fgets( line, PATH_MAX, pkglog );
11c606a6 (kx 2023-04-11 01:18:34 +0300  611)         ln[strlen(ln) - 1] = '\0'; /* replace new-line symbol */
11c606a6 (kx 2023-04-11 01:18:34 +0300  612) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  613)         bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300  614)         get_short_description( buf, (const char *)line );
11c606a6 (kx 2023-04-11 01:18:34 +0300  615)         if( buf[0] != '\0' )
11c606a6 (kx 2023-04-11 01:18:34 +0300  616)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300  617)           desc = xstrdup( (const char *)buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300  618)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300  619)         free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300  620)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  621)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  622) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  623)     free( line );
11c606a6 (kx 2023-04-11 01:18:34 +0300  624) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  625)     ret += printf_variable( output, pkglog_fname, "pkgname",           pkgname,           pkgname_pattern,           1 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  626)     ret += printf_variable( output, pkglog_fname, "pkgver",            pkgver,            pkgver_pattern,            1 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  627)     ret += printf_variable( output, pkglog_fname, "arch",              arch,              arch_pattern,              1 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  628)     ret += printf_variable( output, pkglog_fname, "distroname",        distroname,        distroname_pattern,        1 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  629)     ret += printf_variable( output, pkglog_fname, "distrover",         distrover,         distrover_pattern,         1 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  630)     ret += printf_variable( output, pkglog_fname, "group",             group,             group_pattern,             0 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  631)     if( desc != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  632)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  633)       ret += printf_variable( output, pkglog_fname, "short_description", desc, "SHORT DESCRIPTION:", 0 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  634)       free( desc ); desc = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  635)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  636)     ret += printf_variable( output, pkglog_fname, "url",               url,               url_pattern,               0 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  637)     ret += printf_variable( output, pkglog_fname, "license",           license,           license_pattern,           0 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  638)     ret += printf_variable( output, pkglog_fname, "uncompressed_size", uncompressed_size, uncompressed_size_pattern, 0 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  639)     ret += printf_variable( output, pkglog_fname, "total_files",       total_files,       total_files_pattern,       0 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  640) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  641)     FREE_PKGINFO_VARIABLES();
11c606a6 (kx 2023-04-11 01:18:34 +0300  642) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  643)     fclose( pkglog ); pkglog = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  644)     fclose( output ); output = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  645)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  646) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  647)   return( ret );
11c606a6 (kx 2023-04-11 01:18:34 +0300  648) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  649) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  650) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  651) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300  652)   NOTE:
11c606a6 (kx 2023-04-11 01:18:34 +0300  653)     1. first line has number 1.
11c606a6 (kx 2023-04-11 01:18:34 +0300  654)     2. sections are ordered according to following list:
11c606a6 (kx 2023-04-11 01:18:34 +0300  655)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300  656) int reference_counter   = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  657) int requires            = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  658) int package_description = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  659) int restore_links       = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  660) int install_script      = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  661) int file_list           = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  662) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  663) int refcount = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  664) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  665) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  666) int get_pkglog_sections()
11c606a6 (kx 2023-04-11 01:18:34 +0300  667) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  668)   int ret = -1, found = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  669) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  670)   if( pkglog_fname != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  671)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  672)     pkglog = fopen( (const char *)pkglog_fname, "r" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  673)     if( !pkglog )
11c606a6 (kx 2023-04-11 01:18:34 +0300  674)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  675)       FATAL_ERROR( "Cannot open %s file", pkglog_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300  676)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  677)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  678) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  679)   if( pkglog != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  680)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  681)     char *ln   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  682)     char *line = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  683) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  684)     line = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300  685)     if( !line )
11c606a6 (kx 2023-04-11 01:18:34 +0300  686)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  687)       FATAL_ERROR( "Cannot allocate memory" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  688)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  689) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  690)     ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  691) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  692)     while( (ln = fgets( line, PATH_MAX, pkglog )) )
11c606a6 (kx 2023-04-11 01:18:34 +0300  693)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  694)       char *match = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  695) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  696)       if( (match = strstr( ln, "REFERENCE COUNTER:" )) && match == ln ) /* at start of line only */
11c606a6 (kx 2023-04-11 01:18:34 +0300  697)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  698)         reference_counter = ret + 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  699)         ++found;
11c606a6 (kx 2023-04-11 01:18:34 +0300  700)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  701)       if( (match = strstr( ln, "REQUIRES:" )) && match == ln )
11c606a6 (kx 2023-04-11 01:18:34 +0300  702)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  703)         requires = ret + 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  704)         ++found;
11c606a6 (kx 2023-04-11 01:18:34 +0300  705)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  706)       if( (match = strstr( ln, "PACKAGE DESCRIPTION:" )) && match == ln )
11c606a6 (kx 2023-04-11 01:18:34 +0300  707)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  708)         package_description = ret + 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  709)         ++found;
11c606a6 (kx 2023-04-11 01:18:34 +0300  710)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  711)       if( (match = strstr( ln, "RESTORE LINKS:" )) && match == ln )
11c606a6 (kx 2023-04-11 01:18:34 +0300  712)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  713)         restore_links = ret + 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  714)         ++found;
11c606a6 (kx 2023-04-11 01:18:34 +0300  715)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  716)       if( (match = strstr( ln, "INSTALL SCRIPT:" )) && match == ln )
11c606a6 (kx 2023-04-11 01:18:34 +0300  717)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  718)         install_script = ret + 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  719)         ++found;
11c606a6 (kx 2023-04-11 01:18:34 +0300  720)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  721)       if( (match = strstr( ln, "FILE LIST:" )) && match == ln )
11c606a6 (kx 2023-04-11 01:18:34 +0300  722)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  723)         file_list = ret + 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  724)         ++found;
11c606a6 (kx 2023-04-11 01:18:34 +0300  725)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  726) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  727)       ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  728)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  729) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  730)     free( line );
11c606a6 (kx 2023-04-11 01:18:34 +0300  731) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  732)     ret = found;
11c606a6 (kx 2023-04-11 01:18:34 +0300  733) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  734)     fclose( pkglog ); pkglog = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  735)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  736) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  737)   return( ret );
11c606a6 (kx 2023-04-11 01:18:34 +0300  738) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  739) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  740) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  741) int get_pkglog_line( char *pattern )
11c606a6 (kx 2023-04-11 01:18:34 +0300  742) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  743)   int ret = -1, found = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  744) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  745)   if( pkglog_fname != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  746)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  747)     pkglog = fopen( (const char *)pkglog_fname, "r" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  748)     if( !pkglog )
11c606a6 (kx 2023-04-11 01:18:34 +0300  749)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  750)       FATAL_ERROR( "Cannot open %s file", pkglog_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300  751)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  752)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  753) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  754)   if( pkglog != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  755)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  756)     char *ln   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  757)     char *line = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  758) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  759)     line = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300  760)     if( !line )
11c606a6 (kx 2023-04-11 01:18:34 +0300  761)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  762)       FATAL_ERROR( "Cannot allocate memory" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  763)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  764) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  765)     ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  766)     while( (ln = fgets( line, PATH_MAX, pkglog )) )
11c606a6 (kx 2023-04-11 01:18:34 +0300  767)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  768)       char *match = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  769) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  770)       if( (match = strstr( ln, pattern )) && match == ln ) /* at start of line only */
11c606a6 (kx 2023-04-11 01:18:34 +0300  771)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  772)         ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  773)         ++found;
11c606a6 (kx 2023-04-11 01:18:34 +0300  774)         break;
11c606a6 (kx 2023-04-11 01:18:34 +0300  775)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  776)       ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  777)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  778)     if( !found ) ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  779) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  780)     free( line );
11c606a6 (kx 2023-04-11 01:18:34 +0300  781) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  782)     fclose( pkglog ); pkglog = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  783)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  784)   return( ret );
11c606a6 (kx 2023-04-11 01:18:34 +0300  785) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  786) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  787) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  788) int get_ref_cnt()
11c606a6 (kx 2023-04-11 01:18:34 +0300  789) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  790)   int ret = -1, found = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  791) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  792)   if( pkglog_fname != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  793)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  794)     pkglog = fopen( (const char *)pkglog_fname, "r" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  795)     if( !pkglog )
11c606a6 (kx 2023-04-11 01:18:34 +0300  796)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  797)       FATAL_ERROR( "Cannot open %s file", pkglog_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300  798)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  799)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  800) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  801)   if( pkglog != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  802)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  803)     char *ln   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  804)     char *line = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  805) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  806)     line = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300  807)     if( !line )
11c606a6 (kx 2023-04-11 01:18:34 +0300  808)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  809)       FATAL_ERROR( "Cannot allocate memory" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  810)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  811) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  812)     ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  813) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  814)     while( (ln = fgets( line, PATH_MAX, pkglog )) )
11c606a6 (kx 2023-04-11 01:18:34 +0300  815)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  816)       char *match = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  817) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  818)       ln[strlen(ln) - 1] = '\0'; /* replace new-line symbol      */
11c606a6 (kx 2023-04-11 01:18:34 +0300  819)       skip_eol_spaces( ln );     /* remove spaces at end-of-line */
11c606a6 (kx 2023-04-11 01:18:34 +0300  820) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  821)       if( (match = strstr( ln, "REFERENCE COUNTER:" )) && match == ln ) /* at start of line only */
11c606a6 (kx 2023-04-11 01:18:34 +0300  822)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  823)         char *cnt = skip_spaces( ln + strlen( "REFERENCE COUNTER:" ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  824)         ret = atoi( cnt );
11c606a6 (kx 2023-04-11 01:18:34 +0300  825)         free( cnt );
11c606a6 (kx 2023-04-11 01:18:34 +0300  826)         ++found;
11c606a6 (kx 2023-04-11 01:18:34 +0300  827)         break;
11c606a6 (kx 2023-04-11 01:18:34 +0300  828)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  829)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  830)     if( !found ) ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  831) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  832)     free( line );
11c606a6 (kx 2023-04-11 01:18:34 +0300  833) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  834)     fclose( pkglog ); pkglog = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  835)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  836)   return( ret );
11c606a6 (kx 2023-04-11 01:18:34 +0300  837) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  838) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  839) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  840) int write_references()
11c606a6 (kx 2023-04-11 01:18:34 +0300  841) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  842)   int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  843) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  844)   if( pkglog_fname != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  845)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  846)     pkglog = fopen( (const char *)pkglog_fname, "r" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  847)     if( !pkglog )
11c606a6 (kx 2023-04-11 01:18:34 +0300  848)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  849)       FATAL_ERROR( "Cannot open %s file", pkglog_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300  850)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  851)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  852) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  853)   if( destination != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  854)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  855)     char *output_fname = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  856) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  857)     output_fname = (char *)alloca( strlen( destination ) + 13 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  858)     strcpy( output_fname, destination );
11c606a6 (kx 2023-04-11 01:18:34 +0300  859)     strcat( output_fname, "/.REFERENCES" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  860)     output = fopen( (const char *)output_fname, "w" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  861)     if( !output )
11c606a6 (kx 2023-04-11 01:18:34 +0300  862)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  863)       FATAL_ERROR( "Cannot create %s file", output_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300  864)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  865)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  866) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  867)   if( (pkglog != NULL) && (output != NULL) )
11c606a6 (kx 2023-04-11 01:18:34 +0300  868)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  869)     char *ln   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  870)     char *line = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  871) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  872)     line = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300  873)     if( !line )
11c606a6 (kx 2023-04-11 01:18:34 +0300  874)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  875)       FATAL_ERROR( "Cannot allocate memory" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  876)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  877) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  878)     ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  879) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  880)     if( reference_counter && reference_counter < requires )
11c606a6 (kx 2023-04-11 01:18:34 +0300  881)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  882)       int n = 1, lines = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  883) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  884)       ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  885) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  886)       while( (ln = fgets( line, PATH_MAX, pkglog )) )
11c606a6 (kx 2023-04-11 01:18:34 +0300  887)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  888)         ln[strlen(ln) - 1] = '\0'; /* replace new-line symbol      */
11c606a6 (kx 2023-04-11 01:18:34 +0300  889)         skip_eol_spaces( ln );     /* remove spaces at end-of-line */
11c606a6 (kx 2023-04-11 01:18:34 +0300  890) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  891)         if( (n > reference_counter) && (n < requires) )
11c606a6 (kx 2023-04-11 01:18:34 +0300  892)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300  893)           fprintf( output, "%s\n", ln );
11c606a6 (kx 2023-04-11 01:18:34 +0300  894)           ++lines;
11c606a6 (kx 2023-04-11 01:18:34 +0300  895)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300  896)         ++n;
11c606a6 (kx 2023-04-11 01:18:34 +0300  897)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  898) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  899)       ret = lines; /* number of lines in the LIST */
11c606a6 (kx 2023-04-11 01:18:34 +0300  900)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  901) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  902)     free( line );
11c606a6 (kx 2023-04-11 01:18:34 +0300  903) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  904)     fclose( pkglog ); pkglog = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  905)     fclose( output ); output = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  906)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  907) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  908)   return( ret );
11c606a6 (kx 2023-04-11 01:18:34 +0300  909) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  910) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  911) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  912) int write_requires()
11c606a6 (kx 2023-04-11 01:18:34 +0300  913) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  914)   int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  915) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  916)   if( pkglog_fname != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  917)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  918)     pkglog = fopen( (const char *)pkglog_fname, "r" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  919)     if( !pkglog )
11c606a6 (kx 2023-04-11 01:18:34 +0300  920)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  921)       FATAL_ERROR( "Cannot open %s file", pkglog_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300  922)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  923)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  924) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  925)   if( destination != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  926)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  927)     char *output_fname = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  928) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  929)     output_fname = (char *)alloca( strlen( destination ) + 11 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  930)     strcpy( output_fname, destination );
11c606a6 (kx 2023-04-11 01:18:34 +0300  931)     strcat( output_fname, "/.REQUIRES" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  932)     output = fopen( (const char *)output_fname, "w" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  933)     if( !output )
11c606a6 (kx 2023-04-11 01:18:34 +0300  934)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  935)       FATAL_ERROR( "Cannot create %s file", output_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300  936)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  937)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  938) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  939)   if( (pkglog != NULL) && (output != NULL) )
11c606a6 (kx 2023-04-11 01:18:34 +0300  940)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  941)     char *ln   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  942)     char *line = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  943) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  944)     line = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300  945)     if( !line )
11c606a6 (kx 2023-04-11 01:18:34 +0300  946)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  947)       FATAL_ERROR( "Cannot allocate memory" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  948)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  949) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  950)     ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  951) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  952)     if( requires && requires < package_description )
11c606a6 (kx 2023-04-11 01:18:34 +0300  953)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  954)       int n = 1, lines = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  955) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  956)       ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  957) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  958)       while( (ln = fgets( line, PATH_MAX, pkglog )) )
11c606a6 (kx 2023-04-11 01:18:34 +0300  959)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  960)         ln[strlen(ln) - 1] = '\0'; /* replace new-line symbol      */
11c606a6 (kx 2023-04-11 01:18:34 +0300  961)         skip_eol_spaces( ln );     /* remove spaces at end-of-line */
11c606a6 (kx 2023-04-11 01:18:34 +0300  962) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  963)         if( (n > requires) && (n < package_description) )
11c606a6 (kx 2023-04-11 01:18:34 +0300  964)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300  965)           fprintf( output, "%s\n", ln );
11c606a6 (kx 2023-04-11 01:18:34 +0300  966)           ++lines;
11c606a6 (kx 2023-04-11 01:18:34 +0300  967)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300  968)         ++n;
11c606a6 (kx 2023-04-11 01:18:34 +0300  969)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  970) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  971)       ret = lines; /* number of lines in the LIST */
11c606a6 (kx 2023-04-11 01:18:34 +0300  972)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  973) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  974)     free( line );
11c606a6 (kx 2023-04-11 01:18:34 +0300  975) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  976)     fclose( pkglog ); pkglog = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  977)     fclose( output ); output = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  978)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  979) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  980)   return( ret );
11c606a6 (kx 2023-04-11 01:18:34 +0300  981) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  982) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  983) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  984) int write_package_description()
11c606a6 (kx 2023-04-11 01:18:34 +0300  985) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  986)   int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  987) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  988)   if( pkglog_fname != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  989)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  990)     pkglog = fopen( (const char *)pkglog_fname, "r" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  991)     if( !pkglog )
11c606a6 (kx 2023-04-11 01:18:34 +0300  992)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  993)       FATAL_ERROR( "Cannot open %s file", pkglog_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300  994)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  995)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  996) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  997)   if( destination != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300  998)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  999)     char *output_fname = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1000) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1001)     output_fname = (char *)alloca( strlen( destination ) + 14 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1002)     strcpy( output_fname, destination );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1003)     strcat( output_fname, "/.DESCRIPTION" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1004)     output = fopen( (const char *)output_fname, "w" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1005)     if( !output )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1006)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1007)       FATAL_ERROR( "Cannot create %s file", output_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1008)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1009)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1010) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1011)   if( (pkglog != NULL) && (output != NULL) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1012)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1013)     char *ln   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1014)     char *line = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1015) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1016)     line = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1017)     if( !line )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1018)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1019)       FATAL_ERROR( "Cannot allocate memory" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1020)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1021) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1022)     ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1023) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1024)     if( package_description && package_description < restore_links )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1025)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1026)       int n = 1, lines = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1027) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1028)       ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1029) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1030)       while( (ln = fgets( line, PATH_MAX, pkglog )) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1031)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1032)         ln[strlen(ln) - 1] = '\0'; /* replace new-line symbol      */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1033)         skip_eol_spaces( ln );     /* remove spaces at end-of-line */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1034) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1035)         if( (n > package_description) && (n < restore_links) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1036)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1037)           fprintf( output, "%s\n", ln );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1038)           ++lines;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1039)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1040)         ++n;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1041)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1042) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1043)       ret = lines; /* number of lines in the LIST */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1044)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1045) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1046)     free( line );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1047) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1048)     fclose( pkglog ); pkglog = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1049)     fclose( output ); output = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1050)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1051) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1052)   return( ret );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1053) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1054) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1055) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1056) int write_restore_links()
11c606a6 (kx 2023-04-11 01:18:34 +0300 1057) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1058)   int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1059) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1060)   if( pkglog_fname != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1061)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1062)     pkglog = fopen( (const char *)pkglog_fname, "r" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1063)     if( !pkglog )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1064)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1065)       FATAL_ERROR( "Cannot open %s file", pkglog_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1066)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1067)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1068) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1069)   if( destination != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1070)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1071)     char *output_fname = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1072) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1073)     output_fname = (char *)alloca( strlen( destination ) + 15 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1074)     strcpy( output_fname, destination );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1075)     strcat( output_fname, "/.RESTORELINKS" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1076)     output = fopen( (const char *)output_fname, "w" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1077)     if( !output )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1078)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1079)       FATAL_ERROR( "Cannot create %s file", output_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1080)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1081)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1082) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1083)   if( (pkglog != NULL) && (output != NULL) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1084)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1085)     char *ln   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1086)     char *line = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1087) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1088)     line = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1089)     if( !line )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1090)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1091)       FATAL_ERROR( "Cannot allocate memory" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1092)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1093) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1094)     ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1095) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1096)     if( restore_links && restore_links < install_script )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1097)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1098)       int n = 1, lines = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1099) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1100)       ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1101) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1102)       while( (ln = fgets( line, PATH_MAX, pkglog )) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1103)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1104)         ln[strlen(ln) - 1] = '\0'; /* replace new-line symbol      */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1105)         skip_eol_spaces( ln );     /* remove spaces at end-of-line */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1106) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1107)         if( (n > restore_links) && (n < install_script) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1108)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1109)           fprintf( output, "%s\n", ln );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1110)           ++lines;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1111)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1112)         ++n;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1113)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1114) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1115)       ret = lines; /* number of lines in the LIST */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1116)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1117) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1118)     free( line );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1119) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1120)     fclose( pkglog ); pkglog = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1121)     fclose( output ); output = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1122)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1123) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1124)   return( ret );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1125) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1126) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1127) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1128) int write_install_script()
11c606a6 (kx 2023-04-11 01:18:34 +0300 1129) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1130)   int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1131)   char *output_fname = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1132) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1133)   if( pkglog_fname != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1134)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1135)     pkglog = fopen( (const char *)pkglog_fname, "r" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1136)     if( !pkglog )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1137)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1138)       FATAL_ERROR( "Cannot open %s file", pkglog_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1139)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1140)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1141) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1142)   if( destination != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1143)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1144)     output_fname = (char *)alloca( strlen( destination ) + 10 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1145)     strcpy( output_fname, destination );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1146)     strcat( output_fname, "/.INSTALL" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1147)     output = fopen( (const char *)output_fname, "w" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1148)     if( !output )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1149)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1150)       FATAL_ERROR( "Cannot create %s file", output_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1151)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1152)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1153) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1154)   if( (pkglog != NULL) && (output != NULL) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1155)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1156)     char *ln   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1157)     char *line = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1158) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1159)     line = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1160)     if( !line )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1161)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1162)       FATAL_ERROR( "Cannot allocate memory" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1163)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1164) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1165)     ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1166) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1167)     if( install_script && install_script < file_list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1168)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1169)       int n = 1, lines = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1170) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1171)       ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1172) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1173)       while( (ln = fgets( line, PATH_MAX, pkglog )) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1174)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1175)         ln[strlen(ln) - 1] = '\0'; /* replace new-line symbol      */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1176)         skip_eol_spaces( ln );     /* remove spaces at end-of-line */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1177) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1178)         if( (n > install_script) && (n < file_list) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1179)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1180)           fprintf( output, "%s\n", ln );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1181)           ++lines;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1182)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1183)         ++n;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1184)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1185) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1186)       ret = lines; /* number of lines in the LIST */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1187)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1188) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1189)     free( line );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1190) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1191)     fclose( pkglog ); pkglog = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1192)     fclose( output ); output = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1193)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1194) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1195)   chmod( (const char *)output_fname, (mode_t)0755 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1196) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1197)   return( ret );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1198) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1199) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1200) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1201) int write_filelist()
11c606a6 (kx 2023-04-11 01:18:34 +0300 1202) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1203)   int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1204) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1205)   if( pkglog_fname != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1206)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1207)     pkglog = fopen( (const char *)pkglog_fname, "r" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1208)     if( !pkglog )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1209)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1210)       FATAL_ERROR( "Cannot open %s file", pkglog_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1211)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1212)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1213) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1214)   if( destination != NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1215)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1216)     char *output_fname = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1217) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1218)     output_fname = (char *)alloca( strlen( destination ) + 11 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1219)     strcpy( output_fname, destination );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1220)     strcat( output_fname, "/.FILELIST" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1221)     output = fopen( (const char *)output_fname, "w" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1222)     if( !output )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1223)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1224)       FATAL_ERROR( "Cannot create %s file", output_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1225)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1226)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1227) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1228)   if( (pkglog != NULL) && (output != NULL) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1229)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1230)     char *ln   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1231)     char *line = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1232) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1233)     line = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1234)     if( !line )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1235)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1236)       FATAL_ERROR( "Cannot allocate memory" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1237)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1238) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1239)     ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1240) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1241)     if( file_list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1242)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1243)       int n = 1, lines = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1244) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1245)       ++ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1246) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1247)       while( (ln = fgets( line, PATH_MAX, pkglog )) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1248)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1249)         ln[strlen(ln) - 1] = '\0'; /* replace new-line symbol      */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1250)         skip_eol_spaces( ln );     /* remove spaces at end-of-line */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1251) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1252)         if( n > file_list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1253)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1254)           fprintf( output, "%s\n", ln );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1255)           ++lines;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1256)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1257)         ++n;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1258)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1259) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1260)       ret = lines; /* number of lines in the LIST */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1261)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1262) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1263)     free( line );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1264) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1265)     fclose( pkglog ); pkglog = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1266)     fclose( output ); output = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1267)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1268) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1269)   return( ret );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1270) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1271) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1272) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1273) /*********************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1274)   Get directory where this program is placed:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1275)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1276) char *get_selfdir( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1277) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1278)   char    *buf = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1279)   ssize_t  len;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1280) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1281)   buf = (char *)malloc( PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1282)   if( !buf )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1283)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1284)     FATAL_ERROR( "Cannot allocate memory" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1285)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1286) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1287)   bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1288)   len = readlink( "/proc/self/exe", buf, (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1289)   if( len > 0 && len < PATH_MAX )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1290)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1291)     char *p = xstrdup( (const char *)dirname( buf ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1292)     free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1293)     return p;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1294)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1295)   FATAL_ERROR( "Cannot determine self directory. Please mount /proc filesystem" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1296) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1297) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1298) void set_stack_size( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1299) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1300)   const rlim_t   stack_size = 16 * 1024 * 1024; /* min stack size = 16 MB */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1301)   struct rlimit  rl;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1302)   int ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1303) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1304)   ret = getrlimit( RLIMIT_STACK, &rl );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1305)   if( ret == 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1306)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1307)     if( rl.rlim_cur < stack_size )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1308)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1309)       rl.rlim_cur = stack_size;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1310)       ret = setrlimit( RLIMIT_STACK, &rl );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1311)       if( ret != 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1312)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1313)         fprintf(stderr, "setrlimit returned result = %d\n", ret);
11c606a6 (kx 2023-04-11 01:18:34 +0300 1314)         FATAL_ERROR( "Cannot set stack size" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1315)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1316)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1317)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1318) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1319) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1320) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1321) int main( int argc, char *argv[] )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1322) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1323)   int    sections = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1324)   gid_t  gid;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1325) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1326)   set_signal_handlers();
11c606a6 (kx 2023-04-11 01:18:34 +0300 1327) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1328)   gid = getgid();
11c606a6 (kx 2023-04-11 01:18:34 +0300 1329)   setgroups( 1, &gid );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1330) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1331)   fatal_error_hook = fatal_error_actions;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1332) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1333)   selfdir = get_selfdir();
11c606a6 (kx 2023-04-11 01:18:34 +0300 1334) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1335)   errlog = stderr;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1336) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1337)   program = basename( argv[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1338)   get_args( argc, argv );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1339) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1340)   /* set_stack_size(); */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1341) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1342)   if( pkglog_type == PKGLOG_TEXT )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1343)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1344)     sections = get_pkglog_sections();
11c606a6 (kx 2023-04-11 01:18:34 +0300 1345)     if( sections < 3 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1346)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1347)       FATAL_ERROR( "%s: Wrong PKGLOG file format", basename( pkglog_fname) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1348)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1349) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1350)     refcount = get_ref_cnt();
11c606a6 (kx 2023-04-11 01:18:34 +0300 1351) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1352)     if( strstr( operation, "pkginfo" ) ) exit_status += write_pkginfo();
11c606a6 (kx 2023-04-11 01:18:34 +0300 1353) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1354)     if( strstr( operation, "references" ) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1355)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1356)       if( !reference_counter )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1357)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1358)         WARNING( "The REFERENCE COUNTER is not present in %s file", basename( pkglog_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1359)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1360)       else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1361)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1362)         if( write_references() != refcount )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1363)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1364)           WARNING( "The REFERENCE COUNTER invalid in %s file", basename( pkglog_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1365)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1366)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1367)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1368) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1369)     if( strstr( operation, "requires" ) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1370)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1371)       if( write_requires() <= 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1372)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1373)         if( ! DO_NOT_WARN_ABOUT_EMPTY_REQUIRES )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1374)           WARNING( "The REQUIRES is not present in %s file", basename( pkglog_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1375)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1376)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1377) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1378)     if( strstr( operation, "description" ) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1379)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1380)       if( write_package_description() <= 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1381)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1382)         WARNING( "The PACKAGE DESCRIPTION is not present in %s file", basename( pkglog_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1383)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1384)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1385) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1386)     if( strstr( operation, "restore-links" ) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1387)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1388)       if( write_restore_links() <= 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1389)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1390)         if( ! DO_NOT_WARN_ABOUT_EMPTY_RESTORE_LINKS )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1391)           WARNING( "The RESTORE LINKS is not present in %s file", basename( pkglog_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1392)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1393)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1394) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1395)     if( strstr( operation, "install-script" ) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1396)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1397)       if( write_install_script() <= 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1398)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1399)         ERROR( "The INSTALL SCRIPT is not present in %s file", basename( pkglog_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1400)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1401)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1402) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1403)     if( strstr( operation, "filelist" ) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1404)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1405)       if( write_filelist() <= 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1406)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1407)         ERROR( "The FILE LIST is not present in %s file", basename( pkglog_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1408)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1409)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1410) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1411)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1412)   else /* TARBALL: */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1413)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1414)     pid_t p = (pid_t) -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1415)     int   rc;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1416) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1417)     int   len = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1418)     char *cmd = NULL, *errmsg = NULL, *wmsg = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1419) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1420)     cmd = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1421)     if( !cmd )    { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1422) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1423)     errmsg = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1424)     if( !errmsg ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1425) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1426)     wmsg = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1427)     if( !wmsg )   { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1428) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1429) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1430)     if( strstr( operation, "pkginfo" ) ) /* strongly required */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1431)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1432)       bzero( (void *)cmd, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1433)       bzero( (void *)errmsg, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1434)       bzero( (void *)wmsg, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1435) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1436)       (void)sprintf( &errmsg[0], "Cannot get .PKGINFO from %s file", basename( pkglog_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1437) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1438)       len = snprintf( &cmd[0], PATH_MAX, "tar -C %s -x%sf %s %s > /dev/null 2>&1", destination, uncompress, pkglog_fname, ".PKGINFO" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1439)       if( len == 0 || len == PATH_MAX - 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1440)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1441)         FATAL_ERROR( errmsg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1442)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1443)       p = sys_exec_command( cmd );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1444)       rc = sys_wait_command( p, (char *)&wmsg[0], PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1445)       if( rc != 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1446)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1447)         /*****************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1448)           if( rc > 0 ) { return TAR exit status }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1449)           else         { return EXIT_FAILURE    }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1450)          */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1451)         if( rc > 0 ) exit_status = rc - 1; /* ERROR() will add one */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1452)         ERROR( errmsg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1453)         if( fatal_error_hook) fatal_error_hook();
11c606a6 (kx 2023-04-11 01:18:34 +0300 1454)         exit( exit_status );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1455)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1456)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1457) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1458)     /* .REFERENCES is not present in package tarball */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1459) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1460)     if( strstr( operation, "requires" ) ) /* optional; may be warning */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1461)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1462)       bzero( (void *)cmd, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1463)       bzero( (void *)errmsg, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1464)       bzero( (void *)wmsg, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1465) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1466)       (void)sprintf( &errmsg[0], "Cannot get .REQUIRES from %s file", basename( pkglog_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1467) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1468)       (void)sprintf( &cmd[0], "tar -C %s -x%sf %s %s > /dev/null 2>&1", destination, uncompress, pkglog_fname, ".REQUIRES" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1469)       p = sys_exec_command( cmd );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1470)       rc = sys_wait_command( p, (char *)&wmsg[0], PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1471)       if( rc != 0 && DO_NOT_WARN_ABOUT_EMPTY_REQUIRES == 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1472)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1473)         WARNING( errmsg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1474)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1475)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1476) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1477)     if( strstr( operation, "description" ) ) /* optional; always warning */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1478)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1479)       bzero( (void *)cmd, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1480)       bzero( (void *)wmsg, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1481) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1482)       (void)sprintf( &cmd[0], "tar -C %s -x%sf %s %s > /dev/null 2>&1", destination, uncompress, pkglog_fname, ".DESCRIPTION" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1483)       p = sys_exec_command( cmd );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1484)       rc = sys_wait_command( p, (char *)&wmsg[0], PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1485)       if( rc != 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1486)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1487)         WARNING( "Cannot get package .DESCRIPTION from %s file", basename( pkglog_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1488)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1489)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1490) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1491)     if( strstr( operation, "restore-links" ) ) /* optional; may be warning */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1492)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1493)       bzero( (void *)cmd, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1494)       bzero( (void *)errmsg, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1495)       bzero( (void *)wmsg, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1496) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1497)       (void)sprintf( &errmsg[0], "Cannot get .RESTORELINKS script from %s file", basename( pkglog_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1498) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1499)       (void)sprintf( &cmd[0], "tar -C %s -x%sf %s %s > /dev/null 2>&1", destination, uncompress, pkglog_fname, ".RESTORELINKS" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1500)       p = sys_exec_command( cmd );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1501)       rc = sys_wait_command( p, (char *)&wmsg[0], PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1502)       if( rc != 0 && DO_NOT_WARN_ABOUT_EMPTY_RESTORE_LINKS == 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1503)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1504)         WARNING( errmsg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1505)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1506)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1507) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1508)     if( strstr( operation, "install-script" ) ) /* strongly required */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1509)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1510)       bzero( (void *)cmd, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1511)       bzero( (void *)errmsg, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1512)       bzero( (void *)wmsg, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1513) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1514)       (void)sprintf( &errmsg[0], "Cannot get .INSTALL script from %s file", basename( pkglog_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1515) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1516)       len = snprintf( &cmd[0], PATH_MAX, "tar -C %s -x%sf %s %s > /dev/null 2>&1", destination, uncompress, pkglog_fname, ".INSTALL" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1517)       if( len == 0 || len == PATH_MAX - 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1518)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1519)         FATAL_ERROR( errmsg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1520)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1521)       p = sys_exec_command( cmd );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1522)       rc = sys_wait_command( p, (char *)&wmsg[0], PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1523)       if( rc != 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1524)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1525)         /*****************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1526)           if( rc > 0 ) { return TAR exit status }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1527)           else         { return EXIT_FAILURE    }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1528)          */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1529)         if( rc > 0 ) exit_status = rc - 1; /* ERROR() will add one */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1530)         ERROR( errmsg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1531)         if( fatal_error_hook) fatal_error_hook();
11c606a6 (kx 2023-04-11 01:18:34 +0300 1532)         exit( exit_status );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1533)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1534)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1535) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1536)     if( strstr( operation, "filelist" ) ) /* strongly required */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1537)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1538)       bzero( (void *)cmd, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1539)       bzero( (void *)errmsg, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1540)       bzero( (void *)wmsg, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1541) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1542)       (void)sprintf( &errmsg[0], "Cannot get .FILELIST from %s file", basename( pkglog_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1543) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1544)       len = snprintf( &cmd[0], PATH_MAX, "tar -C %s -x%sf %s %s > /dev/null 2>&1", destination, uncompress, pkglog_fname, ".FILELIST" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1545)       if( len == 0 || len == PATH_MAX - 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1546)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1547)         FATAL_ERROR( errmsg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1548)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1549)       p = sys_exec_command( cmd );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1550)       rc = sys_wait_command( p, (char *)&wmsg[0], PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1551)       if( rc != 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1552)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1553)         /*****************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1554)           if( rc > 0 ) { return TAR exit status }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1555)           else         { return EXIT_FAILURE    }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1556)          */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1557)         if( rc > 0 ) exit_status = rc - 1; /* ERROR() will add one */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1558)         ERROR( errmsg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1559)         if( fatal_error_hook) fatal_error_hook();
11c606a6 (kx 2023-04-11 01:18:34 +0300 1560)         exit( exit_status );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1561)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1562)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1563) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1564)     if( cmd )    free( cmd );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1565)     if( errmsg ) free( errmsg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1566)     if( wmsg )   free( wmsg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1567)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1568) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1569) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1570)   free_resources();
11c606a6 (kx 2023-04-11 01:18:34 +0300 1571) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1572)   exit( exit_status );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1573) }