source: bootcd/isolinux/syslinux-6.03/com32/libupload/cpio.c

Last change on this file was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 1.6 KB
Line 
1/*
2 * cpio.c
3 *
4 * Write a compressed CPIO file
5 */
6
7#include <stdio.h>
8#include <string.h>
9#include <inttypes.h>
10#include <stdbool.h>
11#include <zlib.h>
12#include "upload_backend.h"
13#include "ctime.h"
14
15int cpio_pad(struct upload_backend *be)
16{
17    static char pad[4];         /* Up to 4 zero bytes */
18    if (be->dbytes & 3)
19        return write_data(be, pad, -be->dbytes & 3);
20    else
21        return 0;
22}
23
24int cpio_hdr(struct upload_backend *be, uint32_t mode, size_t datalen,
25             const char *filename)
26{
27    static uint32_t inode = 2;
28    char hdr[6+13*8+1];
29    int nlen = strlen(filename)+1;
30    int rv = 0;
31
32    cpio_pad(be);
33
34    sprintf(hdr, "%06o%08x%08x%08x%08x%08x%08x%08zx%08x%08x%08x%08x%08x%08x",
35            070701,             /* c_magic */
36            inode++,            /* c_ino */
37            mode,               /* c_mode */
38            0,                  /* c_uid */
39            0,                  /* c_gid */
40            1,                  /* c_nlink */
41            be->now,            /* c_mtime */
42            datalen,            /* c_filesize */
43            0,                  /* c_maj */
44            0,                  /* c_min */
45            0,                  /* c_rmaj */
46            0,                  /* c_rmin */
47            nlen,               /* c_namesize */
48            0);                 /* c_chksum */
49    rv |= write_data(be, hdr, 6+13*8);
50    rv |= write_data(be, filename, nlen);
51    rv |= cpio_pad(be);
52    return rv;
53}
54
55int cpio_mkdir(struct upload_backend *be, const char *filename)
56{
57    return cpio_hdr(be, MODE_DIR, 0, filename);
58}
59
60int cpio_writefile(struct upload_backend *be, const char *filename,
61                   const void *data, size_t len)
62{
63    int rv;
64
65    rv = cpio_hdr(be, MODE_FILE, len, filename);
66    rv |= write_data(be, data, len);
67    rv |= cpio_pad(be);
68
69    return rv;
70}
71
72int cpio_close(struct upload_backend *be)
73{
74    return cpio_hdr(be, 0, 0, "TRAILER!!!");
75}
Note: See TracBrowser for help on using the repository browser.