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) }