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