Rev 3 | Rev 5 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3 | Rev 4 | ||
---|---|---|---|
Line 35... | Line 35... | ||
35 | 35 | ||
36 | #ifdef _MSC_VER |
36 | #ifdef _MSC_VER |
37 | #pragma pack(push) |
37 | #pragma pack(push) |
38 | #pragma pack(1) |
38 | #pragma pack(1) |
39 | #endif // _MSC_VER |
39 | #endif // _MSC_VER |
- | 40 | ||
- | 41 | ||
- | 42 | // handy macros that generate a version number in the format "YYYYMMDD" corresponding to the build date. Usage: printf ("version " VERSION_FMT_YYYYMMDD "\n", VERSION_ARG_YYYYMMDD); |
|
- | 43 | #define BUILDDATE_YEAR (&__DATE__[7]) // compiler will optimize this into a const string, e.g. "2021" |
|
- | 44 | #define BUILDDATE_MONTH (*((uint32_t *) ((void *) __DATE__)) == *((uint32_t *) ((void *) "Jan ")) ? "01" : \ |
|
- | 45 | (*((uint32_t *) ((void *) __DATE__)) == *((uint32_t *) ((void *) "Feb ")) ? "02" : \ |
|
- | 46 | (*((uint32_t *) ((void *) __DATE__)) == *((uint32_t *) ((void *) "Mar ")) ? "03" : \ |
|
- | 47 | (*((uint32_t *) ((void *) __DATE__)) == *((uint32_t *) ((void *) "Apr ")) ? "04" : \ |
|
- | 48 | (*((uint32_t *) ((void *) __DATE__)) == *((uint32_t *) ((void *) "May ")) ? "05" : \ |
|
- | 49 | (*((uint32_t *) ((void *) __DATE__)) == *((uint32_t *) ((void *) "Jun ")) ? "06" : \ |
|
- | 50 | (*((uint32_t *) ((void *) __DATE__)) == *((uint32_t *) ((void *) "Jul ")) ? "07" : \ |
|
- | 51 | (*((uint32_t *) ((void *) __DATE__)) == *((uint32_t *) ((void *) "Aug ")) ? "08" : \ |
|
- | 52 | (*((uint32_t *) ((void *) __DATE__)) == *((uint32_t *) ((void *) "Sep ")) ? "09" : \ |
|
- | 53 | (*((uint32_t *) ((void *) __DATE__)) == *((uint32_t *) ((void *) "Oct ")) ? "10" : \ |
|
- | 54 | (*((uint32_t *) ((void *) __DATE__)) == *((uint32_t *) ((void *) "Nov ")) ? "11" : \ |
|
- | 55 | (*((uint32_t *) ((void *) __DATE__)) == *((uint32_t *) ((void *) "Dec ")) ? "12" : "XX")))))))))))) // compiler will optimize this into a const string, e.g. "11" |
|
- | 56 | #define BUILDDATE_DAY (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) " 1")) ? "01" : \ |
|
- | 57 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) " 2")) ? "02" : \ |
|
- | 58 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) " 3")) ? "03" : \ |
|
- | 59 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) " 4")) ? "04" : \ |
|
- | 60 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) " 5")) ? "05" : \ |
|
- | 61 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) " 6")) ? "06" : \ |
|
- | 62 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) " 7")) ? "07" : \ |
|
- | 63 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) " 8")) ? "08" : \ |
|
- | 64 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) " 9")) ? "09" : \ |
|
- | 65 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "10")) ? "10" : \ |
|
- | 66 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "11")) ? "11" : \ |
|
- | 67 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "12")) ? "12" : \ |
|
- | 68 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "13")) ? "13" : \ |
|
- | 69 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "14")) ? "14" : \ |
|
- | 70 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "15")) ? "15" : \ |
|
- | 71 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "16")) ? "16" : \ |
|
- | 72 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "17")) ? "17" : \ |
|
- | 73 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "18")) ? "18" : \ |
|
- | 74 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "19")) ? "19" : \ |
|
- | 75 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "20")) ? "20" : \ |
|
- | 76 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "21")) ? "21" : \ |
|
- | 77 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "22")) ? "22" : \ |
|
- | 78 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "23")) ? "23" : \ |
|
- | 79 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "24")) ? "24" : \ |
|
- | 80 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "25")) ? "25" : \ |
|
- | 81 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "26")) ? "26" : \ |
|
- | 82 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "27")) ? "27" : \ |
|
- | 83 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "28")) ? "28" : \ |
|
- | 84 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "29")) ? "29" : \ |
|
- | 85 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "30")) ? "30" : \ |
|
- | 86 | (*((uint16_t *) ((void *) &__DATE__[4])) == *((uint16_t *) ((void *) "31")) ? "31" : "XX"))))))))))))))))))))))))))))))) // compiler will optimize this into a const string, e.g. "14" |
|
- | 87 | #define VERSION_FMT_YYYYMMDD "%04s%02s%02s" |
|
- | 88 | #define VERSION_ARG_YYYYMMDD BUILDDATE_YEAR, BUILDDATE_MONTH, BUILDDATE_DAY |
|
40 | 89 | ||
41 | 90 | ||
42 | #define ROUND_TO_UPPER_MULTIPLE(val,multiple) ((((val) + (size_t) (multiple) - 1) / (multiple)) * (multiple)) // note that val is being evaluated once, so it can be the result of a function call |
91 | #define ROUND_TO_UPPER_MULTIPLE(val,multiple) ((((val) + (size_t) (multiple) - 1) / (multiple)) * (multiple)) // note that val is being evaluated once, so it can be the result of a function call |
43 | #ifdef _WIN32 |
92 | #ifdef _WIN32 |
44 | #define IS_DIRSEP(c) (((c) == '/') || ((c) == '\\')) |
93 | #define IS_DIRSEP(c) (((c) == '/') || ((c) == '\\')) |
Line 1192... | Line 1241... | ||
1192 | } |
1241 | } |
1193 | 1242 | ||
1194 | // do we not have enough information to run ? |
1243 | // do we not have enough information to run ? |
1195 | if (want_help || (buildfile_pathname == NULL) || (!want_info && (ifs_pathname == NULL))) |
1244 | if (want_help || (buildfile_pathname == NULL) || (!want_info && (ifs_pathname == NULL))) |
1196 | { |
1245 | { |
1197 | if (want_help) |
- | |
1198 |
|
1246 | fprintf ((want_help ? stdout : stderr), "ifstool - QNX in-kernel filesystem creation utility by Pierre-Marie Baty <pm@pmbaty.com>\n"); |
- | 1247 | fprintf ((want_help ? stdout : stderr), " version " VERSION_FMT_YYYYMMDD "\n", VERSION_ARG_YYYYMMDD); |
|
1199 | |
1248 | if (!want_help) |
1200 | fprintf (stderr, "error: missing parameters\n"); |
1249 | fprintf (stderr, "error: missing parameters\n"); |
1201 | fprintf ((want_help ? stdout : stderr), "usage:\n"); |
1250 | fprintf ((want_help ? stdout : stderr), "usage:\n"); |
1202 | fprintf ((want_help ? stdout : stderr), " ifstool [--bootfile <pathname>] [--startupfile <pathname>@<EP_from_imgbase>] [--kernelfile <pathname>@<fileoffs>] <buildfile> <outfile>\n"); |
1251 | fprintf ((want_help ? stdout : stderr), " ifstool [--bootfile <pathname>] [--startupfile <pathname>@<EP_from_imgbase>] [--kernelfile <pathname>@<fileoffs>] <buildfile> <outfile>\n"); |
1203 | fprintf ((want_help ? stdout : stderr), " ifstool --info <ifs file>\n"); |
1252 | fprintf ((want_help ? stdout : stderr), " ifstool --info <ifs file>\n"); |
1204 | fprintf ((want_help ? stdout : stderr), " ifstool --help\n"); |
1253 | fprintf ((want_help ? stdout : stderr), " ifstool --help\n"); |
Line 1764... | Line 1813... | ||
1764 | } |
1813 | } |
1765 | fseek (fp, 0, SEEK_SET); |
1814 | fseek (fp, 0, SEEK_SET); |
1766 | fread (filedata, 1, filesize, fp); |
1815 | fread (filedata, 1, filesize, fp); |
1767 | fclose (fp); |
1816 | fclose (fp); |
1768 | 1817 | ||
- | 1818 | printf ("QNX In-kernel Filesystem analysis produced by ifstool version " VERSION_FMT_YYYYMMDD "\n", VERSION_ARG_YYYYMMDD); |
|
1769 | printf ("IFS file \"%s\" - size 0x%zx (%zd) bytes\n", ifs_pathname, filesize, filesize); |
1819 | printf ("IFS file \"%s\" - size 0x%zx (%zd) bytes\n", ifs_pathname, filesize, filesize); |
1770 | 1820 | ||
1771 | // parse file from start to end |
1821 | // parse file from start to end |
1772 | current_offset = 0; |
1822 | current_offset = 0; |
1773 | for (;;) |
1823 | for (;;) |