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. ... ... ...