ppcrcd/trunk/yaboot/file.c
sparky
cvs at pld-linux.org
Sat Feb 25 21:19:27 CET 2006
Author: sparky
Date: Sat Feb 25 21:19:25 2006
New Revision: 7014
Modified:
ppcrcd/trunk/yaboot/file.c
Log:
- sync with 1.3.14rc1
Modified: ppcrcd/trunk/yaboot/file.c
==============================================================================
--- ppcrcd/trunk/yaboot/file.c (original)
+++ ppcrcd/trunk/yaboot/file.c Sat Feb 25 21:19:25 2006
@@ -38,6 +38,112 @@
extern char bootdevice[1024];
+static char *netdev_path_to_filename(const char *path)
+{
+ char *tmp, *args, *filename;
+ size_t len;
+
+ DEBUG_F("path = %s\n", path);
+
+ if (!path)
+ return NULL;
+
+ args = strrchr(path, ':');
+ if (!args)
+ return NULL;
+
+ /* The obp-tftp device arguments should be at the end of
+ * the argument list. Skip over any extra arguments (promiscuous,
+ * speed, duplex, bootp, rarp).
+ */
+
+ tmp = strstr(args, "promiscuous");
+ if (tmp && tmp > args)
+ args = tmp + strlen("promiscuous");
+
+ tmp = strstr(args, "speed=");
+ if (tmp && tmp > args)
+ args = tmp + strlen("speed=");
+
+ tmp = strstr(args, "duplex=");
+ if (tmp && tmp > args)
+ args = tmp + strlen("duplex=");
+
+ tmp = strstr(args, "bootp");
+ if (tmp && tmp > args)
+ args = tmp + strlen("bootp");
+
+ tmp = strstr(args, "rarp");
+ if (tmp && tmp > args)
+ args = tmp + strlen("rarp");
+
+ args = strchr(args, ',');
+ if (!args)
+ return NULL;
+
+ tmp = args;
+ tmp--;
+ /* If the preceding character is ':' then there were no
+ * non-obp-tftp arguments and we know we're right up to the
+ * filename. Otherwise, we must advance args once more.
+ */
+ args++;
+ if (*tmp != ':') {
+ args = strchr(args, ',');
+ if (!args)
+ return NULL;
+ args++;
+ }
+
+ /* filename may be empty; e.g. enet:192.168.1.1,,192.168.1.2 */
+ if (*args == ',') {
+ DEBUG_F("null filename\n");
+ return NULL;
+ }
+
+ /* Now see whether there are more args following the filename. */
+ tmp = strchr(args, ',');
+ if (!tmp)
+ len = strlen(args) + 1;
+ else
+ len = tmp - args + 1;
+
+ filename = malloc(len);
+ if (!filename)
+ return NULL;
+
+ strncpy(filename, args, len);
+ filename[len - 1] = '\0';
+
+ DEBUG_F("filename = %s\n", filename);
+ return filename;
+}
+
+static char *netdev_path_to_dev(const char *path)
+{
+ char *dev, *tmp;
+ size_t len;
+
+ DEBUG_F("path = %s\n", path);
+
+ if (!path)
+ return NULL;
+
+ tmp = strchr(path, ':');
+ if (!tmp)
+ return strdup(path);
+ tmp++;
+
+ len = tmp - path + 1;
+
+ dev = malloc(len);
+ if (dev) {
+ strncpy(dev, path, len);
+ dev[len - 1] = '\0';
+ }
+ return dev;
+}
+
/* This function follows the device path in the devtree and separates
the device name, partition number, and other datas (mostly file name)
the string passed in parameters is changed since 0 are put in place
@@ -71,6 +177,7 @@
char *ptr;
char *ipath = NULL;
char *defdev = NULL;
+ int device_kind;
result->dev = NULL;
result->part = -1;
@@ -78,23 +185,25 @@
if (!imagepath)
return 0;
- else
- ipath = strdup(imagepath);
+ else if (!(ipath = strdup(imagepath)))
+ return 0;
- if (defdevice)
+ if (defdevice) {
defdev = strdup(defdevice);
-
- if (defdev) {
- if (!strstr(defdev, "ethernet") && !strstr(defdev, "enet")) {
- if ((ptr = strrchr(defdev, ':')) != NULL)
- *ptr = 0; /* remove trailing : from defdevice if necessary */
- }
+
+ device_kind = prom_get_devtype(defdev);
+ } else
+ device_kind = prom_get_devtype(ipath);
+
+ if (device_kind != FILE_DEVICE_NET && strchr(defdev, ':') != NULL) {
+ if ((ptr = strrchr(defdev, ':')) != NULL)
+ *ptr = 0; /* remove trailing : from defdevice if necessary */
}
- /* 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) {
+ /* This will not properly handle an obp-tftp argument list
+ * with elements after the filename; that is handled below.
+ */
+ if (device_kind != FILE_DEVICE_NET && strchr(ipath, ':') != NULL) {
if ((ptr = strrchr(ipath, ',')) != NULL) {
char *colon = strrchr(ipath, ':');
/* If a ':' occurs *after* a ',', then we assume that there is
@@ -107,13 +216,14 @@
}
}
- if (strstr(ipath, "ethernet") || strstr(ipath, "enet")) {
- if ((ptr = strstr(ipath, "bootp")) != NULL) {
- /* `n' key booting boots enet:bootp */
- *ptr = 0;
- result->dev = strdup(ipath);
- } else
- result->dev = strdup(ipath);
+ if (device_kind == FILE_DEVICE_NET) {
+ if (strchr(ipath, ':'))
+ result->file = netdev_path_to_filename(ipath);
+ else
+ result->file = strdup(ipath);
+
+ if (!defdev)
+ result->dev = netdev_path_to_dev(ipath);
} else if ((ptr = strchr(ipath, ':')) != NULL) {
*ptr = 0;
result->dev = strdup(ipath);
@@ -124,6 +234,7 @@
} else if (strlen(ipath)) {
result->file = strdup(ipath);
} else {
+ free(defdev);
return 0;
}
More information about the pld-cvs-commit
mailing list