#define str(s) xstr(s)
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define CPIO_HDR_LEN 110
+#define CPIO_TRAILER "TRAILER!!!"
#define padlen(_off, _align) (((_align) - ((_off) & ((_align) - 1))) % (_align))
static char padding[512];
int (*handler)(const char *line);
};
-static int push_string(const char *name)
+static int push_buf(const char *name, size_t name_len)
{
- unsigned int name_len = strlen(name) + 1;
ssize_t len;
len = write(outfd, name, name_len);
return 0;
}
-static int push_rest(const char *name)
+static int push_rest(const char *name, size_t name_len)
{
- unsigned int name_len = strlen(name) + 1;
ssize_t len;
len = write(outfd, name, name_len);
static int cpio_trailer(void)
{
- const char name[] = "TRAILER!!!";
int len;
+ unsigned int namesize = sizeof(CPIO_TRAILER);
len = dprintf(outfd, "%s%08X%08X%08lX%08lX%08X%08lX"
"%08X%08X%08X%08X%08X%08X%08X",
0, /* minor */
0, /* rmajor */
0, /* rminor */
- (unsigned)strlen(name)+1, /* namesize */
+ namesize, /* namesize */
0); /* chksum */
offset += len;
if (len != CPIO_HDR_LEN ||
- push_rest(name) < 0 ||
+ push_rest(CPIO_TRAILER, namesize) < 0 ||
push_pad(padlen(offset, 512)) < 0)
return -1;
unsigned int mode, uid_t uid, gid_t gid)
{
int len;
+ unsigned int namesize, targetsize = strlen(target) + 1;
if (name[0] == '/')
name++;
+ namesize = strlen(name) + 1;
+
len = dprintf(outfd, "%s%08X%08X%08lX%08lX%08X%08lX"
"%08X%08X%08X%08X%08X%08X%08X",
do_csum ? "070702" : "070701", /* magic */
(long) gid, /* gid */
1, /* nlink */
(long) default_mtime, /* mtime */
- (unsigned)strlen(target)+1, /* filesize */
+ targetsize, /* filesize */
3, /* major */
1, /* minor */
0, /* rmajor */
0, /* rminor */
- (unsigned)strlen(name) + 1,/* namesize */
+ namesize, /* namesize */
0); /* chksum */
offset += len;
if (len != CPIO_HDR_LEN ||
- push_string(name) < 0 ||
+ push_buf(name, namesize) < 0 ||
push_pad(padlen(offset, 4)) < 0 ||
- push_string(target) < 0 ||
+ push_buf(target, targetsize) < 0 ||
push_pad(padlen(offset, 4)) < 0)
return -1;
uid_t uid, gid_t gid)
{
int len;
+ unsigned int namesize;
if (name[0] == '/')
name++;
+ namesize = strlen(name) + 1;
+
len = dprintf(outfd, "%s%08X%08X%08lX%08lX%08X%08lX"
"%08X%08X%08X%08X%08X%08X%08X",
do_csum ? "070702" : "070701", /* magic */
1, /* minor */
0, /* rmajor */
0, /* rminor */
- (unsigned)strlen(name) + 1,/* namesize */
+ namesize, /* namesize */
0); /* chksum */
offset += len;
if (len != CPIO_HDR_LEN ||
- push_rest(name) < 0)
+ push_rest(name, namesize) < 0)
return -1;
return 0;
unsigned int maj, unsigned int min)
{
int len;
+ unsigned int namesize;
if (dev_type == 'b')
mode |= S_IFBLK;
if (name[0] == '/')
name++;
+ namesize = strlen(name) + 1;
+
len = dprintf(outfd, "%s%08X%08X%08lX%08lX%08X%08lX"
"%08X%08X%08X%08X%08X%08X%08X",
do_csum ? "070702" : "070701", /* magic */
1, /* minor */
maj, /* rmajor */
min, /* rminor */
- (unsigned)strlen(name) + 1,/* namesize */
+ namesize, /* namesize */
0); /* chksum */
offset += len;
if (len != CPIO_HDR_LEN ||
- push_rest(name) < 0)
+ push_rest(name, namesize) < 0)
return -1;
return 0;
offset += len;
if (len != CPIO_HDR_LEN ||
- push_string(name) < 0 ||
+ push_buf(name, namesize) < 0 ||
push_pad(padlen(offset, 4)) < 0)
goto error;