Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F147865207
D25134.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D25134.diff
View Options
Index: stand/common/install.c
===================================================================
--- stand/common/install.c
+++ stand/common/install.c
@@ -184,7 +184,8 @@
/*
* usage: install URL
- * where: URL = (tftp|file)://[host]/<package>
+ * where: URL = tftp://[host]/<package>
+ * or file://[devname[:fstype]]/<package>
*/
static int
install(char *pkgname)
@@ -192,8 +193,9 @@
static char buf[256];
struct fs_ops *proto;
struct preloaded_file *fp;
- char *s, *currdev;
- const char *devname;
+ char *e, *s, *currdev;
+ char *devname;
+ size_t devnamelen;
int error, fd, i, local;
s = strstr(pkgname, "://");
@@ -201,34 +203,74 @@
goto invalid_url;
i = s - pkgname;
+ s += 3;
+ if (*s == '\0')
+ goto invalid_url;
+
+ proto = NULL;
+ devname = NULL;
+ devnamelen = 0;
+
if (i == 4 && !strncasecmp(pkgname, "tftp", i)) {
devname = "net0";
+ devnamelen = 4;
proto = &tftp_fsops;
local = 0;
} else if (i == 4 && !strncasecmp(pkgname, "file", i)) {
currdev = getenv("currdev");
- if (currdev != NULL && strcmp(currdev, "pxe0:") == 0) {
- devname = "pxe0";
- proto = NULL;
-#ifdef HOSTPROG
- } else if (currdev != NULL && strcmp(currdev, "host0:") == 0) {
- extern struct fs_ops host_fsops;
+ local = 1;
- devname = "host0";
- proto = &host_fsops;
+ if (*s == '/') { /* file:/// */
+ if (devname == NULL)
+ devname = currdev;
+ if (devname == NULL)
+ devname = "disk1";
+ } else { /* file://devname[:fstype]/ */
+ devname = s;
+ e = strchr(devname, '/');
+ if (!e)
+ goto invalid_url;
+ devnamelen = e - devname;
+ s = e; /* consume devname */
+ }
+ if ((e = strchr(devname, ':')) != NULL) {
+ /* could be :fstype */
+ devnamelen = e - devname;
+ switch (e[1]) {
+ case '\0': /* just currdev */
+ break;
+ case 'd':
+ proto = &dosfs_fsops;
+ break;
+#ifdef HOSTPROG
+ case 'h':
+ {
+ extern struct fs_ops host_fsops;
+
+ proto = &host_fsops;
+ }
+ break;
#endif
- } else {
- devname = "disk1";
+ case 'u':
+ proto = &ufs_fsops;
+ break;
+ }
+ }
+ if (proto == NULL && strncmp(devname, "disk", 4) == 0) {
proto = &dosfs_fsops;
}
- local = 1;
- } else
- goto invalid_url;
+ }
- s += 3;
- if (*s == '\0')
+ if (devname == NULL)
goto invalid_url;
+ if (devnamelen == 0) {
+ /* default is currdev which ends with ':' */
+ devnamelen = strlen(devname);
+ if (devname[devnamelen - 1] == ':')
+ devnamelen--;
+ }
+
if (*s != '/' ) {
if (local)
goto invalid_url;
@@ -252,11 +294,12 @@
} else
pkgname = s;
- if (strlen(devname) + strlen(pkgname) + 2 > sizeof(buf)) {
+ i = snprintf(buf, sizeof(buf), "%.*s:%s",
+ (int) devnamelen, devname, pkgname);
+ if (i >= (int) sizeof(buf)) {
command_errmsg = "package name too long";
return (CMD_ERROR);
}
- sprintf(buf, "%s:%s", devname, pkgname);
setenv("install_package", buf, 1);
error = pkgfs_init(buf, proto);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Mar 15, 7:08 AM (10 h, 24 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29706511
Default Alt Text
D25134.diff (2 KB)
Attached To
Mode
D25134: loader: install allow for more complete device spec in url
Attached
Detach File
Event Timeline
Log In to Comment