cScm Configuration Daemon

cScm – is a tool to convert SCM configuration files into binary format and store its in shared memory for reading by cSvn-ui and cGit-ui CGI scripts

2 Commits   0 Branches   1 Tag
12c7b1c5 (kx 2023-03-24 02:53:04 +0300   1) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300   2) #ifdef HAVE_CONFIG_H
12c7b1c5 (kx 2023-03-24 02:53:04 +0300   3) #include <config.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300   4) #endif
12c7b1c5 (kx 2023-03-24 02:53:04 +0300   5) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300   6) #include <stdlib.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300   7) #include <stdio.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300   8) #include <sys/sysinfo.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300   9) #include <sys/types.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  10) #include <stdint.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  11) #include <dirent.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  12) #include <sys/stat.h> /* chmod(2)    */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  13) #include <sys/file.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  14) #include <sys/mman.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  15) #include <fcntl.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  16) #include <limits.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  17) #include <string.h>   /* strdup(3)   */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  18) #include <libgen.h>   /* basename(3) */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  19) #include <ctype.h>    /* tolower(3)  */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  20) #include <errno.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  21) #include <time.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  22) #include <sys/time.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  23) #include <pwd.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  24) #include <grp.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  25) #include <stdarg.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  26) #include <unistd.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  27) #include <endian.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  28) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  29) #include <error.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  30) #include <msglog.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  31) #include <xalloc.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  32) #include <symtab.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  33) #include <parse.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  34) #include <bconf.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  35) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  36) #include <defs.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  37) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  38) extern const char *SHM_BCF;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  39) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  40) FILE *bcf = NULL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  41) char *bcf_fname = NULL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  42) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  43) static void *bcf_shm_address = NULL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  44) static int   bcf_shm_fd      = -1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  45) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  46) static int  snum, rnum, dnum, global_dnum, global_rnum, indent;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  47) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  48) static unsigned char *ftab, *stab = NULL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  49) static Bcf32_Off      stabsz = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  50) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  51) static Bcf32_Off  shoff; /* section header table’s file offset in bytes */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  52) static Bcf32_Off  rhoff; /* repository header table’s file offset in bytes */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  53) static Bcf32_Off  dtoff; /* data entries table’s file offset in bytes */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  54) static Bcf32_Off  stoff; /* string table’s file offset in bytes */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  55) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  56) static Bcf32_fhdr *fhdr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  57) static Bcf32_shdr *shdr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  58) static Bcf32_rhdr *rhdr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  59) static Bcf32_dntr *dntr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  60) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  61) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  62) void bcf_shm_free( void )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  63) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  64)   if( bcf_shm_address )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  65)   {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  66)     struct stat st;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  67) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  68)     if( !fstat( bcf_shm_fd, (struct stat *)&st ) )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  69)     {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  70)       (void)munmap( bcf_shm_address, (size_t)st.st_size );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  71)       bcf_shm_address = NULL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  72)       bcf_shm_fd = shm_unlink( SHM_BCF );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  73)     }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  74)   }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  75)   bcf_shm_address = NULL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  76)   bcf_shm_fd = -1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  77) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  78) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  79) /************************************************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  80)   Функции создания BCF файла по таблице symlist:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  81)  */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  82) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  83) static Bcf32_Off extend_strtab( const char *val )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  84) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  85)   Bcf32_Off      off  = 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  86)   Bcf32_Off      len  = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  87)   unsigned char *dest = NULL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  88) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  89)   if( !stab )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  90)   {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  91)     /*************************************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  92)       The first string in strtab is equal
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  93)       to "" for empty strings.
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  94)      */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  95)     stabsz = (Bcf32_Off)(strlen( val ) + 2);
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  96)     stab = (unsigned char *)xmalloc( (size_t)stabsz );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  97)     (void)strncpy( (char *)&stab[1], val, stabsz - 1 );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  98)     return off;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300  99)   }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 100)   else
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 101)   {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 102)     off     = stabsz;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 103)     len     = (Bcf32_Off)(strlen( val ) + 1);
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 104)     stabsz += len;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 105) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 106)     stab = (unsigned char *)xrealloc( (void *)stab, (size_t)stabsz );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 107)     dest = &stab[off];
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 108)     (void)strncpy( (char *)dest, val, len );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 109)     return off;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 110)   }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 111) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 112) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 113) static void count_symbols( int *snum, int *rnum, int *dnum, int *gdts, int *grps, SYMBOL *list )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 114) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 115)   SYMBOL *head = list;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 116) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 117)   if( !head ) return;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 118) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 119)   while( head )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 120)   {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 121)     /************************************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 122)       count symbols( head ):
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 123)      */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 124)     switch( head->type )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 125)     {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 126)       case STRING:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 127)         if( indent == 0 ) *gdts += 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 128)         *dnum += 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 129)         break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 130)       case PATH:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 131)         if( indent == 0 ) *gdts += 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 132)         *dnum += 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 133)         break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 134)       case NUMERICAL:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 135)         if( indent == 0 ) *gdts += 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 136)         *dnum += 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 137)         break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 138) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 139)       case SECTION:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 140)         *snum += 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 141)         break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 142)       case REPO:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 143)         if( indent == 0 ) *grps += 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 144)         *rnum += 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 145)         break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 146) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 147)       default:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 148)         break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 149)     }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 150) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 151)     if( head->list ) { indent += 1; count_symbols( snum, rnum, dnum, gdts, grps, head->list ); }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 152)     /*
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 153)       End of count symbols( head ).
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 154)      ************************************/
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 155) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 156)     head = head->next;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 157)   }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 158) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 159) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 160) static void write_global_data( SYMBOL *list )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 161) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 162)   SYMBOL *head = list;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 163) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 164)   if( !head ) return;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 165) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 166)   while( head )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 167)   {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 168)     /************************************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 169)       global symbols( head ):
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 170)      */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 171)     switch( head->type )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 172)     {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 173)       case STRING:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 174)         dntr->d_name      = extend_strtab( (const char *)head->name );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 175)         dntr->d_type      = DT_STRING;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 176)         dntr->_v.d_valptr = extend_strtab( (const char *)head->u.string );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 177)         dtoff += (Bcf32_Off)sizeof( Bcf32_dntr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 178)         ++dntr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 179)         break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 180)       case PATH:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 181)         dntr->d_name      = extend_strtab( (const char *)head->name );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 182)         dntr->d_type      = DT_PATH;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 183)         dntr->_v.d_valptr = extend_strtab( (const char *)head->u.path );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 184)         dtoff += (Bcf32_Off)sizeof( Bcf32_dntr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 185)         ++dntr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 186)         break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 187)       case NUMERICAL:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 188)         dntr->d_name      = extend_strtab( (const char *)head->name );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 189)         dntr->d_type      = DT_NUMERICAL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 190)         dntr->_v.d_value  = head->u.value;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 191)         dtoff += (Bcf32_Off)sizeof( Bcf32_dntr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 192)         ++dntr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 193)         break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 194) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 195)       default:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 196)         break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 197)     }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 198)     /*
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 199)       End of global symbols( head ).
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 200)      ************************************/
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 201) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 202)     head = head->next;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 203)   }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 204) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 205) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 206) static Bcf32_Half write_repo_data( SYMBOL *list )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 207) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 208)   Bcf32_Half  cntr = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 209)   SYMBOL     *head = list;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 210) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 211)   if( !head ) return cntr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 212) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 213)   while( head )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 214)   {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 215)     /************************************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 216)       symbols( head ):
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 217)      */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 218)     switch( head->type )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 219)     {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 220)       case STRING:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 221)         dntr->d_name      = extend_strtab( (const char *)head->name );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 222)         dntr->d_type      = DT_STRING;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 223)         dntr->_v.d_valptr = extend_strtab( (const char *)head->u.string );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 224)         dtoff += (Bcf32_Off)sizeof( Bcf32_dntr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 225)         ++dntr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 226)         ++cntr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 227)         break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 228)       case PATH:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 229)         dntr->d_name      = extend_strtab( (const char *)head->name );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 230)         dntr->d_type      = DT_PATH;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 231)         dntr->_v.d_valptr = extend_strtab( (const char *)head->u.path );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 232)         dtoff += (Bcf32_Off)sizeof( Bcf32_dntr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 233)         ++dntr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 234)         ++cntr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 235)         break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 236)       case NUMERICAL:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 237)         dntr->d_name      = extend_strtab( (const char *)head->name );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 238)         dntr->d_type      = DT_NUMERICAL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 239)         dntr->_v.d_value  = head->u.value;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 240)         dtoff += (Bcf32_Off)sizeof( Bcf32_dntr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 241)         ++dntr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 242)         ++cntr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 243)         break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 244) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 245)       default:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 246)         break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 247)     }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 248)     /*
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 249)       End of symbols( head ).
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 250)      ************************************/
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 251) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 252)     head = head->next;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 253)   }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 254) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 255)   return cntr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 256) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 257) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 258) static void write_global_repos( SYMBOL *list )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 259) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 260)   SYMBOL *head = list;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 261) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 262)   if( !head ) return;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 263) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 264)   while( head )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 265)   {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 266)     /************************************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 267)       global symbols( head ):
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 268)      */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 269)     if( head->type == REPO )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 270)     {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 271)       rhdr->r_rhdr  = extend_strtab( (const char *)head->u.path );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 272)       rhdr->r_rdata = dtoff;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 273)       rhdr->r_dnum  = write_repo_data( head->list );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 274) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 275)       rhoff += (Bcf32_Off)sizeof( Bcf32_rhdr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 276)       ++rhdr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 277)     }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 278)     /*
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 279)       End of global symbols( head ).
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 280)      ************************************/
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 281) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 282)     head = head->next;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 283)   }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 284) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 285) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 286) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 287) static Bcf32_Half write_repos( SYMBOL *list )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 288) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 289)   Bcf32_Half  cntr = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 290)   SYMBOL     *head = list;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 291) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 292)   if( !head ) return cntr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 293) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 294)   while( head )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 295)   {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 296)     /************************************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 297)       symbols( head ):
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 298)      */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 299)     if( head->type == REPO )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 300)     {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 301)       rhdr->r_rhdr  = extend_strtab( (const char *)head->u.path );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 302)       rhdr->r_rdata = dtoff;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 303)       rhdr->r_dnum  = write_repo_data( head->list );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 304) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 305)       rhoff += (Bcf32_Off)sizeof( Bcf32_rhdr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 306)       ++rhdr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 307)       ++cntr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 308)     }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 309)     /*
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 310)       End of symbols( head ).
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 311)      ************************************/
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 312) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 313)     head = head->next;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 314)   }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 315) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 316)   return cntr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 317) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 318) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 319) static void write_sections( SYMBOL *list )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 320) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 321)   SYMBOL *head = list;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 322) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 323)   if( !head ) return;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 324) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 325)   while( head )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 326)   {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 327)     /************************************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 328)       global symbols( head ):
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 329)      */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 330)     if( head->type == SECTION )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 331)     {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 332)       (void)strncpy( (char *)shdr->s_name, SMAG_REPOS, (size_t)SI_NIDENT );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 333)       shdr->s_type  = ST_REPOS;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 334)       shdr->s_shdr  = extend_strtab( (const char *)head->u.string );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 335)       shdr->s_sdata = rhoff;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 336)       shdr->s_dnum  = write_repos( head->list );;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 337) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 338)       shoff += (Bcf32_Off)sizeof( Bcf32_shdr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 339)       ++shdr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 340)     }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 341)     /*
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 342)       End of global symbols( head ).
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 343)      ************************************/
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 344) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 345)     head = head->next;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 346)   }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 347) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 348) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 349) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 350) int write_binary_config( void )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 351) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 352)   int ret = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 353) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 354)   ftab = NULL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 355)   stab = NULL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 356) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 357)   snum = 0, rnum = 0, dnum = 0, global_dnum = 0, global_rnum = 0, indent = 0, stabsz = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 358)   fhdr = NULL, shdr = NULL, rhdr = NULL, dntr = NULL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 359)   shoff = 0, rhoff = 0, dtoff = 0, stoff = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 360) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 361)   count_symbols( &snum, &rnum, &dnum, &global_dnum, &global_rnum, symlist );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 362) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 363)   if( global_dnum ) snum += 1; /* add .global section for global variables   */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 364)   if( global_rnum ) snum += 1; /* add noname .repos section for global repositories */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 365) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 366)   shoff = (Bcf32_Off)sizeof( Bcf32_fhdr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 367)   rhoff = (Bcf32_Off)(shoff + snum * sizeof( Bcf32_shdr ));
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 368)   dtoff = (Bcf32_Off)(rhoff + rnum * sizeof( Bcf32_rhdr ));
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 369)   stoff = (Bcf32_Off)(dtoff + dnum * sizeof( Bcf32_dntr ));
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 370) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 371)   ftab = (unsigned char *)xmalloc( (size_t)stoff );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 372) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 373)   /******************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 374)     Fill File Header
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 375)    */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 376)   fhdr = (Bcf32_fhdr *)ftab;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 377) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 378)   (void)strncpy( (char *)fhdr->b_ident, BCFMAG, (size_t)SZBCFMAG );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 379)   fhdr->b_ident[BI_CLASS]   = BCF_CLASS_32;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 380) #if __BYTE_ORDER == __LITTLE_ENDIAN
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 381)   fhdr->b_ident[BI_DATA]    = BCF_DATA_LSB;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 382) #else
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 383)   fhdr->b_ident[BI_DATA]    = BCF_DATA_MSB;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 384) #endif
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 385)   fhdr->b_ident[BI_VERSION] = BV_CURRENT;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 386)   fhdr->b_ident[BI_PAD]     = BCF_PAD;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 387) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 388)   fhdr->b_hsize     = (Bcf32_Half)sizeof( Bcf32_fhdr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 389)   fhdr->b_shoff     = (Bcf32_Off)shoff;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 390)   fhdr->b_shentsize = (Bcf32_Half)sizeof( Bcf32_shdr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 391)   fhdr->b_shnum     = (Bcf32_Half)snum;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 392)   fhdr->b_rhoff     = (Bcf32_Off)rhoff;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 393)   fhdr->b_rhentsize = (Bcf32_Half)sizeof( Bcf32_rhdr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 394)   fhdr->b_rhnum     = (Bcf32_Half)rnum;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 395)   fhdr->b_dtoff     = (Bcf32_Off)dtoff;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 396)   fhdr->b_dtentsize = (Bcf32_Half)sizeof( Bcf32_dntr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 397)   fhdr->b_dtnum     = (Bcf32_Half)dnum;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 398)   fhdr->b_stoff     = (Bcf32_Off)stoff;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 399) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 400)   shdr = (Bcf32_shdr *)&ftab[shoff];
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 401)   rhdr = (Bcf32_rhdr *)&ftab[rhoff];
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 402)   dntr = (Bcf32_dntr *)&ftab[dtoff];
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 403) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 404)   if( global_dnum )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 405)   {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 406)     (void)strncpy( (char *)shdr->s_name, SMAG_GLOBAL, (size_t)SI_NIDENT );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 407)     shdr->s_type  = ST_GLOBAL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 408)     shdr->s_shdr  = 0; /* Global section is always a first noname .global section */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 409)     shdr->s_sdata = fhdr->b_dtoff;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 410)     shdr->s_dnum  = (Bcf32_Half)global_dnum;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 411) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 412)     write_global_data( symlist );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 413) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 414)     shoff += (Bcf32_Off)sizeof( Bcf32_shdr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 415)     ++shdr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 416)   }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 417) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 418)   if( global_rnum )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 419)   {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 420)     (void)strncpy( (char *)shdr->s_name, SMAG_REPOS, (size_t)SI_NIDENT );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 421)     shdr->s_type  = ST_REPOS;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 422)     shdr->s_shdr  = 0; /* Global repos plased in the second noname .repos section */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 423)     shdr->s_sdata = fhdr->b_rhoff;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 424)     shdr->s_dnum  = (Bcf32_Half)global_rnum;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 425) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 426)     write_global_repos( symlist );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 427) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 428)     shoff += (Bcf32_Off)sizeof( Bcf32_shdr );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 429)     ++shdr;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 430)   }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 431) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 432)   write_sections( symlist );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 433) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 434)   /**********************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 435)     Whole BCF file size:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 436)    */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 437)   fhdr->b_fsize = (Bcf32_Word)( stoff + stabsz );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 438) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 439)   bcf_shm_free();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 440) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 441)   bcf_shm_fd = shm_open( SHM_BCF, O_CREAT | O_TRUNC | O_RDWR, 0644 );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 442)   if( bcf_shm_fd != -1 )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 443)   {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 444)     (void)ftruncate( bcf_shm_fd, (size_t)fhdr->b_fsize );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 445)     bcf_shm_address = mmap( NULL, (size_t)fhdr->b_fsize, PROT_WRITE, MAP_SHARED, bcf_shm_fd, 0 );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 446)     if( bcf_shm_address != MAP_FAILED )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 447)     {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 448)       memcpy( bcf_shm_address, (const void *)ftab, (size_t)stoff );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 449)       memcpy( bcf_shm_address + (size_t)stoff, (const void *)stab, (size_t)stabsz );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 450)     }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 451)   }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 452) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 453)   if( bcf_fname )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 454)   {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 455)     bcf = fopen( (const char *)bcf_fname, "w" );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 456)     if( !bcf ) { FATAL_ERROR( "Cannot open BCF file: %s", bcf_fname ); }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 457)   }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 458) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 459)   (void)fwrite( (void *)ftab, (size_t)stoff,  1, bcf );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 460)   (void)fwrite( (void *)stab, (size_t)stabsz, 1, bcf );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 461) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 462)   if( bcf_fname )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 463)   {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 464)     if( bcf ) { fclose( bcf ); bcf = NULL; } /* Do not free bcf_fname[] */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 465)   }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 466) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 467)   if( ftab ) { free( ftab ); ftab = NULL; }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 468)   if( stab ) { free( stab ); stab = NULL; }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 469) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 470)   shoff = 0, rhoff = 0, dtoff = 0, stoff = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 471)   fhdr = NULL, shdr = NULL, rhdr = NULL, dntr = NULL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 472)   snum = 0, rnum = 0, dnum = 0, global_dnum = 0, global_rnum = 0, indent = 0, stabsz = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 473) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 474)   ret = 1; /* success */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 475) 
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 476)   return ret;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 477) }