[Frugalware-git] subzero: frugalwareutils-0.9.7-3-x86_64 * delete old patch * add grub2 patch from git * add grub2 to rodepends

James Buren ryuo at frugalware.org
Sat Feb 25 21:17:48 CET 2012


Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=subzero.git;a=commitdiff;h=f1ef73184fa275f0218e5a335f1f2f12fb507507

commit f1ef73184fa275f0218e5a335f1f2f12fb507507
Author: James Buren <ryuo at frugalware.org>
Date:   Sat Feb 25 14:18:24 2012 -0600

frugalwareutils-0.9.7-3-x86_64
* delete old patch
* add grub2 patch from git
* add grub2 to rodepends

diff --git a/source/base/frugalwareutils/FrugalBuild b/source/base/frugalwareutils/FrugalBuild
index 2806c29..31939db 100644
--- a/source/base/frugalwareutils/FrugalBuild
+++ b/source/base/frugalwareutils/FrugalBuild
@@ -9,7 +9,7 @@ USE_APIDOCS=${USE_APIDOCS:-"y"}
pkgname=frugalwareutils
pkgver=0.9.7
Fuse $USE_DEVEL && pkgver=0.8.7.6.g3d85830
-pkgrel=2
+pkgrel=3
pkgdesc="Frugalware configuration utilities."
url="http://ftp.frugalware.org/pub/other/frugalwareutils"
depends=('glib2>=2.16.4-2' 'ncurses>=5.6-4' 'parted>=3.0' \
@@ -23,7 +23,7 @@ replaces=('kxgenerator')
archs=('i686' 'x86_64' 'ppc' 'arm')
up2date="lynx -dump $url|Flasttar"
if ! Fuse $USE_DEVEL; then
-	source=($url/$pkgname-$pkgver.tar.gz fwlive_patch.diff)
+	source=($url/$pkgname-$pkgver.tar.gz $pkgname-grub2.patch)
signatures=(${source[0]}.asc '')
else
_F_scm_type="git"
@@ -34,7 +34,7 @@ options=('scriptlet')
Fconfopts="$Fconfopts --sbindir=/sbin --libdir=/lib --libexecdir=/usr/libexec"

if [ "$CARCH" == "i686" -o "$CARCH" == "x86_64" ]; then
-        rodepends=("${rodepends[@]}" 'kernel-initrd')
+        rodepends=("${rodepends[@]}" 'kernel-initrd' 'grub2')
fi

build()
diff --git a/source/base/frugalwareutils/frugalwareutils-grub2.patch b/source/base/frugalwareutils/frugalwareutils-grub2.patch
new file mode 100644
index 0000000..dcc03cd
--- /dev/null
+++ b/source/base/frugalwareutils/frugalwareutils-grub2.patch
@@ -0,0 +1,1016 @@
+diff --git a/grubconfig/grubconfig.c b/grubconfig/grubconfig.c
+index 0622bfe..392c8d3 100644
+--- a/grubconfig/grubconfig.c
++++ b/grubconfig/grubconfig.c
+@@ -1,8 +1,8 @@
+ /*
+  *  grubconfig.c for frugalwareutils
+- *
++ *
+  *  Copyright (c) 2003-2006 by Miklos Vajna <vmiklos at frugalware.org>
+- *
++ *
+  *  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
+@@ -15,7 +15,7 @@
+  *
+  *  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,
++ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+  *  USA.
+  */
+
+@@ -32,45 +32,37 @@
+ #include <unistd.h>
+ #include <libintl.h>
+
+-int ask_mode()
++static
++enum fwgrub_install_mode ask_mode()
+ {
+-	char *modes[] =
++	char *modes[] =
+ 	{
+ 		_("MBR"), _("Install to Master Boot Record"),
+-		_("Floppy"), _("Install to a formatted floppy in /dev/fd0"),
+-		// see see http://lists.gnu.org/archive/html/bug-grub/2003-11/msg00085.html
+-		_("Root"), _("Install to superblock (do NOT use with XFS)"),
+ 		_("Skip"), _("Skip the installation of GRUB.")
+ 	};
+ 	char *ptr;
+-	int ret=0;
++	enum fwgrub_install_mode ret=-1;
+
+ 	ptr = fwdialog_menu(_("Installing GRUB bootloader"),
+ 		_("GRUB can be installed to a variety of places:\n\n"
+ 		"\t1. The Master Boot Record of your first hard drive.\n"
+-		"\t2. A formatted floppy disk.\n"
+-		"\t3. The superblock of your root Linux partition.\n\n"
+-		"Option 3 requires setting the partition bootable with (c)fdisk\n"
+-		"Hint: Choose option 3 if you already have a boot manager installed.\n"
+-		"Which option would you like?"), 0, 0, 0, 4, modes);
++		"Which option would you like?"), 0, 0, 0, 2, modes);
+ 	if(!strcmp(ptr, _("MBR")))
+-		ret=0;
+-	if(!strcmp(ptr, _("Floppy")))
+-		ret=1;
+-	if(!strcmp(ptr, _("Root")))
+-		ret=2;
+-	if(!strcmp(ptr, _("Skip")))
+-		ret=3;
++		ret=FWGRUB_INSTALL_MBR;
++	else if(!strcmp(ptr, _("Skip")))
++		ret=-1;
+ 	free(ptr);
+ 	return(ret);
+ }
+
++static
+ int run(int argc, char **argv)
+ {
+ 	FILE *input = stdin, *fp;
+ 	dialog_state.output = stderr;
+-	int mode, needrelease;
++	int needrelease;
+ 	struct stat buf;
++	enum fwgrub_install_mode mode;
+
+ 	if(argc > 1)
+ 	{
+@@ -91,20 +83,12 @@ int run(int argc, char **argv)
+ 	fwdialog_backtitle(_("GRUB bootloader"));
+
+ 	mode = ask_mode();
+-	if(mode!=3)
++	if(mode!=-1)
+ 	{
+ 		dialog_msgbox(_("Please wait"), _("Attempting to install the GRUB bootloader..."), 0, 0, 0);
+ 		needrelease = fwutil_init();
+ 		fwgrub_install(mode);
+-		// backup the old config if there is any
+-		if(!stat("/boot/grub/menu.lst", &buf))
+-			rename("/boot/grub/menu.lst", "/boot/grub/menu.lst.old");
+-		fp = fopen("/boot/grub/menu.lst", "w");
+-		if(fp)
+-		{
+-			fwgrub_create_menu(fp);
+-			fclose(fp);
+-		}
++		fwgrub_make_config();
+ 		if(needrelease)
+ 			fwutil_release();
+ 	}
+diff --git a/libfwgrubconfig/Makefile b/libfwgrubconfig/Makefile
+index f2e406a..f31b117 100644
+--- a/libfwgrubconfig/Makefile
++++ b/libfwgrubconfig/Makefile
+@@ -18,12 +18,6 @@
+
+ -include ../config.mak
+ CFLAGS = $(LIB_CFLAGS)
+-CFLAGS += $(shell pkg-config --cflags glib-2.0)
+-LDFLAGS += $(shell pkg-config --libs glib-2.0)
+-CFLAGS += $(shell pkg-config --cflags blkid)
+-LDFLAGS += $(shell pkg-config --libs blkid)
+-
+-LDFLAGS += -lparted
+
+ # fwutil
+ CFLAGS += -I../libfwutil
+diff --git a/libfwgrubconfig/libfwgrubconfig.c b/libfwgrubconfig/libfwgrubconfig.c
+index 5df62b8..25e08e5 100644
+--- a/libfwgrubconfig/libfwgrubconfig.c
++++ b/libfwgrubconfig/libfwgrubconfig.c
+@@ -1,8 +1,8 @@
+ /*
+  *  libfwgrubconfig.c for frugalwareutils
+- *
++ *
+  *  Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011 by Miklos Vajna <vmiklos at frugalware.org>
+- *
++ *
+  *  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
+@@ -15,760 +15,127 @@
+  *
+  *  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,
++ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+  *  USA.
+  */
+
++#include <stdlib.h>
+ #include <stdio.h>
+ #include <string.h>
+-#include <sys/types.h>
+-#include <dirent.h>
+-#include <sys/stat.h>
++#include <regex.h>
+ #include <unistd.h>
++#include <limits.h>
++#include <sys/stat.h>
++#include <sys/wait.h>
+ #include <errno.h>
+-#include <unistd.h>
+-#include <fcntl.h>
+-#include <sys/ioctl.h>
+-#include <mntent.h>
+-#include <sys/utsname.h>
+-#include <ctype.h>
+-#include <stdlib.h>
+-#include <libfwutil.h>
+-#include <glib.h>
+-#include <blkid.h>
+-
+ #include "libfwgrubconfig.h"
+
+-typedef struct mdu_version_s {
+-	int major;
+-	int minor;
+-	int patchlevel;
+-} mdu_version_t;
+-#define MD_MAJOR 9
+-#define RAID_VERSION            _IOR (MD_MAJOR, 0x10, mdu_version_t)
+-#define BLKGETSIZE64 _IOR(0x12,114,size_t)
++#define SPACE         " \t\r\n\v\f"
++#define DIGIT         "0123456789"
+ #define FWGRUB_LOGDEV "/dev/tty4"
+
+-struct fwgrub_entry_t {
+-	FILE *fp;
+-	char *title;
+-	char *initrd;
+-	char *grubbootdev;
+-	char *bootstr;
+-	char *kernel;
+-	char *rootdev;
+-	char *opts;
+-	char *type;
+-};
+-
+-
+-/** @defgroup libfwgrubconfig Frugalware GRUB Configuration library
+- * @brief Functions to make GRUB configuration easier
++/** @defgroup libfwgrubconfig Frugalware GRUB configuration and installation library
++ * @brief Functions to make GRUB configuration and installation easier
+  * @{
+  */
+
+-/* find_dev_recursive() and find_dev() is based on Linus's original rdev */
+-static int find_dev_recursive(char *dirnamebuf, int number)
+-{
+-	DIR *dp;
+-	struct dirent *dir;
+-	struct stat s;
+-	int dirnamelen = 0;
+-
+-	if ((dp = opendir(dirnamebuf)) == NULL)
+-		return(0);
+-	dirnamelen = strlen(dirnamebuf);
+-	while ((dir = readdir(dp)) != NULL)
+-	{
+-		if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
+-			continue;
+-		if (dirnamelen + 1 + strlen(dir->d_name) > PATH_MAX)
+-			continue;
+-		dirnamebuf[dirnamelen] = '/';
+-		strcpy(dirnamebuf+dirnamelen+1, dir->d_name);
+-		if (lstat(dirnamebuf, &s) < 0)
+-			continue;
+-		if ((s.st_mode & S_IFMT) == S_IFBLK && s.st_rdev == number)
+-			return(1);
+-		if ((s.st_mode & S_IFMT) == S_IFDIR &&
+-				find_dev_recursive(dirnamebuf, number))
+-			return(1);
+-	}
+-	dirnamebuf[dirnamelen] = 0;
+-	closedir(dp);
+-	return(0);
+-}
+-
+-static char *find_dev(int n)
++static
++char *guess_mbr_device(void)
+ {
+-	char path[PATH_MAX+1];
+-	if (!n)
+-		return(NULL);
+-	strcpy(path, "/dev");
+-	if(find_dev_recursive(path, n))
+-		return(strdup(path));
+-	return(NULL);
+-}
++	FILE *f;
++	char line[LINE_MAX], *p;
++	int i, j;
++	regex_t re;
++	static char root[PATH_MAX];
+
+-static char *find_rootdev()
+-{
+-	struct stat buf;
++	f = fopen("/proc/partitions","rb");
+
+-	if(!stat("/",&buf))
+-		return(find_dev(buf.st_dev));
+-	return(NULL);
+-}
+-
+-/* Copyright (C) 2001-2006 Neil Brown <neilb at suse.de> */
+-static int md_get_version(int fd)
+-{
+-	struct stat stb;
+-	mdu_version_t vers;
+-
+-	if (fstat(fd, &stb)<0)
+-		return(1);
+-	if ((S_IFMT&stb.st_mode) != S_IFBLK)
+-		return(1);
+-	if (ioctl(fd, RAID_VERSION, &vers) == 0)
+-		return(0);
+-	return(1);
+-}
++	if(!f)
++		return 0;
+
+-static int is_raid1_device(char *dev)
+-{
+-	int fd;
+-
+-	fd = open(dev, O_RDWR, 0);
+-	if (md_get_version(fd))
+-		return(0);
+-	else
+-		return(1);
+-}
++	if(regcomp(&re,"^[shv]d[a-z]$",REG_EXTENDED | REG_NOSUB | REG_NEWLINE))
++	{
++		fclose(f);
+
+-static GList *find_real_devs(char *dev)
+-{
+-	GList *ret=NULL;
+-	FILE *fp;
+-	char line[PATH_MAX];
+-	char *str, *ptr, *rdev;
+-
+-	// drop "/dev/"
+-	dev += 5;
++		return 0;
++	}
+
+-	fp = fopen("/proc/mdstat", "r");
+-	if(!fp)
+-		return(NULL);
++	for( i = 1, *root = 0 ; fgets(line,sizeof line,f) ; ++i )
++	{
++		if(i < 3)
++			continue;
+
+-	while(fgets(line, PATH_MAX, fp))
+-		if(!strncmp(line, dev, strlen(dev)))
+-			break;
++		p = line + strspn(line,SPACE);
+
+-	str = line;
+-	while((str = strstr(str, "[")))
+-	{
+-		rdev = str;
+-		while(*rdev!=' ')
+-			rdev--;
+-		rdev=strdup(++rdev);
+-		if((ptr = strstr(rdev, "[")))
+-			*ptr='\0';
+-		ret = g_list_append(ret, rdev);
+-		str++;
+-	}
+-	fclose(fp);
+-	return(ret);
+-}
++		for( j = 0 ; j < 3 ; ++j )
++		{
++			p += strspn(p,DIGIT);
+
+-// mode - 0: partition, 1: disk
+-static char *grub_convert(char *dev, int mode)
+-{
+-	char *disk, *ptr, *grubdisk;
+-	char line[PATH_MAX];
+-	int partnum=0;
+-	FILE *fp;
++			p += strspn(p,SPACE);
++		}
+
+-	// disk
+-	disk = strdup(dev);
+-	ptr = disk;
+-	while(*++ptr)
+-		if(isdigit(*ptr))
++		if(!regexec(&re,p,0,0,0))
+ 		{
+-			*ptr='\0';
++			strcpy(root,"/dev/");
++			strcpy(root,p);
++			p = strchr(root,'\n');
++			if(p)
++				*p = 0;
+ 			break;
+ 		}
+-
+-	// partnum
+-	if(!mode)
+-	{
+-		ptr = dev;
+-		while(*++ptr)
+-			if(isdigit(*ptr))
+-				break;
+-		partnum = atoi(ptr);
+ 	}
+
+-	// grubdisk
+-	fp = fopen("/boot/grub/device.map", "r");
+-	if(!fp)
+-		return(NULL);
+-
+-	while(fgets(line, PATH_MAX, fp))
+-		if(strstr(line, disk))
+-			break;
+-	fclose(fp);
+-	grubdisk = strdup(line+1);
+-	ptr = grubdisk;
+-	while(*++ptr)
+-		if(*ptr==')')
+-			break;
+-	*ptr='\0';
+-
+-	if(partnum)
+-		ptr = g_strdup_printf("(%s,%d)", grubdisk, --partnum);
+-	else
+-		ptr = g_strdup_printf("(%s)", grubdisk);
+-	free(disk);
+-	free(grubdisk);
+-	return(ptr);
+-}
+-
+-static char *get_mbr_dev()
+-{
+-	FILE *fp;
+-	char line[PATH_MAX], *str=NULL, *ptr;
+-	int i=0;
+-
+-	fp = fopen("/proc/partitions", "r");
+-	if(!fp)
+-		return(NULL);
+-	while(fgets(line, PATH_MAX, fp))
+-	{
+-		if(i++ < 2 || strstr(line, "ram"))
+-			continue;
+-		else
+-			break;
+-	}
+-	fclose(fp);
+-	ptr=line;
+-	while(*++ptr)
+-		if(*ptr==' ')
+-			str = ptr+1;
+-	// drop the \n from the end
+-	if(!str)
+-		return(NULL);
+-	*(str+strlen(str)-1)='\0';
+-	return(g_strdup_printf("/dev/%s", str));
+-}
++	fclose(f);
+
+-static char *get_swap_dev()
+-{
+-	char line[PATH_MAX], *ptr;
+-	int i = 0;
+-	FILE *fp = fopen("/proc/swaps", "r");
++	regfree(&re);
+
+-	if (!fp)
+-		return NULL;
+-	while (fgets(line, PATH_MAX, fp))
+-	{
+-		if (!i++)
+-			continue;
+-		else
+-			break;
+-	}
+-	if (i == 1)
+-		return NULL;
+-	fclose(fp);
+-	ptr = strchr(line, ' ');
+-	if (ptr)
+-		*ptr = '\0';
+-	return g_strdup(line);
++	return (*root) ? root : 0;
+ }
+
+-
+ /** Installs grub to a given target
+- * @param mode 0: mbr, 1: floppy, 2: root
++ * @param mode FWGRUB_INSTALL_MBR, FWGRUB_INSTALL_EFI
+  * @return 0 on succcess, 1 on error
+  */
+-int fwgrub_install(int mode)
+-{
+-	char *rootdev=find_rootdev();
+-	FILE *pp;
+-	int i, ret=0;
+-
+-	if(is_raid1_device(rootdev))
+-	{
+-		// manual installation
+-		DIR *dir;
+-		struct dirent *ent;
+-		char src[PATH_MAX], dest[PATH_MAX];
+-
+-		dir = opendir("/usr/lib/grub/i386-frugalware");
+-		if (!dir)
+-			return(1);
+-		while ((ent = readdir(dir)) != NULL)
+-		{
+-			if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))
+-				continue;
+-			snprintf(src, PATH_MAX, "/usr/lib/grub/i386-frugalware/%s", ent->d_name);
+-			snprintf(dest, PATH_MAX, "/boot/grub/%s", ent->d_name);
+-			fwutil_cp(src, dest);
+-		}
+-		pp = popen("grub --batch --device-map=/boot/grub/device.map %s >"
+-			FWGRUB_LOGDEV " 2>&1", "w");
+-		if(!pp)
+-			return(1);
+-		fprintf(pp, "quit\n");
+-		pclose(pp);
+-		if(mode==0)
+-		{
+-			// mbr
+-			char *ptr = NULL;
+-			GList *devs = find_real_devs(rootdev);
+-			for(i=0;i<g_list_length(devs);i++)
+-			{
+-				char *dev = g_list_nth_data(devs, i);
+-				pp = popen("grub --batch %s >" FWGRUB_LOGDEV
+-					" 2>&1", "w");
+-				if(!pp)
+-					return(1);
+-				ptr = grub_convert(dev, 0);
+-				fprintf(pp, "root %s\n", ptr);
+-				free(ptr);
+-				ptr = grub_convert(dev, 1);
+-				fprintf(pp, "setup %s\n", ptr);
+-				free(ptr);
+-				pclose(pp);
+-			}
+-		}
+-		/* else if(mode==1)
+-		 * TODO: floppy */
+-		else if(mode==2)
+-		{
+-			// root
+-			char *ptr = NULL;
+-			GList *devs = find_real_devs(rootdev);
+-			for(i=0;i<g_list_length(devs);i++)
+-			{
+-				char *dev = g_list_nth_data(devs, i);
+-				pp = popen("grub --batch %s >" FWGRUB_LOGDEV
+-					" 2>&1", "w");
+-				if(!pp)
+-					return(1);
+-				ptr = grub_convert(dev, 0);
+-				fprintf(pp, "root %s\n", ptr);
+-				free(ptr);
+-				ptr = grub_convert(dev, 0);
+-				fprintf(pp, "setup %s\n", ptr);
+-				free(ptr);
+-				pclose(pp);
+-			}
+-		}
+-	}
+-	else
+-	{
+-		char *dev=NULL, *ptr;
+-		if(mode==0)
+-			dev=get_mbr_dev();
+-		if(mode==1)
+-			dev=strdup("/dev/fd0");
+-		if(mode==2)
+-			dev=rootdev;
+-		if(mode!=1)
+-		{
+-			if (strncmp(dev, "/dev/vd", 7))
+-				ptr = g_strdup_printf("grub-install --no-floppy --recheck %s >"
+-					FWGRUB_LOGDEV " 2>&1", dev);
+-			else
+-			{
+-				// we need to generate device.map
+-				// manually for virtio
+-				FILE *fp = fopen("/boot/grub/device.map", "w");
+-				fprintf(fp, "(hd0) %s\n", dev);
+-				fclose(fp);
+-				ptr = g_strdup_printf("grub-install --no-floppy %s >"
+-					FWGRUB_LOGDEV " 2>&1", dev);
+-			}
+-		}
+-		else
+-			ptr = g_strdup_printf("grub-install %s >"
+-				FWGRUB_LOGDEV " 2>&1", dev);
+-		if(dev!=rootdev)
+-			free(dev);
+-		if((ret=system(ptr)))
+-			// this is needed for reiser, somehow the install is ok for the second time
+-			ret = system(ptr);
+-		free(ptr);
+-	}
+-	free(rootdev);
+-	return(ret);
+-}
+
+-/* based on coreutils/df.c, Copyright (C) 91, 1995-2004 Free Software Foundation, Inc. */
+-static char *find_mount_point(char *dir)
++int fwgrub_install(enum fwgrub_install_mode mode)
+ {
+-	char cwd[PATH_MAX] = "";
+-	char mp[PATH_MAX] = "";
+-	struct stat buf, last;
++	char cmd[_POSIX_ARG_MAX], *mbr;
++	struct stat st;
+
+-	getcwd(cwd, PATH_MAX);
+-	stat(dir, &buf);
+-	last=buf;
+-	chdir(dir);
++	/* First, define the common parts of the install command. */
++	strcpy(cmd,"grub-install --recheck --no-floppy --boot-directory=/boot ");
+
+-	/* Now walk up DIR's parents until we find another filesystem or /,
+-	 * chdiring as we go. LAST holds stat information for the last place
+-	 * we visited.  */
+-	while(1)
++	/* Now, define additional arguments based on installation mode. */
++	switch(mode)
+ 	{
+-		struct stat st;
+-		stat("..", &st);
+-		if(st.st_dev != last.st_dev || st.st_ino == last.st_ino)
+-			/* cwd is the mount point.  */
++		case FWGRUB_INSTALL_MBR:
++			mbr = guess_mbr_device();
++			if(!mbr)
++				return 1;
++			strcat(cmd,mbr);
+ 			break;
+-		chdir("..");
+-		last=st;
+-	}
+-	getcwd(mp, PATH_MAX);
+-	chdir(cwd);
+-	return(strdup(mp));
+-}
+-
+-static char *mount_dev(char *path)
+-{
+-	struct mntent *mnt;
+-	char *table = MOUNTED;
+-	FILE *fp;
+-
+-	fp = setmntent (table, "r");
+-	if(fp)
+-	{
+-		while ((mnt = getmntent (fp)))
+-			if(!strcmp(mnt->mnt_dir, path) && ! (!strcmp(mnt->mnt_fsname, "rootfs") || !strcmp(mnt->mnt_fsname, "/dev/root")))
+-				break;
+-		endmntent(fp);
+-		if(mnt)
+-			return(strdup(mnt->mnt_fsname));
+-	}
+-	// not found? then it must be a pre-initrd root device, look it up from /proc/cmdline
+-	fp = fopen("/proc/cmdline", "r");
+-	char line[PATH_MAX];
+-	if (fp)
+-		fgets(line, 512, fp);
+-	// skip everything before root= and after a space
+-	char *ptr = strstr(line, "root=") + 5;
+-	if (strchr(ptr, ' '))
+-		*(strchr(ptr, ' ')) = '\0';
+-	fclose(fp);
+-	return(strdup(ptr));
+-}
+-
+-static char* get_uuid(char *device)
+-{
+-	char path[PATH_MAX];
+-	int fd;
+-	blkid_probe pr = NULL;
+-	uint64_t size;
+-	const char *uuid;
+-	char *ret;
+-
+-	if(!device || !strlen(device))
+-		return NULL;
+-
+-	fd = open(device, O_RDONLY);
+
+-	if (fd < 0)
+-		return NULL;
+-
+-	pr = blkid_new_probe();
+-	blkid_probe_set_request (pr, BLKID_PROBREQ_UUID);
+-	ioctl(fd, BLKGETSIZE64, &size);
+-	blkid_probe_set_device(pr, fd, 0, size);
+-	blkid_do_safeprobe(pr);
+-	blkid_probe_lookup_value(pr, "UUID", &uuid, NULL);
+-	snprintf(path, PATH_MAX, "/dev/disk/by-uuid/%s", uuid);
+-	ret = strdup(path);
+-	blkid_free_probe(pr);
+-	close(fd);
+-	return ret;
+-}
+-
+-static int write_entry(struct fwgrub_entry_t *entry)
+-{
+-	char *ptr;
+-
+-	if(!entry || !entry->fp)
+-		return(1);
+-	fprintf(entry->fp, "title %s\n", entry->title);
+-	fflush(entry->fp); // debug help
+-	if(!entry->type || !strcmp(entry->type, "linux"))
+-	{
+-		if(entry->opts)
+-		{
+-			if(entry->rootdev && strlen(entry->rootdev))
+-			{
+-				char *uuid = get_uuid(entry->rootdev);
+-				fprintf(entry->fp, "\tkernel %s%s%s root=%s %s\n",
+-					entry->grubbootdev, entry->bootstr, entry->kernel, uuid, entry->opts);
+-				free(uuid);
+-			}
+-			else
+-				// probably rootdev is already included in ->opts
+-				fprintf(entry->fp, "\tkernel %s%s%s %s\n",
+-					entry->grubbootdev, entry->bootstr, entry->kernel, entry->opts);
+-		}
+-		else
+-		{
+-			fprintf(entry->fp, "\tkernel %s%s%s\n",
+-				entry->grubbootdev, entry->bootstr, entry->kernel);
+-		}
+-		if(entry->initrd)
+-			fprintf(entry->fp,"\tinitrd %s%s%s\n",
+-				entry->grubbootdev, entry->bootstr, entry->initrd);
+-		putc('\n',entry->fp);
+-	}
+-	else if(!strcmp(entry->type, "chain"))
+-	{
+-		ptr = grub_convert(entry->rootdev, 0);
+-		fprintf(entry->fp, "\trootnoverify %s\n", ptr);
+-		free(ptr);
+-		fprintf(entry->fp, "\tchainloader +1\n\n");
++		case FWGRUB_INSTALL_EFI:
++			strcat(cmd,"--root-directory=/boot/efi --bootloader-id=frugalware");
++			if(!stat("/boot/efi",&st) && !S_ISDIR(st.st_mode))
++				return 1;
++			else if(mkdir("/boot/efi",0755))
++				return 1;
++			break;
+ 	}
+-	// TODO: else if(!strcmp(entry->type, "hurd"))
+-	fflush(entry->fp);
+-	return(0);
+-}
+-
+-static char *gen_title()
+-{
+-	struct utsname name;
+-	FILE *fp;
+-	char line[PATH_MAX];
+-
+-	fp = fopen("/etc/frugalware-release", "r");
+-	if(!fp)
+-		return(NULL);
+-	if(!fgets(line, PATH_MAX, fp))
+-		return(NULL);
+-	line[strlen(line)-1]='\0';
+-	uname(&name);
+-	return(g_strdup_printf("%s - %s", line, name.release));
+-}
+-
+-static void entry_free(struct fwgrub_entry_t *entry)
+-{
+-	if(entry->title)
+-		free(entry->title);
+-	if(entry->grubbootdev)
+-		free(entry->grubbootdev);
+-	if(entry->bootstr)
+-		free(entry->bootstr);
+-	if(entry->kernel)
+-		free(entry->kernel);
+-	if(entry->initrd)
+-		free(entry->initrd);
+-	if(entry->rootdev)
+-		free(entry->rootdev);
+-	if(entry->opts)
+-		free(entry->opts);
+-}
+
+-static int os_prober(FILE *fp)
+-{
+-	struct stat buf;
+-	FILE *pp;
+-	char line[PATH_MAX], *ptr, *bootdev;
+-	struct fwgrub_entry_t *entry;
+-	GList *entries=NULL;
+-	int i;
+-
+-	if(stat("/usr/bin/os-prober", &buf))
+-		return(1);
+-
+-	pp = popen("os-prober 2>/dev/null", "r");
+-	if(!pp)
+-		return(1);
+-	while(fgets(line, PATH_MAX, pp))
+-	{
+-		entry = (struct fwgrub_entry_t*)malloc(sizeof(struct fwgrub_entry_t));
+-		if(!entry)
+-			return(1);
+-		entry->fp=fp;
+-		// rootdev
+-		entry->rootdev = strdup(line);
+-		ptr = entry->rootdev;
+-		while(*++ptr)
+-			if(*ptr==':')
+-				break;
+-		*ptr='\0';
+-
+-		// title
+-		entry->title = ptr+1;
+-		while(*++ptr)
+-			if(*ptr==':')
+-				break;
+-		*ptr='\0';
+-
+-		// shorname is useless for us
+-		while(*++ptr)
+-			if(*ptr==':')
+-				break;
+-
+-		// type
+-		entry->type = ptr+1;
+-		while(*++ptr)
+-			if(*ptr==':')
+-				break;
+-		*ptr='\0';
+-		// this is the last one, slice the \n from the end
+-		entry->type[strlen(entry->type)-1]='\0';
+-		entries = g_list_append(entries, entry);
+-	}
+-	pclose(pp);
+-	for(i=0;i<g_list_length(entries);i++)
+-	{
+-		entry = g_list_nth_data(entries, i);
+-		if(!strcmp(entry->type, "linux"))
+-		{
+-			if(stat("/usr/bin/linux-boot-prober", &buf))
+-				continue;
++	/* Setup logging. */
++	strcat(cmd," > " FWGRUB_LOGDEV " 2>&1");
+
+-			ptr = g_strdup_printf("linux-boot-prober %s", entry->rootdev);
+-			pp = popen(ptr, "r");
+-			free(ptr);
+-			if(!pp)
+-				return(1);
+-			// only the first line matters
+-			if(fgets(line, PATH_MAX, pp))
+-			{
+-				// rootdev, junk
+-				ptr = line;
+-				while(*++ptr)
+-					if(*ptr==':')
+-						break;
+-				// bootdev
+-				bootdev = strdup(ptr+1);
+-				while(*++ptr)
+-					if(*ptr==':')
+-						break;
+-				*ptr='\0';
+-				if(!strcmp(entry->rootdev, bootdev))
+-					entry->bootstr = strdup("/boot");
+-				else
+-					entry->bootstr = strdup("");
+-				// ->rootdev already included in ->opts. clear it here since
+-				// we needed it only for ->bootstr
+-				entry->rootdev='\0';
+-				entry->grubbootdev = grub_convert(bootdev, 0);
+-				// title, junk
+-				while(*++ptr)
+-					if(*ptr==':')
+-						break;
+-				// kernel
+-				entry->kernel = ptr+1;
+-				while(*++ptr)
+-					if(*ptr==':')
+-						break;
+-				*ptr='\0';
+-				// initrd, maybe useful later
+-				entry->initrd = NULL;
+-				while(*++ptr)
+-					if(*ptr==':')
+-						break;
+-				// opts
+-				entry->opts = ptr+1;
+-				// this is the last one, slice the \n from the end
+-				entry->opts[strlen(entry->opts)-1]='\0';
+-			}
+-			pclose(pp);
+-			write_entry(entry);
+-			free(entry->grubbootdev);
+-			free(entry->bootstr);
+-		}
+-		else if(!strcmp(entry->type, "chain"))
+-			write_entry(entry);
+-		// TODO: else if(!strcmp(entry->type, "chain"))
+-		free(entry->rootdev);
+-	}
+-	g_list_free(entries);
+-	return(0);
++	return system(cmd) ? 1 : 0;
+ }
+
+-/** Crates a menu.lst
+- * @param fp file pointer to write the menu.lst to
++/** Make a grub2 configuration file
++ * @return 0 on succcess, 1 on error
+  */
+-void fwgrub_create_menu(FILE *fp)
++int fwgrub_make_config(void)
+ {
+-	char *ptr;
+-	char *bootdev;
+-	char *swapdev;
+-	struct stat buf;
+-	struct fwgrub_entry_t entry;
+-	char path[PATH_MAX];
+-
+-	entry.fp = fp;
+-	entry.title = gen_title();
+-	entry.type=NULL;
+-
+-	// hack: update mtab
+-	system("mount / -o rw,remount");
+-
+-	ptr = find_mount_point("/boot");
+-	bootdev = mount_dev(ptr);
+-	free(ptr);
+-	entry.grubbootdev=grub_convert(bootdev, 0);
+-
+-	ptr = find_mount_point("/");
+-	entry.rootdev = mount_dev(ptr);
+-	free(ptr);
+-	if(!strcmp(entry.rootdev, bootdev))
+-		entry.bootstr = strdup("/boot");
+-	else
+-		entry.bootstr = strdup("");
+-
+-	fprintf(fp, "#\n# %s/grub/menu.lst - configuration file for GRUB\n", entry.bootstr);
+-	fprintf(fp, "# This file is generated automatically by grubconfig\n#\n\n");
+-	fprintf(fp, "default=0\ntimeout=5\n");
+-	snprintf(path, PATH_MAX, "%s/grub/message", entry.bootstr);
+-	if(is_raid1_device(entry.rootdev))
+-	{
+-		if (entry.grubbootdev)
+-			// in case /boot is not on raid1, it is already
+-			// allocated.
+-			*(entry.grubbootdev) = '\0';
+-		else
+-			// otherwise just allocate an empty string
+-			entry.grubbootdev = strdup("");
+-	}
+-	if(!stat(path, &buf))
+-		fprintf(fp, "gfxmenu %s%s/grub/message\n\n", entry.grubbootdev, entry.bootstr);
+-	entry.kernel = strdup("/vmlinuz");
+-	entry.initrd = strdup("/initrd.img.xz");
+-	swapdev = get_swap_dev();
+-	if (swapdev)
+-		entry.opts = g_strdup_printf("ro quiet splash resume=%s", swapdev);
+-	else
+-		entry.opts = strdup("ro quiet splash");
+-	write_entry(&entry);
+-
+-	if(!(stat("/boot/memtest.bin", &buf)))
+-	{
+-		free(entry.title);
+-		entry.title=strdup("Memtest86+");
+-		free(entry.kernel);
+-		entry.kernel = strdup("/memtest.bin");
+-		free(entry.rootdev);
+-		entry.rootdev=NULL;
+-		free(entry.opts);
+-		entry.opts=NULL;
+-		free(entry.initrd);
+-		entry.initrd=NULL;
+-		write_entry(&entry);
+-	}
+-	entry_free(&entry);
+-
+-	os_prober(fp);
+-
+-	free(bootdev);
++	return system("grub-mkconfig -o /boot/grub/grub.cfg > " FWGRUB_LOGDEV " 2>&1") ? 1 : 0;
+ }
+
+-/* @} */
++/** @} */
+diff --git a/libfwgrubconfig/libfwgrubconfig.h b/libfwgrubconfig/libfwgrubconfig.h
+index 5c0dcd0..c14cbca 100644
+--- a/libfwgrubconfig/libfwgrubconfig.h
++++ b/libfwgrubconfig/libfwgrubconfig.h
+@@ -1,8 +1,8 @@
+ /*
+  *  libfwgrubconfig.h for frugalwareutils
+- *
++ *
+  *  Copyright (c) 2006 by Miklos Vajna <vmiklos at frugalware.org>
+- *
++ *
+  *  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
+@@ -15,9 +15,15 @@
+  *
+  *  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,
++ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+  *  USA.
+  */
+
+-int fwgrub_install(int mode);
+-void fwgrub_create_menu(FILE *fp);
++enum fwgrub_install_mode
++{
++	FWGRUB_INSTALL_MBR,
++	FWGRUB_INSTALL_EFI
++};
++
++int fwgrub_install(enum fwgrub_install_mode mode);
++int fwgrub_make_config(void);
+diff --git a/libfwraidconfig/libfwraidconfig.c b/libfwraidconfig/libfwraidconfig.c
+index 57198c5..74d328d 100644
+--- a/libfwraidconfig/libfwraidconfig.c
++++ b/libfwraidconfig/libfwraidconfig.c
+@@ -157,7 +157,7 @@ int fwraid_create_md(char *devname, int level, GList *devices)
+ {
+ 	char *ptr = fwutil_glist_display(devices, " ");
+ 	// TODO: this "yes" is an ugly hack to pass various warnings
+-	char *cmd = g_strdup_printf("yes |mdadm --create --metadata 0.90 --verbose %s "
++	char *cmd = g_strdup_printf("yes |mdadm --create --metadata=default --verbose %s "
+ 		"--level=%d --raid-devices=%d %s >%s 2>%s",
+ 		devname, level, g_list_length(devices), ptr, FWRAID_LOGDEV, FWRAID_LOGDEV);
+ 	int ret;
diff --git a/source/base/frugalwareutils/fwlive_patch.diff b/source/base/frugalwareutils/fwlive_patch.diff
deleted file mode 100644
index 1ce4a3f..0000000
--- a/source/base/frugalwareutils/fwlive_patch.diff
+++ /dev/null
@@ -1,21 +0,0 @@
---- libfwgrubconfig/libfwgrubconfig.c
-+++ libfwgrubconfig/libfwgrubconfig_good.c
-@@ -243,7 +243,7 @@
- 		return(NULL);
- 	while(fgets(line, PATH_MAX, fp))
- 	{
--		if(i++ < 2 || strstr(line, "ram"))
-+		if(i++ < 2 || strstr(line, "ram") || strstr(line, "loop"))
- 			continue;
- 		else
- 			break;
-@@ -443,7 +443,7 @@
- 	if(fp)
- 	{
- 		while ((mnt = getmntent (fp)))
--			if(!strcmp(mnt->mnt_dir, path) && ! (!strcmp(mnt->mnt_fsname, "rootfs") || !strcmp(mnt->mnt_fsname, "/dev/root")))
-+			if(!strcmp(mnt->mnt_dir, path) && ! (!strcmp(mnt->mnt_fsname, "rootfs") || !strcmp(mnt->mnt_fsname, "/dev/root") || !strcmp(mnt->mnt_fsname, "/dev/mapper/live-rw")))
- 				break;
- 		endmntent(fp);
- 		if(mnt)
-


More information about the Frugalware-git mailing list