mirror of
https://github.com/grub4dos/ntloader.git
synced 2025-05-09 04:01:08 +08:00
optimize mkinitrd
This commit is contained in:
parent
c3d220de99
commit
00de90c22f
@ -33,6 +33,9 @@
|
|||||||
#define lstat stat
|
#define lstat stat
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define ALIGN_UP_OVERHEAD(addr, align) \
|
||||||
|
((-(addr)) & ((typeof (addr)) (align) - 1))
|
||||||
|
|
||||||
static char
|
static char
|
||||||
hex (uint8_t val)
|
hex (uint8_t val)
|
||||||
{
|
{
|
||||||
@ -71,34 +74,25 @@ write_header (FILE *out,
|
|||||||
set_field (header.c_namesize, len);
|
set_field (header.c_namesize, len);
|
||||||
set_field (header.c_chksum, 0);
|
set_field (header.c_chksum, 0);
|
||||||
|
|
||||||
if (sizeof (header) != 110)
|
if (fwrite (&header, 1, sizeof (header), out) != sizeof (header))
|
||||||
{
|
|
||||||
perror ("cpio header");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(fwrite (&header, 1, sizeof (header), out) != sizeof (header))
|
|
||||||
{
|
{
|
||||||
perror ("fwrite header");
|
perror ("fwrite header");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(fwrite (name, 1, len, out) != len)
|
if (fwrite (name, 1, len, out) != len)
|
||||||
{
|
{
|
||||||
perror ("fwrite name");
|
perror ("fwrite name");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t total = sizeof (header) + len;
|
ssize_t total = sizeof (header) + len;
|
||||||
int pad = (4 - (total % 4)) % 4;
|
size_t pad = ALIGN_UP_OVERHEAD (total, 4);
|
||||||
if (pad > 0)
|
char zero[4] = {0, 0, 0, 0};
|
||||||
|
if (fwrite (zero, 1, pad, out) != pad)
|
||||||
{
|
{
|
||||||
char zero[4] = {0, 0, 0, 0};
|
perror ("fwrite header padding");
|
||||||
if (fwrite (zero, 1, pad, out) != (size_t) pad)
|
return -1;
|
||||||
{
|
|
||||||
perror ("fwrite header padding");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -110,12 +104,12 @@ copy_data (FILE *out, FILE *in, size_t fsize)
|
|||||||
char buffer[4096];
|
char buffer[4096];
|
||||||
while(remaining > 0)
|
while(remaining > 0)
|
||||||
{
|
{
|
||||||
size_t to_read = remaining < sizeof(buffer) ?
|
size_t to_read = remaining < sizeof (buffer) ?
|
||||||
remaining : sizeof(buffer);
|
remaining : sizeof (buffer);
|
||||||
size_t r = fread (buffer, 1, to_read, in);
|
size_t r = fread (buffer, 1, to_read, in);
|
||||||
if(r == 0)
|
if (r == 0)
|
||||||
{
|
{
|
||||||
if(ferror (in))
|
if (ferror (in))
|
||||||
{
|
{
|
||||||
perror ("fread");
|
perror ("fread");
|
||||||
return -1;
|
return -1;
|
||||||
@ -130,16 +124,14 @@ copy_data (FILE *out, FILE *in, size_t fsize)
|
|||||||
remaining -= r;
|
remaining -= r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pad = (4 - (fsize % 4)) % 4;
|
size_t pad = ALIGN_UP_OVERHEAD ((ssize_t) fsize, 4);
|
||||||
if (pad > 0)
|
char zero[4] = {0, 0, 0, 0};
|
||||||
|
if (fwrite (zero, 1, pad, out) != pad)
|
||||||
{
|
{
|
||||||
char zero[4] = {0, 0, 0, 0};
|
perror ("fwrite data padding");
|
||||||
if (fwrite (zero, 1, pad, out) != (size_t) pad)
|
return -1;
|
||||||
{
|
|
||||||
perror ("fwrite data padding");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,12 +146,12 @@ process_file (const char *path,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
FILE *in = fopen (path, "rb");
|
FILE *in = fopen (path, "rb");
|
||||||
if(!in)
|
if (!in)
|
||||||
{
|
{
|
||||||
perror (path);
|
perror (path);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(copy_data (out, in, fsize) != 0)
|
if (copy_data (out, in, fsize) != 0)
|
||||||
{
|
{
|
||||||
fclose (in);
|
fclose (in);
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user