Add another field to the filename specified for create and add operations
to specify the intended pathname for the blob.

Signed-off-by: Jordan Crouse <jordan.crouse@amd.com>
Index: LinuxBIOSv3/util/lar/stream.c
===================================================================
--- LinuxBIOSv3.orig/util/lar/stream.c	2007-07-23 09:47:04.000000000 -0600
+++ LinuxBIOSv3/util/lar/stream.c	2007-07-23 09:51:39.000000000 -0600
@@ -543,6 +543,8 @@
 int lar_add_file(struct lar *lar, const char *name)
 {
 	char *filename, *ptr, *temp;
+	char *pathname;
+
 	enum compalgo thisalgo;
 	struct lar_header *header;
 	u32 offset;
@@ -567,6 +569,20 @@
 	if (filename[0] == '.' && filename[1] == '/')
 		filename += 2;
 
+	pathname = strchr(filename, ':');
+
+	if (pathname != NULL) {
+	  *pathname = '\0';
+	  pathname++;
+
+	  if (!strlen(pathname)) {
+	    err("Invalid pathname specified.\n");
+	    return -1;
+	  }
+	}
+	else
+		pathname = filename;
+
 	/* Open the file */
 	fd = open(filename, O_RDONLY);
 
@@ -614,7 +630,7 @@
 	munmap(ptr, s.st_size);
 	close(fd);
 
-	pathlen = strlen(filename) + 1 > MAX_PATHLEN ? MAX_PATHLEN : strlen(filename) + 1;
+	pathlen = strlen(pathname) + 1 > MAX_PATHLEN ? MAX_PATHLEN : strlen(pathname) + 1;
 
 	/* Figure out how big our header will be */
 	hlen = sizeof(struct lar_header) + pathlen;
@@ -641,7 +657,7 @@
 
 	/* Copy the path name */
 	strncpy((char *) (lar->map + offset + sizeof(struct lar_header)),
-		filename, pathlen - 1);
+		pathname, pathlen - 1);
 
 	/* Copy in the data */
 	memcpy(lar->map + (offset + hlen), temp, complen);
Index: LinuxBIOSv3/util/lar/lib.c
===================================================================
--- LinuxBIOSv3.orig/util/lar/lib.c	2007-07-23 09:51:11.000000000 -0600
+++ LinuxBIOSv3/util/lar/lib.c	2007-07-23 09:51:39.000000000 -0600
@@ -195,16 +195,29 @@
 {
 	struct stat filestat;
 	int ret = -1;
-	const char *realname;
+	char *realname;
+	char *c;
 
-	realname = name;
 	if (strstr(name, "nocompress:") == name) {
-		realname = name + 11;
+		name += 11;
 	}
 
+	realname = strdup(name);
+
+	if (realname == NULL) {
+	  fprintf(stderr, "Out of memory.\n");
+	  exit(1);
+	}
+
+	c = strchr(realname, ':');
+
+	if (c != NULL)
+	  *c = '\0';
+
 	/* printf("... add_files %s\n", name); */
 	if (stat(realname, &filestat) == -1) {
 		fprintf(stderr, "Error getting file attributes of %s\n", name);
+		free(realname);
 		return -1;
 	}
 
@@ -249,6 +262,7 @@
 		ret = 0;
 	}
 
+	free(realname);
 	return ret;
 }
 

--
Jordan Crouse
Systems Software Development Engineer 
Advanced Micro Devices, Inc.




