Gert Hulselmans
2010-Mar-18 18:49 UTC
[syslinux] argv[0] doesn't contain module name and cat.c32 hangs with Syslinux 4.00-pre36
The program name of the module can't be retrieved with argv[0].
I tested it by running cat.c32 (com32/samples/cat.c32).
In Syslinux 3.85, argv[0] returns an empty string.
In Syslinux 4.00-pre36, argv[0] returns some garbage characters.
ISOLINUX 3.85 2010-02-20 ETCD Copyright (C) 1994-2010 H. Peter Anvin et al
argv = 0x00182c44
argv[0] = 0x07fbffc3 = ""
argv[1] = 0x00182c34 = "isolinux.cfg"
argv[2] = 0x00000000 = "(null)"
File = isolinux.cfg
DEFAULT cat_file
LABEL cat_file
COM32 cat.c32
APPEND isolinux.cfg
boot:
EXTLINUX 4.00 4.00-pre36 Copyright (C) 1994-2010 H. Peter Anvin et al
Press 1 to see the menu
Hello, World! from (hello.c)
argv = 0x001e1e48
argv[0] = 0x07fdffbf = "?"
argv[1] = 0x001e1e38 = "extlinux.conf"
argv[2] = 0x00000000 = "(null)"
File = extlinux.conf
DEFAULT cat_file
LABEL cat_file
COM32 cat.c32
APPEND extlinux.conf
boot:
On my PC, cat.c32 (com32/samples/cat.c32) of Syslinux 4.00-pre36 hangs when
you specify a file that doesn't exist (works fine in kvm).
It works fine with Syslinux 3.85.
Checking if the file exist, before trying to read its contents, fixes the
issue.
I also replace "exit(1)" by "return 1;" (suggestion of Shao
Miller).
$ diff -up syslinux-4.00-pre36-original/com32/samples/cat.c
syslinux-4.00-pre36/com32/samples/cat.c
--- syslinux-4.00-pre36-original/com32/samples/cat.c 2010-03-07
00:13:36.000000000 +0100
+++ syslinux-4.00-pre36/com32/samples/cat.c 2010-03-18 18:02:58.499575668
+0100
@@ -15,13 +15,18 @@ int main(int argc, char *argv[])
printf("argv[%d] = %p = \"%s\"\n", i, argv[i], argv[i]);
if (argc < 2) {
- fprintf(stderr, "Missing file name!\n");
- exit(1);
+ fprintf(stderr, "Usage: cat.c32 filename\n");
+ return 1;
}
printf("File = %s\n", argv[1]);
f = fopen(argv[1], "r");
+ if (!f) {
+ fprintf(stderr, "File name \"%s\" does not exist.\n",
argv[1]);
+ return 1;
+ }
+
while ((ch = getc(f)) != EOF)
putchar(ch);
Also a true cat.c32 module would be nice to have.
So a cat.c32 module that doesn't display this part:
==================================================argv = 0x001e1e48
argv[0] = 0x07fdffbf = "?"
argv[1] = 0x001e1e38 = "extlinux.conf"
argv[2] = 0x00000000 = "(null)"
File = extlinux.conf
==================================================
Maybe replacing strange characters with "?" would even be better.
A more.c32 module would also be useful.
$ cat com32/modules/cat.c
#include <stdio.h>
#include <stdlib.h>
#include <console.h>
int main(int argc, char *argv[])
{
FILE *f;
int ch;
openconsole(&dev_stdcon_r, &dev_stdcon_w);
if (argc != 2) {
fprintf(stderr, "Usage: cat.c32 filename\n");
return 1;
}
f = fopen(argv[1], "r");
if (!f) {
fprintf(stderr, "File name \"%s\" does not exist.\n",
argv[1]);
return 1;
}
while ((ch = getc(f)) != EOF)
putchar(ch);
fclose(f);
return 0;
}
- Gert Hulselmans
Gert's concern (regarding argv[0]) below addressed by H. Peter's commit:
commit 68a7538d5a80ec8db48c02d4a9de7199df0af9f9
Author: H. Peter Anvin <hpa at linux.intel.com>
Date: Mon Mar 29 16:58:30 2010 -0700
com32: export the filename of a com32 module to the module itself
Export the filename of the com32 module to the module itself,
setting
argv[0].
Signed-off-by: H. Peter Anvin <hpa at linux.intel.com>
- Shao Miller
-----Original Message-----
From: syslinux-bounces at zytor.com [mailto:syslinux-bounces at zytor.com] On
Behalf Of Gert Hulselmans
Sent: Thursday, March 18, 2010 14:50
To: For discussion of Syslinux and tftp-hpa
Subject: [syslinux] argv[0] doesn't contain module name and cat.c32
hangs with Syslinux 4.00-pre36
The program name of the module can't be retrieved with argv[0].
I tested it by running cat.c32 (com32/samples/cat.c32).
In Syslinux 3.85, argv[0] returns an empty string.
In Syslinux 4.00-pre36, argv[0] returns some garbage characters.
... ... ...