From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1Iqb4C-00055L-Sa for mharc-grub-devel@gnu.org; Fri, 09 Nov 2007 16:07:04 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Iqb4B-00054M-OV for grub-devel@gnu.org; Fri, 09 Nov 2007 16:07:03 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Iqb4A-000539-Gd for grub-devel@gnu.org; Fri, 09 Nov 2007 16:07:02 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Iqb4A-000532-Cj for grub-devel@gnu.org; Fri, 09 Nov 2007 16:07:02 -0500 Received: from mailout06.sul.t-online.de ([194.25.134.19] helo=mailout06.sul.t-online.com) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Iqb48-0000l2-W3 for grub-devel@gnu.org; Fri, 09 Nov 2007 16:07:01 -0500 Received: from fwd30.aul.t-online.de by mailout06.sul.t-online.com with smtp id 1Iqb48-00070Z-00; Fri, 09 Nov 2007 22:07:00 +0100 Received: from [10.3.2.2] (STnspkZFYhdur0lEF8X1uA52knYu+Vi4-sdjgWVdNJDLPwEIz6an2IqakVPN--4gu7@[217.235.206.191]) by fwd30.aul.t-online.de with esmtp id 1Iqb3w-22Y4TQ0; Fri, 9 Nov 2007 22:06:48 +0100 Message-ID: <4734CBEB.7080500@t-online.de> Date: Fri, 09 Nov 2007 22:06:51 +0100 From: Christian Franke User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070802 SeaMonkey/1.1.4 MIME-Version: 1.0 To: The development of GRUB 2 References: <471E5075.9090309@t-online.de> <472B8FA5.5030400@t-online.de> <874pfvmpta.fsf@xs4all.nl> In-Reply-To: <874pfvmpta.fsf@xs4all.nl> Content-Type: multipart/mixed; boundary="------------000709080405050500070502" X-ID: STnspkZFYhdur0lEF8X1uA52knYu+Vi4-sdjgWVdNJDLPwEIz6an2IqakVPN--4gu7 X-TOI-MSGID: 26d01c2a-7bdc-4b6c-8567-e49abbe48c6e X-detected-kernel: by monty-python.gnu.org: Linux 2.6 (newer, 3) Subject: Re: [PATCH] Allow build without dirent.d_type, fix "ls (host)" crash X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 09 Nov 2007 21:07:04 -0000 This is a multi-part message in MIME format. --------------000709080405050500070502 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Marco Gerards wrote: >> ... >> +static int >> +is_dir(const char *path, const char *name) >> > > is_dir ( > > OK. Too many projects, too many policies, sorry :-) >> +{ >> + int len1 = strlen(path), len2 = strlen(name); >> > > Please split this up. Or even better use separate declarations and > code. > > Yes. No. See comment below. >> + char pathname[len1+1+len2+1+13]; >> > > Please add spaces around binary operators. > > >> + struct stat st; >> + strcpy (pathname, path); >> > > Please add more blank lines between your code to make it easier to > read. :-) > > OK. >> ... >> + strcat (pathname, "/"); >> + strcat (pathname, name); >> + if (stat (pathname, &st)) >> + return 0; >> + return S_ISDIR(st.st_mode); >> +} >> +#endif >> > > Why can't you just use S_ISDIR? > > ?? >> ... >> @@ -81,6 +108,7 @@ grub_hostfs_read (grub_file_t file, char >> FILE *f; >> >> f = (FILE *) file->data; >> + fseek (f, file->offset, SEEK_SET); >> int s= fread (buf, 1, len, f); >> > > "int s = " > > Code janitor work outside the scope of this patch ... done ;-) BTW: This line uses "declaration statement" syntax, therefore this is apparently accepted in GRUB2 codebase :-) I definitely prefer this (first use = declaration = initialization) style, which is state of the art in most (all?) modern languages. This C++ (1986) feature and early GCC (1.*) extension was finally included into C99, so it is portable now. is_dir() rewritten accordingly. Christian 2007-11-09 Christian Franke * util/hostfs.c (is_dir): New function. (grub_hostfs_dir): Handle missing dirent.d_type case. (grub_hostfs_read): Add missing fseek(). (grub_hostfs_label): Clear label pointer. This fixes a crash of grub-emu on "ls (host)". --------------000709080405050500070502 Content-Type: text/x-patch; name="grub2-hostfs-d_type-3.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="grub2-hostfs-d_type-3.patch" --- grub2.orig/util/hostfs.c 2007-08-02 19:24:06.000000000 +0200 +++ grub2/util/hostfs.c 2007-11-09 21:41:42.484375000 +0100 @@ -25,6 +25,34 @@ #include #include + +#ifndef DT_DIR +/* dirent.d_type is a BSD extension, not part of POSIX */ +#include +#include + +static int +is_dir (const char *path, const char *name) +{ + int len1 = strlen(path); + int len2 = strlen(name); + + char pathname[len1 + 1 + len2 + 1 + 13]; + strcpy (pathname, path); + + /* Avoid UNC-path "//name" on Cygwin. */ + if (len1 > 0 && pathname[len1 - 1] != '/') + strcat (pathname, "/"); + + strcat (pathname, name); + + struct stat st; + if (stat (pathname, &st)) + return 0; + return S_ISDIR (st.st_mode); +} +#endif + static grub_err_t grub_hostfs_dir (grub_device_t device, const char *path, int (*hook) (const char *filename, int dir)) @@ -48,7 +76,11 @@ if (! de) break; +#ifdef DT_DIR hook (de->d_name, de->d_type == DT_DIR); +#else + hook (de->d_name, is_dir (path, de->d_name)); +#endif } closedir (dir); @@ -81,7 +113,8 @@ FILE *f; f = (FILE *) file->data; - int s= fread (buf, 1, len, f); + fseek (f, file->offset, SEEK_SET); + int s = fread (buf, 1, len, f); return s; } @@ -101,6 +134,7 @@ grub_hostfs_label (grub_device_t device __attribute ((unused)), char **label __attribute ((unused))) { + *label = 0; return GRUB_ERR_NONE; } --------------000709080405050500070502--