wok annotate genromfs/stuff/genromfs.u @ rev 17300
Update weechat to 1.0.1 (needs further testing, if unstable somehow then
downgrade to at most 0.4.3).
downgrade to at most 0.4.3).
author | necrophcodr <tcg.thegamer@gmail.com> |
---|---|
date | Thu Oct 30 23:27:48 2014 +0100 (2014-10-30) |
parents | |
children |
rev | line source |
---|---|
pascal@17253 | 1 --- genromfs.c |
pascal@17253 | 2 +++ genromfs.c |
pascal@17253 | 3 @@ -164,6 +164,7 @@ |
pascal@17253 | 4 uid_t nuid; |
pascal@17253 | 5 gid_t ngid; |
pascal@17253 | 6 time_t ntime; |
pascal@17253 | 7 + nlink_t nlink; |
pascal@17253 | 8 unsigned int offset; |
pascal@17253 | 9 unsigned int realsize; |
pascal@17253 | 10 unsigned int prepad; |
pascal@17253 | 11 @@ -178,6 +179,8 @@ |
pascal@17253 | 12 int extlen; |
pascal@17253 | 13 }; |
pascal@17253 | 14 |
pascal@17253 | 15 +static int oldromfs = 1; |
pascal@17253 | 16 + |
pascal@17253 | 17 #define EXTTYPE_UNKNOWN 0 |
pascal@17253 | 18 #define EXTTYPE_ALIGNMENT 1 |
pascal@17253 | 19 #define EXTTYPE_EXCLUDE 2 |
pascal@17253 | 20 @@ -361,7 +364,9 @@ |
pascal@17253 | 21 } |
pascal@17253 | 22 len+=16; |
pascal@17253 | 23 ri=(struct romfh *)bigbuf; |
pascal@17253 | 24 - if (n->offset) |
pascal@17253 | 25 + if (!oldromfs) |
pascal@17253 | 26 + ri->checksum = ntohl(n->ntime); |
pascal@17253 | 27 + else if (n->offset) |
pascal@17253 | 28 fixsum(ri, len); |
pascal@17253 | 29 dumpdata(bigbuf, len, f); |
pascal@17253 | 30 #if 0 |
pascal@17253 | 31 @@ -373,6 +378,9 @@ |
pascal@17253 | 32 #endif |
pascal@17253 | 33 } |
pascal@17253 | 34 |
pascal@17253 | 35 +#define SIGNED_OVERFLOW(x,m) (((x) & (m)) != 0 && (((x) & (m)) | ~(m)) != ~0) |
pascal@17253 | 36 +#define SIGNED_EXTENTION(x,m) (((x) & (((m)+1)>>1)) ? (x) | ~(m) : (x) & (m)) |
pascal@17253 | 37 + |
pascal@17253 | 38 void dumpnode(struct filenode *node, FILE *f) |
pascal@17253 | 39 { |
pascal@17253 | 40 struct romfh ri; |
pascal@17253 | 41 @@ -386,13 +394,33 @@ |
pascal@17253 | 42 |
pascal@17253 | 43 ri.nextfh = 0; |
pascal@17253 | 44 ri.spec = 0; |
pascal@17253 | 45 + if (!oldromfs) { |
pascal@17253 | 46 + ri.spec = node->modes & (0x0FFF ^ S_IXUSR); |
pascal@17253 | 47 + ri.spec ^= S_IRUSR |S_IWUSR; |
pascal@17253 | 48 + ri.spec |= node->nuid << 20; |
pascal@17253 | 49 + ri.spec |= (node->ngid & 0xFF) << 12; |
pascal@17253 | 50 + if (node->ngid & 0x100) |
pascal@17253 | 51 + ri.spec |= S_IXUSR; |
pascal@17253 | 52 + if (SIGNED_OVERFLOW(node->nuid,0xF000)) { |
pascal@17253 | 53 + printf("%-50s : uid=%04X -> %04X \n", |
pascal@17253 | 54 + node->realname, node->nuid, |
pascal@17253 | 55 + (uid_t) SIGNED_EXTENTION(node->nuid,0x0FFF)); |
pascal@17253 | 56 + } |
pascal@17253 | 57 + if (SIGNED_OVERFLOW(node->ngid,0xFE00)) { |
pascal@17253 | 58 + printf("%-50s : gid=%04X -> %04X \n", |
pascal@17253 | 59 + node->realname, node->ngid, |
pascal@17253 | 60 + (gid_t) SIGNED_EXTENTION(node->ngid,0x01FF)); |
pascal@17253 | 61 + } |
pascal@17253 | 62 + } |
pascal@17253 | 63 + ri.spec = htonl(ri.spec); |
pascal@17253 | 64 ri.size = htonl(node->realsize); |
pascal@17253 | 65 ri.checksum = htonl(0x55555555); |
pascal@17253 | 66 |
pascal@17253 | 67 if (node->next && node->next->next) |
pascal@17253 | 68 ri.nextfh = htonl(node->next->offset); |
pascal@17253 | 69 if ((node->modes & 0111) && |
pascal@17253 | 70 - (S_ISDIR(node->modes) || S_ISREG(node->modes))) |
pascal@17253 | 71 + (S_ISDIR(node->modes) || S_ISREG(node->modes) || |
pascal@17253 | 72 + (!oldromfs && (S_ISCHR(node->modes) || S_ISBLK(node->modes))))) |
pascal@17253 | 73 ri.nextfh |= htonl(ROMFH_EXEC); |
pascal@17253 | 74 |
pascal@17253 | 75 if (node->orig_link) { |
pascal@17253 | 76 @@ -403,11 +431,17 @@ |
pascal@17253 | 77 dumpri(&ri, node, f); |
pascal@17253 | 78 } else if (S_ISDIR(node->modes)) { |
pascal@17253 | 79 ri.nextfh |= htonl(ROMFH_DIR); |
pascal@17253 | 80 + if (!oldromfs) |
pascal@17253 | 81 + ri.size = ri.spec; |
pascal@17253 | 82 if (listisempty(&node->dirlist)) { |
pascal@17253 | 83 ri.spec = htonl(node->offset); |
pascal@17253 | 84 } else { |
pascal@17253 | 85 ri.spec = htonl(node->dirlist.head->offset); |
pascal@17253 | 86 } |
pascal@17253 | 87 + if (node->nlink > 0xf) |
pascal@17253 | 88 + node->nlink = 0xf; |
pascal@17253 | 89 + if (!oldromfs) |
pascal@17253 | 90 + ri.spec |= htonl(node->nlink); |
pascal@17253 | 91 dumpri(&ri, node, f); |
pascal@17253 | 92 } else if (S_ISLNK(node->modes)) { |
pascal@17253 | 93 ri.nextfh |= htonl(ROMFH_LNK); |
pascal@17253 | 94 @@ -464,10 +498,14 @@ |
pascal@17253 | 95 } |
pascal@17253 | 96 } else if (S_ISCHR(node->modes)) { |
pascal@17253 | 97 ri.nextfh |= htonl(ROMFH_CHR); |
pascal@17253 | 98 + if (!oldromfs) |
pascal@17253 | 99 + ri.size = ri.spec; |
pascal@17253 | 100 ri.spec = htonl(major(node->devnode)<<16|minor(node->devnode)); |
pascal@17253 | 101 dumpri(&ri, node, f); |
pascal@17253 | 102 } else if (S_ISBLK(node->modes)) { |
pascal@17253 | 103 ri.nextfh |= htonl(ROMFH_BLK); |
pascal@17253 | 104 + if (!oldromfs) |
pascal@17253 | 105 + ri.size = ri.spec; |
pascal@17253 | 106 ri.spec = htonl(major(node->devnode)<<16|minor(node->devnode)); |
pascal@17253 | 107 dumpri(&ri, node, f); |
pascal@17253 | 108 } else if (S_ISFIFO(node->modes)) { |
pascal@17253 | 109 @@ -522,6 +560,7 @@ |
pascal@17253 | 110 n->nuid = sb->st_uid; |
pascal@17253 | 111 n->ngid = sb->st_gid; |
pascal@17253 | 112 n->ntime = sb->st_mtime; |
pascal@17253 | 113 + n->nlink = sb->st_nlink; |
pascal@17253 | 114 n->realsize = 0; |
pascal@17253 | 115 /* only regular files and symlinks contain "data" in romfs */ |
pascal@17253 | 116 if (S_ISREG(n->modes) || S_ISLNK(n->modes)) { |
pascal@17253 | 117 @@ -574,6 +613,9 @@ |
pascal@17253 | 118 node->ondev = -1; |
pascal@17253 | 119 node->onino = -1; |
pascal@17253 | 120 node->modes = -1; |
pascal@17253 | 121 + node->realsize = 0; |
pascal@17253 | 122 + node->devnode = 0; |
pascal@17253 | 123 + node->orig_link = NULL; |
pascal@17253 | 124 node->offset = curroffset; |
pascal@17253 | 125 node->align = DEFALIGN; |
pascal@17253 | 126 |
pascal@17253 | 127 @@ -935,6 +977,7 @@ |
pascal@17253 | 128 printf("\n"); |
pascal@17253 | 129 printf(" -f IMAGE Output the image into this file\n"); |
pascal@17253 | 130 printf(" -d DIRECTORY Use this directory as source\n"); |
pascal@17253 | 131 + printf(" -t Time, uid & gid support (backward compatible)\n"); |
pascal@17253 | 132 printf(" -v (Too) verbose operation\n"); |
pascal@17253 | 133 printf(" -V VOLUME Use the specified volume name\n"); |
pascal@17253 | 134 printf(" -a ALIGN Align regular file data to ALIGN bytes\n"); |
pascal@17253 | 135 @@ -971,6 +1014,9 @@ |
pascal@17253 | 136 break; |
pascal@17253 | 137 case 'V': |
pascal@17253 | 138 volname = optarg; |
pascal@17253 | 139 + break; |
pascal@17253 | 140 + case 't': |
pascal@17253 | 141 + oldromfs = 0; |
pascal@17253 | 142 break; |
pascal@17253 | 143 case 'v': |
pascal@17253 | 144 verbose = 1; |