iPXE
Functions
cpio.c File Reference

CPIO archives. More...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ipxe/cpio.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
void cpio_set_field (char *field, unsigned long value)
 Set field within a CPIO header. More...
 
size_t cpio_name_len (struct image *image)
 Get CPIO image filename. More...
 
static void cpio_parse_cmdline (struct image *image, struct cpio_header *cpio)
 Parse CPIO image parameters. More...
 
size_t cpio_header (struct image *image, struct cpio_header *cpio)
 Construct CPIO header for image, if applicable. More...
 

Detailed Description

CPIO archives.

Definition in file cpio.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ cpio_set_field()

void cpio_set_field ( char *  field,
unsigned long  value 
)

Set field within a CPIO header.

Parameters
fieldField within CPIO header
valueValue to set

Definition at line 43 of file cpio.c.

43  {
44  char buf[9];
45 
46  snprintf ( buf, sizeof ( buf ), "%08lx", value );
47  memcpy ( field, buf, 8 );
48 }
void * memcpy(void *dest, const void *src, size_t len) __nonnull
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382

References memcpy(), snprintf(), and value.

Referenced by cpio_header(), and cpio_parse_cmdline().

◆ cpio_name_len()

size_t cpio_name_len ( struct image image)

Get CPIO image filename.

Parameters
imageImage
Return values
lenCPIO filename length (0 for no filename)

Definition at line 56 of file cpio.c.

56  {
57  const char *name = cpio_name ( image );
58  char *sep;
59  size_t len;
60 
61  /* Check for existence of CPIO filename */
62  if ( ! name )
63  return 0;
64 
65  /* Locate separator (if any) */
66  sep = strchr ( name, ' ' );
67  len = ( sep ? ( ( size_t ) ( sep - name ) ) : strlen ( name ) );
68 
69  return len;
70 }
const char * name
Definition: ath9k_hw.c:1984
__SIZE_TYPE__ size_t
Definition: stdint.h:6
An executable image.
Definition: image.h:24
char * strchr(const char *src, int character)
Find character within a string.
Definition: string.c:271
size_t strlen(const char *src)
Get length of string.
Definition: string.c:243
uint32_t len
Length.
Definition: ena.h:14
static const char * cpio_name(struct image *image)
Get CPIO image name.
Definition: cpio.h:66

References cpio_name(), len, name, strchr(), and strlen().

Referenced by bzimage_load_initrd(), cpio_header(), cpio_parse_cmdline(), and efi_file_read_initrd().

◆ cpio_parse_cmdline()

static void cpio_parse_cmdline ( struct image image,
struct cpio_header cpio 
)
static

Parse CPIO image parameters.

Parameters
imageImage
cpioCPIO header to fill in

Definition at line 78 of file cpio.c.

79  {
80  const char *cmdline;
81  char *arg;
82  char *end;
83  unsigned int mode;
84 
85  /* Skip image filename */
86  cmdline = ( cpio_name ( image ) + cpio_name_len ( image ) );
87 
88  /* Look for "mode=" */
89  if ( ( arg = strstr ( cmdline, "mode=" ) ) ) {
90  arg += 5;
91  mode = strtoul ( arg, &end, 8 /* Octal for file mode */ );
92  if ( *end && ( *end != ' ' ) ) {
93  DBGC ( image, "CPIO %p strange \"mode=\" "
94  "terminator '%c'\n", image, *end );
95  }
96  cpio_set_field ( cpio->c_mode, ( 0100000 | mode ) );
97  }
98 }
size_t cpio_name_len(struct image *image)
Get CPIO image filename.
Definition: cpio.c:56
unsigned long strtoul(const char *string, char **endp, int base)
Convert string to numeric value.
Definition: string.c:471
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:24
void cpio_set_field(char *field, unsigned long value)
Set field within a CPIO header.
Definition: cpio.c:43
char * strstr(const char *haystack, const char *needle)
Find substring.
Definition: string.c:309
char c_mode[8]
File mode and permissions.
Definition: cpio.h:25
uint32_t end
Ending offset.
Definition: netvsc.h:18
uint32_t cmdline
Definition: multiboot.h:16
static const char * cpio_name(struct image *image)
Get CPIO image name.
Definition: cpio.h:66

References cpio_header::c_mode, cmdline, cpio_name(), cpio_name_len(), cpio_set_field(), DBGC, end, strstr(), and strtoul().

Referenced by cpio_header().

◆ cpio_header()

size_t cpio_header ( struct image image,
struct cpio_header cpio 
)

Construct CPIO header for image, if applicable.

Parameters
imageImage
cpioCPIO header to fill in
Return values
lenLength of magic CPIO header (including filename)

Definition at line 107 of file cpio.c.

107  {
108  size_t name_len;
109  size_t len;
110 
111  /* Get filename length */
112  name_len = cpio_name_len ( image );
113 
114  /* Images with no filename are assumed to already be CPIO archives */
115  if ( ! name_len )
116  return 0;
117 
118  /* Construct CPIO header */
119  memset ( cpio, '0', sizeof ( *cpio ) );
120  memcpy ( cpio->c_magic, CPIO_MAGIC, sizeof ( cpio->c_magic ) );
121  cpio_set_field ( cpio->c_mode, 0100644 );
122  cpio_set_field ( cpio->c_nlink, 1 );
123  cpio_set_field ( cpio->c_filesize, image->len );
124  cpio_set_field ( cpio->c_namesize, ( name_len + 1 /* NUL */ ) );
125  cpio_parse_cmdline ( image, cpio );
126 
127  /* Calculate total length */
128  len = ( ( sizeof ( *cpio ) + name_len + 1 /* NUL */ + CPIO_ALIGN - 1 )
129  & ~( CPIO_ALIGN - 1 ) );
130 
131  return len;
132 }
size_t cpio_name_len(struct image *image)
Get CPIO image filename.
Definition: cpio.c:56
char c_filesize[8]
Size of data field.
Definition: cpio.h:35
#define CPIO_ALIGN
CPIO header length alignment.
Definition: cpio.h:54
An executable image.
Definition: image.h:24
void cpio_set_field(char *field, unsigned long value)
Set field within a CPIO header.
Definition: cpio.c:43
void * memcpy(void *dest, const void *src, size_t len) __nonnull
char c_mode[8]
File mode and permissions.
Definition: cpio.h:25
size_t len
Length of raw file image.
Definition: image.h:43
static void cpio_parse_cmdline(struct image *image, struct cpio_header *cpio)
Parse CPIO image parameters.
Definition: cpio.c:78
char c_namesize[8]
Length of filename, including final NUL.
Definition: cpio.h:45
char c_nlink[8]
Number of links.
Definition: cpio.h:31
char c_magic[6]
The string "070701" or "070702".
Definition: cpio.h:21
uint32_t len
Length.
Definition: ena.h:14
#define CPIO_MAGIC
CPIO magic.
Definition: cpio.h:51
void * memset(void *dest, int character, size_t len) __nonnull

References cpio_header::c_filesize, cpio_header::c_magic, cpio_header::c_mode, cpio_header::c_namesize, cpio_header::c_nlink, CPIO_ALIGN, CPIO_MAGIC, cpio_name_len(), cpio_parse_cmdline(), cpio_set_field(), len, image::len, memcpy(), and memset().

Referenced by bzimage_load_initrd(), and efi_file_read_initrd().