Changeset 275


Ignore:
Timestamp:
2005-02-20T05:05:27+01:00 (13 years ago)
Author:
mbm
Message:

add -a and -b options needed for jffs2 root

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/openwrt/package/openwrt/trx.c

    r231 r275  
    3232 * 
    3333 * TODO: Support '-b' option to specify offsets for each file. 
     34 * 
     35 * February 19, 2005 - mbm 
     36 * 
     37 * Add -a (align offset) and -b (absolute offset) 
    3438 */ 
    3539 
     
    7680void usage(void) 
    7781{ 
    78         fprintf(stderr, "Usage: trx [-o outfile] [-m maxlen] file [file [file]]\n"); 
     82        fprintf(stderr, "Usage: trx [-o outfile] [-m maxlen] [-a align] [-b offset] file [file [file]]\n"); 
    7983        exit(EXIT_FAILURE); 
    8084} 
     
    9397        struct trx_header *p; 
    9498 
    95         fprintf(stderr, "mjn3's trx replacement - v0.81\n"); 
    96  
    97         while ((c = getopt(argc, argv, "o:m:")) != -1) { 
     99        fprintf(stderr, "mjn3's trx replacement - v0.81.1\n"); 
     100 
     101        if (!(buf = malloc(maxlen))) { 
     102                fprintf(stderr, "malloc failed\n"); 
     103                return EXIT_FAILURE; 
     104        } 
     105 
     106        p = (struct trx_header *) buf; 
     107 
     108        p->magic = STORE32_LE(TRX_MAGIC); 
     109        cur_len = sizeof(struct trx_header); 
     110        p->flag_version = STORE32_LE((TRX_VERSION << 16)); 
     111 
     112        in = NULL; 
     113        i = 0; 
     114 
     115        while ((c = getopt(argc, argv, "-:o:m:a:b:")) != -1) { 
    98116                switch (c) { 
     117                        case 1: 
     118                                p->offsets[i++] = STORE32_LE(cur_len); 
     119 
     120                                if (!(in = fopen(optarg, "r"))) { 
     121                                        fprintf(stderr, "can not open \"%s\" for reading\n", optarg); 
     122                                        usage(); 
     123                                } 
     124                                n = fread(buf + cur_len, 1, maxlen - cur_len, in); 
     125                                if (!feof(in)) { 
     126                                        fprintf(stderr, "fread failure or file \"%s\" too large\n",optarg); 
     127                                        fclose(in); 
     128                                        return EXIT_FAILURE; 
     129                                } 
     130                                fclose(in); 
     131#undef  ROUND 
     132#define ROUND 4 
     133                                if (n & (ROUND-1)) { 
     134                                        memset(buf + cur_len + n, 0, ROUND - (n & (ROUND-1))); 
     135                                        n += ROUND - (n & (ROUND-1)); 
     136                                } 
     137                                cur_len += n; 
     138 
     139                                break; 
    99140                        case 'o': 
    100141                                ofn = optarg; 
     142                                if (ofn && !(out = fopen(ofn, "w"))) { 
     143                                        fprintf(stderr, "can not open \"%s\" for writing\n", ofn); 
     144                                        usage(); 
     145                                } 
     146 
    101147                                break; 
    102148                        case 'm': 
     
    116162                                        usage(); 
    117163                                } 
     164                                if (maxlen > TRX_MAX_LEN) { 
     165                                        fprintf(stderr, "WARNING: maxlen exceeds default maximum!  Beware of overwriting nvram!\n"); 
     166                                } 
     167                                if (!(buf = realloc(buf,maxlen))) { 
     168                                        fprintf(stderr, "realloc failed"); 
     169                                        return EXIT_FAILURE; 
     170                                } 
    118171                                break; 
     172                        case 'a': 
     173                                n = atoi(optarg); 
     174                                if (cur_len & (n-1)) { 
     175                                        n = n - (cur_len & (n-1)); 
     176                                        memset(buf + cur_len, 0, n); 
     177                                        cur_len += n; 
     178                                } 
     179                                break; 
     180                        case 'b': 
     181                                n = atoi(optarg); 
     182                                if (n < cur_len) { 
     183                                        fprintf(stderr, "WARNING: current length exceeds -b %d offset",n); 
     184                                } else { 
     185                                        memset(buf + cur_len, 0, n - cur_len); 
     186                                        cur_len = n; 
     187                                } 
    119188                        default: 
    120189                                usage(); 
     
    122191        } 
    123192 
    124         if (ofn && !(out = fopen(ofn, "w"))) { 
    125                 fprintf(stderr, "can not open \"%s\" for writing\n", ofn); 
     193        if (!in) { 
     194                fprintf(stderr, "we require atleast one filename\n"); 
    126195                usage(); 
    127         } 
    128  
    129         if (optind == argc) { 
    130                 fprintf(stderr, "we require at least one arg\n"); 
    131                 usage(); 
    132         } 
    133  
    134         if (argc - optind > 3) { 
    135                 fprintf(stderr, "too many args: %d > 3\n", argc - optind); 
    136                 usage(); 
    137         } 
    138  
    139         if (maxlen > TRX_MAX_LEN) { 
    140                 fprintf(stderr, "WARNING: maxlen exceeds default maximum!  Beware of overwriting nvram!\n"); 
    141         } 
    142  
    143         if (!(buf = malloc(maxlen))) { 
    144                 fprintf(stderr, "malloc failed\n"); 
    145                 return EXIT_FAILURE; 
    146         } 
    147  
    148         p = (struct trx_header *) buf; 
    149  
    150         p->magic = STORE32_LE(TRX_MAGIC); 
    151         cur_len = sizeof(struct trx_header); 
    152         p->flag_version = STORE32_LE((TRX_VERSION << 16)); 
    153  
    154         i = 0; 
    155  
    156         while (optind < argc) { 
    157                 p->offsets[i++] = STORE32_LE(cur_len); 
    158  
    159                 if (!(in = fopen(argv[optind], "r"))) { 
    160                         fprintf(stderr, "can not open \"%s\" for reading\n", argv[optind]); 
    161                         usage(); 
    162                 } 
    163  
    164                 n = fread(buf + cur_len, 1, maxlen - cur_len, in); 
    165                 if (!feof(in)) { 
    166                         fprintf(stderr, "fread failure or file \"%s\" too large\n", 
    167                                         argv[optind]); 
    168                         fclose(in); 
    169                         return EXIT_FAILURE; 
    170                 } 
    171  
    172                 fclose(in); 
    173  
    174                 ++optind; 
    175  
    176                 if (optind < argc) { 
    177 #undef  ROUND 
    178 #define ROUND 4 
    179                         if (n & (ROUND-1)) { 
    180                                 memset(buf + cur_len + n, 0, ROUND - (n & (ROUND-1))); 
    181                                 n += ROUND - (n & (ROUND-1)); 
    182                         } 
    183                 } 
    184  
    185                 cur_len += n; 
    186196        } 
    187197 
Note: See TracChangeset for help on using the changeset viewer.