X-Git-Url: http://git.ozlabs.org/?p=yaboot.git;a=blobdiff_plain;f=second%2Ffile.c;h=ed70376be542670865c249a52e1086381418acd3;hp=b88706977b7dad3b54db7ebc95ecb647c6dd81d2;hb=b95e2fe6b9c48a252ff6a3a9efe9f06e582ce4f4;hpb=678d83ff8608534ece0f1e912eddedef4f0bb67a diff --git a/second/file.c b/second/file.c index b887069..ed70376 100644 --- a/second/file.c +++ b/second/file.c @@ -1,20 +1,28 @@ -/* File related stuff - - Copyright (C) 1999 Benjamin Herrenschmidt - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +/* + * file.c - Filesystem related interfaces + * + * Copyright (C) 2001, 2002 Ethan Benson + * + * parse_device_path() + * + * Copyright (C) 2001 Colin Walters + * + * Copyright (C) 1999 Benjamin Herrenschmidt + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ #include "ctype.h" #include "types.h" @@ -70,8 +78,8 @@ parse_device_path(char *imagepath, char *defdevice, int defpart, if (!imagepath) return 0; - else - ipath = strdup(imagepath); + else if (!(ipath = strdup(imagepath))) + return 0; if (defdevice) defdev = strdup(defdevice); @@ -81,16 +89,23 @@ parse_device_path(char *imagepath, char *defdevice, int defpart, if ((ptr = strrchr(defdev, ':')) != NULL) *ptr = 0; /* remove trailing : from defdevice if necessary */ } + } else { + return 0; } - if ((ptr = strrchr(ipath, ',')) != NULL) { - char *colon = strrchr(ipath, ':'); - /* If a ':' occurs *after* a ',', then we assume that there is - no filename */ - if (!colon || colon < ptr) { - result->file = strdup(ptr+1); - /* Trim the filename off */ - *ptr = 0; + /* if there is no : then there is no filename or partition. must + use strrchr() since enet:,10.0.0.1,file is legal */ + + if (strchr(ipath, ':') != NULL) { + if ((ptr = strrchr(ipath, ',')) != NULL) { + char *colon = strrchr(ipath, ':'); + /* If a ':' occurs *after* a ',', then we assume that there is + no filename */ + if (!colon || colon < ptr) { + result->file = strdup(ptr+1); + /* Trim the filename off */ + *ptr = 0; + } } } @@ -110,6 +125,7 @@ parse_device_path(char *imagepath, char *defdevice, int defpart, } else if (strlen(ipath)) { result->file = strdup(ipath); } else { + free(defdev); return 0; } @@ -124,7 +140,7 @@ parse_device_path(char *imagepath, char *defdevice, int defpart, free(ipath); if (defdev) - free(defdev); + free(defdev); return 1; } @@ -153,8 +169,12 @@ file_block_open( struct boot_file_t* file, p->part_number, p->part_start, p->part_size ); if (partition == -1) { file->fs = fs_open( file, dev_name, p, file_name ); - if (file->fs != NULL) - goto bail; + if (file->fs == NULL || fserrorno != FILE_ERR_OK) + continue; + else { + partition = p->part_number; + goto done; + } } if ((partition >= 0) && (partition == p->part_number)) found = p; @@ -170,7 +190,7 @@ file_block_open( struct boot_file_t* file, DEBUG_F( "Using OF defaults.. (found = %p)\n", found ); file->fs = fs_open( file, dev_name, found, file_name ); -bail: +done: if (parts) partitions_free(parts);