summaryrefslogtreecommitdiffstats
path: root/buildtools/pmdinfogen/pmdinfogen.c
diff options
context:
space:
mode:
Diffstat (limited to 'buildtools/pmdinfogen/pmdinfogen.c')
-rw-r--r--buildtools/pmdinfogen/pmdinfogen.c53
1 files changed, 43 insertions, 10 deletions
diff --git a/buildtools/pmdinfogen/pmdinfogen.c b/buildtools/pmdinfogen/pmdinfogen.c
index 96ccbf33..0f35ca46 100644
--- a/buildtools/pmdinfogen/pmdinfogen.c
+++ b/buildtools/pmdinfogen/pmdinfogen.c
@@ -26,6 +26,7 @@
#define ADDR_SIZE 32
#endif
+static int use_stdin, use_stdout;
static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
{
@@ -39,11 +40,36 @@ static void *grab_file(const char *filename, unsigned long *size)
{
struct stat st;
void *map = MAP_FAILED;
- int fd;
+ int fd = -1;
+
+ if (!use_stdin) {
+ fd = open(filename, O_RDONLY);
+ if (fd < 0)
+ return NULL;
+ } else {
+ /* from stdin, use a temporary file to mmap */
+ FILE *infile;
+ char buffer[1024];
+ int n;
+
+ infile = tmpfile();
+ if (infile == NULL) {
+ perror("tmpfile");
+ return NULL;
+ }
+ fd = dup(fileno(infile));
+ fclose(infile);
+ if (fd < 0)
+ return NULL;
+
+ n = read(STDIN_FILENO, buffer, sizeof(buffer));
+ while (n > 0) {
+ if (write(fd, buffer, n) != n)
+ goto failed;
+ n = read(STDIN_FILENO, buffer, sizeof(buffer));
+ }
+ }
- fd = open(filename, O_RDONLY);
- if (fd < 0)
- return NULL;
if (fstat(fd, &st))
goto failed;
@@ -158,7 +184,8 @@ static int parse_elf(struct elf_info *info, const char *filename)
* There are more than 64k sections,
* read count from .sh_size.
*/
- info->num_sections = TO_NATIVE(endian, 32, sechdrs[0].sh_size);
+ info->num_sections =
+ TO_NATIVE(endian, ADDR_SIZE, sechdrs[0].sh_size);
} else {
info->num_sections = hdr->e_shnum;
}
@@ -181,7 +208,7 @@ static int parse_elf(struct elf_info *info, const char *filename)
sechdrs[i].sh_offset =
TO_NATIVE(endian, ADDR_SIZE, sechdrs[i].sh_offset);
sechdrs[i].sh_size =
- TO_NATIVE(endian, 32, sechdrs[i].sh_size);
+ TO_NATIVE(endian, ADDR_SIZE, sechdrs[i].sh_size);
sechdrs[i].sh_link =
TO_NATIVE(endian, 32, sechdrs[i].sh_link);
sechdrs[i].sh_info =
@@ -357,10 +384,14 @@ static void output_pmd_info_string(struct elf_info *info, char *outfile)
struct rte_pci_id *pci_ids;
int idx = 0;
- ofd = fopen(outfile, "w+");
- if (!ofd) {
- fprintf(stderr, "Unable to open output file\n");
- return;
+ if (use_stdout)
+ ofd = stdout;
+ else {
+ ofd = fopen(outfile, "w+");
+ if (!ofd) {
+ fprintf(stderr, "Unable to open output file\n");
+ return;
+ }
}
drv = info->drivers;
@@ -410,6 +441,8 @@ int main(int argc, char **argv)
basename(argv[0]));
exit(127);
}
+ use_stdin = !strcmp(argv[1], "-");
+ use_stdout = !strcmp(argv[2], "-");
parse_elf(&info, argv[1]);
if (locate_pmd_entries(&info) < 0)