]> git.ozlabs.org Git - yaboot.git/blobdiff - second/file.c
Commit yaboot 1.3.4
[yaboot.git] / second / file.c
index e4c379f4900b94c8c7a15c7807fa49afc68f343a..763e3e6ccd3761a90e5004d2975611511e51b9bd 100644 (file)
@@ -26,6 +26,7 @@
 #include "partition.h"
 #include "fs.h"
 #include "errors.h"
+#include "debug.h"
 
 extern char bootdevice[1024];
 
@@ -66,7 +67,7 @@ parse_device_path(char *imagepath, char *defdevice, int defpart,
               *ptr = 0;
               result->dev = strdup(ipath);
          } else
-         result->dev = strdup(ipath);
+              result->dev = strdup(ipath);
      else if ((ptr = strchr(ipath, ':')) != NULL) {
          *ptr = 0;
          result->dev = strdup(ipath);
@@ -78,7 +79,7 @@ parse_device_path(char *imagepath, char *defdevice, int defpart,
          return 0;
      }
      
- punt:
+punt:
      if (!result->dev)
          result->dev = strdup(defdev);
      
@@ -91,76 +92,6 @@ parse_device_path(char *imagepath, char *defdevice, int defpart,
      return 1;
 }
 
-#if 0
-char *
-parse_device_path(char *of_device, char **file_spec, int *partition)
-{
-       char *p, *last;
-
-       if (file_spec)
-               *file_spec = NULL;
-       if (partition)
-               *partition = -1;
-
-       DEBUG_F("of_device before parsing: %s\n", of_device);
-       p = strchr(of_device, ':');
-       DEBUG_F("of_device after parsing: %s\n", p);
-
-       if (!p) {                          /* if null terminated we are finished */
-            DEBUG_F("of_device: %s\n", of_device);
-            return of_device;
-       }
-#if 0 /* this is broken crap, breaks netboot entirely */
-       else if (strstr(of_device, "ethernet") != NULL)
-            p = strchr(of_device, ',');  /* skip over ip all the way to the ',' */
-       else if (strstr(of_device, "enet") != NULL)
-            p = strchr(of_device, ',');  /* skip over ip all the way to the ',' */
-#endif
-       *p = 0;
-       last = ++p;                       /* sets to start of second part */
-       while(*p && *p != ',') {
-        if (!isdigit (*p)) {
-            p = last;
-            break;
-       }
-       ++p;
-       }
-       if (p != last) {
-            *(p++) = 0;
-            if (partition)
-                 *partition = simple_strtol(last, NULL, 10);
-       }
-       if (*p && file_spec)
-            *file_spec = p;
-
-       DEBUG_F("of_device: %s\n", of_device);
-       strcat(of_device, ":");
-       DEBUG_F("of_device after strcat: %s\n", of_device);
-       return of_device;
-}
-
-int
-validate_fspec(                struct boot_fspec_t*    spec,
-                       char*                   default_device,
-                       int                     default_part)
-{
-    if (!spec->file) {
-       spec->file = spec->dev;
-       spec->dev = NULL;
-    }
-    if (spec->part == -1)
-       spec->part = default_part;
-    if (!spec->dev)
-       spec->dev = default_device;
-    if (!spec->file)
-       return FILE_BAD_PATH;
-    else if (spec->file[0] == ',')
-       spec->file++;
-
-    return FILE_ERR_OK;
-}
-
-#endif
 
 static int
 file_block_open(       struct boot_file_t*     file,
@@ -168,46 +99,46 @@ file_block_open(   struct boot_file_t*     file,
                        const char*             file_name,
                        int                     partition)
 {
-       struct partition_t*     parts;
-       struct partition_t*     p;
-       struct partition_t*     found;
+     struct partition_t*       parts;
+     struct partition_t*       p;
+     struct partition_t*       found;
        
-       parts = partitions_lookup(dev_name);
-       found = NULL;
+     parts = partitions_lookup(dev_name);
+     found = NULL;
                        
 #if DEBUG
-       if (parts)
-               prom_printf("partitions:\n");
-       else
-               prom_printf("no partitions found.\n");
+     if (parts)
+         prom_printf("partitions:\n");
+     else
+         prom_printf("no partitions found.\n");
 #endif
-       for (p = parts; p && !found; p=p->next) {
-               DEBUG_F("number: %02d, start: 0x%08lx, length: 0x%08lx\n",
-                       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 ((partition >= 0) && (partition == p->part_number))
-                       found = p;
+     for (p = parts; p && !found; p=p->next) {
+         DEBUG_F("number: %02d, start: 0x%08lx, length: 0x%08lx\n",
+                 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 ((partition >= 0) && (partition == p->part_number))
+              found = p;
 #if DEBUG
-               if (found)
-                       prom_printf(" (match)\n");
+         if (found)
+              prom_printf(" (match)\n");
 #endif                                         
-       }
+     }
 
-       /* Note: we don't skip when found is NULL since we can, in some
-        * cases, let OF figure out a default partition.
-        */
-        DEBUG_F( "Using OF defaults.. (found = %p)\n", found );
-        file->fs = fs_open( file, dev_name, found, file_name );
+     /* Note: we don't skip when found is NULL since we can, in some
+      * cases, let OF figure out a default partition.
+      */
+     DEBUG_F( "Using OF defaults.. (found = %p)\n", found );
+     file->fs = fs_open( file, dev_name, found, file_name );
 
 bail:
-       if (parts)
-               partitions_free(parts);
+     if (parts)
+         partitions_free(parts);
 
-       return fserrorno;
+     return fserrorno;
 }
 
 static int
@@ -215,8 +146,8 @@ file_net_open(      struct boot_file_t*     file,
                const char*             dev_name,
                const char*             file_name)
 {
-    file->fs = fs_of_netboot;
-    return fs_of_netboot->open(file, dev_name, NULL, file_name);
+     file->fs = fs_of_netboot;
+     return fs_of_netboot->open(file, dev_name, NULL, file_name);
 }
 
 static int
@@ -224,105 +155,60 @@ default_read(    struct boot_file_t*     file,
                unsigned int            size,
                void*                   buffer)
 {
-       prom_printf("WARNING ! default_read called !\n");
-       return FILE_ERR_EOF;
+     prom_printf("WARNING ! default_read called !\n");
+     return FILE_ERR_EOF;
 }
 
 static int
 default_seek(  struct boot_file_t*     file,
                unsigned int            newpos)
 {
-       prom_printf("WARNING ! default_seek called !\n");
-       return FILE_ERR_EOF;
+     prom_printf("WARNING ! default_seek called !\n");
+     return FILE_ERR_EOF;
 }
 
 static int
 default_close( struct boot_file_t*     file)
 {
-       prom_printf("WARNING ! default_close called !\n");
-       return FILE_ERR_OK;
+     prom_printf("WARNING ! default_close called !\n");
+     return FILE_ERR_OK;
 }
 
 static struct fs_t fs_default =
 {
-    "defaults",
-    NULL,
-    default_read,
-    default_seek,
-    default_close
+     "defaults",
+     NULL,
+     default_read,
+     default_seek,
+     default_close
 };
 
 
-int open_file( const struct boot_fspec_t*      spec,
-               struct boot_file_t*             file)
+int open_file(const struct boot_fspec_t* spec, struct boot_file_t* file)
 {
-//     static char     temp[1024];
-       static char     temps[64];
-//     char            *dev_name;
-//     char            *file_name = NULL;
-       phandle         dev;
-       int             result;
-       int             partition;
+     int result;
        
-       memset(file, 0, sizeof(struct boot_file_t*));
-        file->fs        = &fs_default;
+     memset(file, 0, sizeof(struct boot_file_t*));
+     file->fs        = &fs_default;
 
-       /* Lookup the OF device path */
-       /* First, see if a device was specified for the kernel
-        * if not, we hope that the user wants a kernel on the same
-        * drive and partition as yaboot itself */
-#if 0 /* this is crap */
-       if (!spec->dev)
-               strcpy(spec->dev, bootdevice);
-       strncpy(temp,spec->dev,1024);
-       dev_name = parse_device_path(temp, &file_name, &partition);
-       if (file_name == NULL)
-               file_name = (char *)spec->file;
-       if (file_name == NULL) {
-            prom_printf("Configuration error: null filename\n");
-            return FILE_ERR_NOTFOUND;
-       }
-       if (partition == -1)
-#endif
-               partition = spec->part;
+     DEBUG_F("dev_path = %s\nfile_name = %s\npartition = %d\n",
+            spec->dev, spec->file, spec->part);
 
-
-       DEBUG_F("dev_path = %s\nfile_name = %s\npartition = %d\n",
-               spec->dev, spec->file, partition);
-
-       /* Find OF device phandle */
-       dev = prom_finddevice(spec->dev);
-       if (dev == PROM_INVALID_HANDLE) {
-               return FILE_ERR_BADDEV;
-       }
-
-       DEBUG_F("dev_phandle = %p\n", dev);
-
-       /* Check the kind of device */
-       result = prom_getprop(dev, "device_type", temps, 63);
-       if (result == -1) {
-               prom_printf("can't get <device_type> for device\n");
-               return FILE_ERR_BADDEV;
-       }
-       temps[result] = 0;
-       if (!strcmp(temps, "block"))
-               file->device_kind = FILE_DEVICE_BLOCK;
-       else if (!strcmp(temps, "network"))
-               file->device_kind = FILE_DEVICE_NET;
-       else {
-               prom_printf("Unkown device type <%s>\n", temps);
-               return FILE_ERR_BADDEV;
-       }
+     result = prom_get_devtype(spec->dev);
+     if (result > 0)
+         file->device_kind = result;
+     else
+         return result;
        
-       switch(file->device_kind) {
-           case FILE_DEVICE_BLOCK:
-               DEBUG_F("device is a block device\n");
-               return file_block_open(file, spec->dev, spec->file, partition);
-           case FILE_DEVICE_NET:
-               DEBUG_F("device is a network device\n");
-               return file_net_open(file, spec->dev, spec->file);
-       }
-       return 0;
+     switch(file->device_kind) {
+     case FILE_DEVICE_BLOCK:
+         DEBUG_F("device is a block device\n");
+         return file_block_open(file, spec->dev, spec->file, spec->part);
+     case FILE_DEVICE_NET:
+         DEBUG_F("device is a network device\n");
+         return file_net_open(file, spec->dev, spec->file);
+     }
+     return 0;
 }
 
 /*