On 05/19/2010 01:58 PM, Jason Oster wrote:
Hi list, [snip]Seems like a cross-compiling problem! According to [1] "If you specify just ‘--build’, |configure| will get confused." So I changed it to use --host in the Makefile. To cross-compile gclibc properly, the -m32 argument must be passed to gcc. After that, I hit another problem [2]. Finally, I came up with the attached patch. (Yeah, it's ugly ... I tried setting those options in CFLAGS and CXXFLAGS where they belong, but it doesn't work ... ?!) I'm curious what else needs some similar cross-compiler fixes to get linuxboot to build properly? Finally, I tried the linuxboot-4.9 iso from SF. The kernel won't boot from the CD on a Dell Inspiron 400 (Zino HD); it says "cannot find `image`" or some similar error. That's why I was trying to build my own. ;( [1] http://www.gnu.org/s/libc/manual/html_node/Configuring-and-compiling.html [2] http://ubuntuforums.org/showthread.php?t=1001811
Update on this, for the list;I've successfully built linuxboot, now. I ran into a DOSEMU bug [1], and including that patch in the Makefile worked. I also updated my patch to place the -m32 flag into the CC and CXX vars. All of that is attached.
Some other fixes that went into this patch include: * Missing menu.c32 in the final iso * Remove *.tmp files on the tidy target* Set the CXX variable when building libusb (else the link will fail because it compiles C++ for the native architecture)
That gets the whole thing to completion (assuming you have all of the build dependencies! I was missing some 32-bit libs, libsndfile, g++-multilib, ...)
Hmm, do you really want menu.s32? It's ugly and silly that it makes you press enter instead of just booting the kernel automagically.
diff --git a/trunk/linuxboot/Makefile b/trunk/linuxboot/Makefile --- a/trunk/linuxboot/Makefile +++ b/trunk/linuxboot/Makefile @@ -44,18 +44,18 @@ cwd:=$(shell pwd) packages=$(bash) $(busybox) $(convert-asn1) $(dbd-mysql) $(dbd-pgpp) $(dbi) \ $(dmidecode) $(dosemu) $(e2fsprogs) $(expat) $(glibc) $(kbd) \ $(linux) $(module-init-tools) $(mysql) $(nano) \ $(ncurses) $(parted) $(perl) $(perl-ldap) $(perl-xml-parser) \ $(perl-xml-xpath) $(pciutils) $(pmtools) \ $(samba) $(slang) $(syslinux) $(libusb) $(usbutils) \ $(wireless_tools) $(zlib) -CC=gcc -CXX=g++ +CC=gcc -m32 +CXX=g++ -m32 # Debian/Ubuntu systems likely use genisoimage to create iso files # otherwise try to use mkisofs ifneq ("$(strip $(wildcard /usr/bin/genisoimage))","") mkisofs=genisoimage else mkisofs=mkisofs endif @@ -92,57 +92,57 @@ copy_lib= \ build-$(glibc)/elf/ldconfig -r stage1 all: iso tftpboot ## module-init-tools (depmod et. al.) $(module-init-tools)/build/depmod: - cd $(module-init-tools) && CC=$(CC) ./configure --prefix=/ \ + cd $(module-init-tools) && CC="$(CC)" ./configure --prefix=/ \ --build=i586-linux && $(MAKE) [ -e $@ ] stage1/sbin/depmod: $(module-init-tools)/build/depmod $(MAKE) -C $(module-init-tools) DESTDIR=$(cwd)/stage1 install rm stage1/sbin/insmod.static [ -e $@ ] stage1 += stage1/sbin/depmod ## Linux $(linux)/.config: misc/linux-config - $(MAKE) CC=$(CC) HOSTCC=$(CC) -C $(linux) mrproper + $(MAKE) CC="$(CC)" HOSTCC="$(CC)" -C $(linux) mrproper cp -f $< $@ - $(MAKE) CC=$(CC) HOSTCC=$(CC) -C $(linux) ARCH=i386 oldconfig + $(MAKE) CC="$(CC)" HOSTCC="$(CC)" -C $(linux) ARCH=i386 oldconfig $(linux)/arch/x86/boot/bzImage: $(linux)/.config rm -f $@ - $(MAKE) CC=$(CC) HOSTCC=$(CC) -C $(linux) ARCH=i386 - $(MAKE) CC=$(CC) HOSTCC=$(CC) -C $(linux) INSTALL_HDR_PATH=dest ARCH=i386 headers_install + $(MAKE) CC="$(CC)" HOSTCC="$(CC)" -C $(linux) ARCH=i386 + $(MAKE) CC="$(CC)" HOSTCC="$(CC)" -C $(linux) INSTALL_HDR_PATH=dest ARCH=i386 headers_install [ -e $@ ] stage1/.stamp-modules: $(linux)/arch/x86/boot/bzImage stage1/sbin/depmod - $(MAKE) CC=$(CC) HOSTCC=$(CC) -C $(linux) \ + $(MAKE) CC="$(CC)" HOSTCC="$(CC)" -C $(linux) \ INSTALL_MOD_PATH=$(cwd)/stage1 \ DEPMOD=$(cwd)/stage1/sbin/depmod \ ARCH=i386 \ modules_install touch $@ stage1 += stage1/.stamp-modules ## bash ## FIXME configure loading emacs shared files from system $(bash)/bash: fakeinclude/stdio.h cd $(bash) \ - && CC=$(CC) CFLAGS="$(fakelib_cflags)" \ + && CC="$(CC)" CFLAGS="$(fakelib_cflags)" \ bash_cv_termcap_lib=gnutermcap ./configure --prefix=/ \ --build=i586-linux \ && $(MAKE) [ -e $@ ] && touch $@ $(call copy_exe, $(bash)/bash, stage1/bin/bash) stage1/bin/sh: stage1/bin/bash @@ -154,46 +154,50 @@ stage1 += stage1/bin/bash stage1/bin/sh ## BusyBox # This patch makes udhcpc fetch option 233 from the dhcp server $(busybox)/.stamp-busybox-patch: misc/busybox-patch cd $(busybox) && patch -b -p1 < $(cwd)/$< touch $@ $(busybox)/.config: misc/busybox-config $(busybox)/.stamp-busybox-patch cp -f $< $@ - $(MAKE) CC=$(CC) HOSTCC=$(CC) -C $(busybox) oldconfig + $(MAKE) CC="$(CC)" HOSTCC="$(CC)" -C $(busybox) oldconfig # BusyBox has some broken dependencies (changing CONFIG_INIT to off # does not rebuild reboot.o), hence the "make clean" here. $(busybox)/busybox: $(busybox)/.config fakeinclude/stdio.h - $(MAKE) CC=$(CC) HOSTCC=$(CC) -C $(busybox) clean - $(MAKE) CC=$(CC) HOSTCC=$(CC) -C $(busybox) CFLAGS_EXTRA="$(fakelib_cflags)" LDFLAGS="$(fakelib_cflags)" + $(MAKE) CC="$(CC)" HOSTCC="$(CC)" -C $(busybox) clean + $(MAKE) CC="$(CC)" HOSTCC="$(CC)" -C $(busybox) CFLAGS_EXTRA="$(fakelib_cflags)" LDFLAGS="$(fakelib_cflags)" stage1/bin/busybox: $(busybox)/busybox - $(MAKE) CC=$(CC) HOSTCC=$(CC) -C $(busybox) CONFIG_PREFIX=$(cwd)/stage1 install + $(MAKE) CC="$(CC)" HOSTCC="$(CC)" -C $(busybox) CONFIG_PREFIX=$(cwd)/stage1 install cmp $< $@ stage1 += stage1/bin/busybox ## dmidecode $(dmidecode)/dmidecode: - $(MAKE) CC=$(CC) -C $(dir $@) + $(MAKE) CC="$(CC)" -C $(dir $@) [ -e $@ ] $(call copy_exe,$(dmidecode)/dmidecode,stage1/usr/sbin/dmidecode) stage1 += stage1/usr/sbin/dmidecode $(dosemu)/.stamp-dosemu-nolock-patch: misc/dosemu-nolock-patch cd $(dosemu) && patch -b -p1 < $(cwd)/$< touch $@ $(dosemu)/.stamp-dosemu-configure-patch: misc/dosemu-configure-patch cd $(dosemu) && patch -b -p1 < $(cwd)/$< touch $@ +$(dosemu)/.stamp-dosemu-dexeconfig-patch: misc/dosemu-dexeconfig-patch + cd $(dosemu) && patch -b -p1 < $(cwd)/$< + touch $@ + fakeinclude/slang.h: $(slang)/src/slang.h mkdir -p $(dir $@) cp $< $@ [ -e $@ ] && touch $@ $(slang)/src/objs/libslang.a: stage1/lib/libdl.so $(slang)/configure rm -f $@ cd $(slang) \ @@ -207,16 +211,17 @@ fakeinclude/slang.h: $(slang)/src/slang. fakelib/libslang.a) # dosemu: # - use slang of build environment (not system's one): patched # configure script to create our custom options (--with-slangdir # option does not work for us). build-$(dosemu)/config.status: $(dosemu)/.stamp-dosemu-nolock-patch \ $(dosemu)/.stamp-dosemu-configure-patch \ + $(dosemu)/.stamp-dosemu-dexeconfig-patch \ $(dosemu)/configure fakelib/libslang.a \ fakeinclude/slang.h rm -f $@ mkdir -p $(dir $@) cd $(dir $@) \ && CC="$(CC) $(fakelib_cflags)" $(cwd)/$(dosemu)/configure \ --with-slang-inc=$(cwd)/fakeinclude \ --with-slang-lib=$(cwd)/fakelib \ @@ -288,17 +293,17 @@ stage1/var/lib/dosemu/drives/dosboot.img rm $$tmpfile mv $...@.tmp $@ stage1 += stage1/var/lib/dosemu/drives/dosboot.img ## e2fsprogs (just libuuid.so, required for parted) $(e2fsprogs)/lib/libuuid.so: cd $(e2fsprogs) \ - && CC=$(CC) ./configure --enable-elf-shlibs --build=i586-linux \ + && CC="$(CC)" ./configure --enable-elf-shlibs --build=i586-linux \ && $(MAKE) [ -e $@ ] $(call copy_lib,$(e2fsprogs)/lib/libuuid.so,stage1/lib/libuuid.so) stage1 += stage1/lib/libuuid.so $(glibc)/.stamp-glibc-gen-translit.pl-patch: @@ -306,25 +311,26 @@ stage1 += stage1/lib/libuuid.so touch $@ ## glibc # Configure switches cheerfully stolen from LFS project # (http://www.linuxfromscratch.org/lfs/view/development/chapter05/glibc.html). build-$(glibc)/libc.so: $(linux)/arch/x86/boot/bzImage \ $(glibc)/.stamp-glibc-gen-translit.pl-patch mkdir -p build-$(glibc) - cd build-$(glibc) && CC=$(CC) $(cwd)/$(glibc)/configure \ + cd build-$(glibc) && CC="$(CC)" CFLAGS="-O2 -U_FORTIFY_SOURCE -fno-stack-protector $(CFLAGS)" \ + $(cwd)/$(glibc)/configure \ --prefix=/usr \ --disable-profile --enable-add-ons \ --enable-kernel=2.6.18 \ --without-gd --without-cvs \ --without-selinux \ --includedir=$(cwd)/$(linux)/dest/include \ --with-headers=$(cwd)/$(linux)/dest/include \ - --build=i586-linux \ + --host=i586-linux \ && find . -name \*.d -print0 | xargs -0 -r rm -f \ && $(MAKE) touch -c $@ $(call copy_lib, build-$(glibc)/libc.so, stage1/lib/libc.so) # "Fake" library to link against $(call copy_file, build-$(glibc)/libc_nonshared.a, \ @@ -410,18 +416,18 @@ stage1 += \ libm.so libutil.so libpthread.so librt.so \ ) ## kbd $(kbd)/src/loadkeys: fakeinclude/stdio.h rm -f $@ cd $(kbd) \ && export CFLAGS="$(fakelib_cflags) -O2" \ - && CC=$(CC) ./configure --prefix=/ \ - && $(MAKE) CC=$(CC) CFLAGS="$$CFLAGS" + && CC="$(CC)" ./configure --prefix=/ \ + && $(MAKE) CC="$(CC)" CFLAGS="$$CFLAGS" [ -e $@ ] ## TODO: get more info about why we are deleting some files stage1/bin/loadkeys: $(kbd)/src/loadkeys rm -f $@ cd $(kbd) \ && $(MAKE) DESTDIR=$(cwd)/stage1 install rm -rf stage1/usr/share/locale @@ -430,31 +436,31 @@ stage1/bin/loadkeys: $(kbd)/src/loadkeys setkeycodes setleds setmetamode showconsolefont showkey [ -e $@ ] stage1 += stage1/bin/loadkeys ## nano $(nano)/src/nano: fakeinclude/stdio.h fakeinclude/curses.h cd $(nano) \ - && CC=$(CC) CFLAGS="$(fakelib_cflags)" \ + && CC="$(CC)" CFLAGS="$(fakelib_cflags)" \ ./configure --prefix=/usr \ --disable-browser --disable-mouse --disable-speller \ --build=i586-linux \ && $(MAKE) [ -e $@ ] && touch $@ $(call copy_exe, $(nano)/src/nano, stage1/usr/bin/nano) stage1 += stage1/usr/bin/nano ## ncurses $(ncurses)/lib/libncursesw.so: fakeinclude/stdio.h cd $(ncurses) \ - && CC=$(CC) CXX=$(CXX) CFLAGS="$(fakelib_cflags)" \ + && CC="$(CC)" CXX="$(CXX)" CFLAGS="$(fakelib_cflags)" \ LDFLAGS="$(fakelib_cflags)" CXXFLAGS="$(fakelib_cflags)" \ ./configure --prefix=/usr --with-shared \ --without-normal --without-debug \ --disable-database --with-fallbacks=linux \ --build=i586-linux --without-hashed-db \ --enable-widec \ && $(MAKE) [ -e $@ ] && touch $@ @@ -470,17 +476,17 @@ stage1 += stage1/usr/lib/libncursesw.so ## parted #FIXME: --disable-Werror added to compile parted 1.8.8 with gcc 4.2.1 and later # This will probably be fixed in a later version of parted $(parted)/parted/.libs/parted: fakeinclude/stdio.h stage1/lib/libuuid.so \ stage1/lib/libdl.so cd $(parted) \ - && CC=$(CC) CXX=$(CXX) \ + && CC="$(CC)" CXX="$(CXX)" \ CFLAGS="$(fakelib_cflags) -I$(cwd)/$(e2fsprogs)/lib" \ ./configure --disable-nls --without-readline \ --build=i586-linux --disable-Werror \ && $(MAKE) [ -e $@ ] $(parted)/libparted/.libs/libparted.so: $(parted)/parted/.libs/parted [ -e $@ ] && touch $@ @@ -488,41 +494,41 @@ stage1 += stage1/usr/lib/libncursesw.so $(call copy_exe, $(parted)/parted/.libs/parted, stage1/usr/sbin/parted) $(call copy_lib, $(parted)/libparted/.libs/libparted.so, \ stage1/lib/libparted.so) stage1 += stage1/usr/sbin/parted stage1/lib/libparted.so ## pciutils $(pciutils)/lspci: - $(MAKE) CC=$(CC) -C $(pciutils) PREFIX=/usr HOST="i586--linux" \ + $(MAKE) CC="$(CC)" -C $(pciutils) PREFIX=/usr HOST="i586--linux" \ RELEASE="$(subst linux-,,$(linux))" OPT="$(fakelib_cflags)" [ -e $@ ] $(call copy_exe, $(pciutils)/lspci, stage1/sbin/lspci) $(call copy_file,$(pciutils)/pci.ids,stage1/usr/share/pci.ids) stage1 += stage1/sbin/lspci stage1/usr/share/pci.ids ## pmtools (acpidump, for diagnostics) $(pmtools)/acpidump/acpidump: fakeinclude/stdio.h $(linux)/arch/x86/boot/bzImage cd $(dir $@) \ && $(MAKE) clean \ - && $(MAKE) CC=$(CC) + && $(MAKE) CC="$(CC)" [ -e $@ ] $(call copy_exe,$(pmtools)/acpidump/acpidump,stage1/sbin/acpidump) stage1 += stage1/sbin/acpidump ## Perl $(perl)/perl: fakeinclude/stdio.h rm -f $@ cd $(perl) \ - && ./Configure -Dcc=$(CC) -Dusethreads -Dprefix=/opt/perl \ + && ./Configure -Dcc="$(CC)" -Dusethreads -Dprefix=/opt/perl \ -Dlibpth="$(cwd)/fakelib $(cwd)/stage1/lib" \ -Ud_sethostent_r -Ud_setprotoent_r -Ud_setservent_r \ -Ud_endhostent_r -Ud_endprotoent_r -Ud_endservent_r \ -Darchname=i586-linux -Ud_eaccess \ -Accflags="$(fakelib_cflags)" \ -deO \ && $(MAKE) [ -e $@ ] @@ -541,17 +547,17 @@ stage1 += stage1/opt/perl/bin/perl perllib=$(cwd)/stage1/opt/perl/lib/$(patsubst perl-%,%,$(perl)) perlrun=$(cwd)/stage1/opt/perl/bin/perl -I$(cwd)/stage1/opt/perl/lib/site_perl -I$(perllib) ## mysql # It has a dependency on ncurses-dev fakeinclude/curses.h could fixed $(mysql)/Makefile: stage1/opt/perl/bin/perl fakeinclude/zlib.h cd $(dir $@) \ - && CC=$(CC) CXX=$(CXX) \ + && CC="$(CC)" CXX="$(CXX)" \ CFLAGS="$(fakelib_cflags)" CXXFLAGS="$(fakelib_cflags)" \ ./configure --prefix=/ --without-server --build=i586-linux $(mysql)/libmysql/.libs/libmysqlclient.so: $(mysql)/Makefile rm -f $@ cd $(mysql) \ && $(MAKE) \ && $(MAKE) -C include includedir=$(cwd)/fakeinclude install @@ -698,17 +704,17 @@ stage1 += stage1/.stamp-perl-xml-xpath ## Samba # Without -rdynamic, CP850.so craps out with "undefined symbol: # smb_register_charset". # so ensure that the kernel is built first $(samba)/source/config.status: stage1/.stamp-modules cd $(samba)/source \ - && CC=$(CC) LDFLAGS=-rdynamic ./configure --prefix=/usr \ + && CC="$(CC)" LDFLAGS=-rdynamic ./configure --prefix=/usr \ --disable-cups --without-readline \ --without-ldap --without-krb5 --without-ads \ --without-utmp --with-included-popt \ --build=i586-linux # Without "make installmodules" (which installs CP850.so), smbmount # prints a tremendous number of "convert_string_internal: Conversion # not supported" errors. @@ -737,77 +743,77 @@ stage1 += stage1/usr/lib/smb.conf stage1 += stage1/sbin/mount.cifs ## wireless_tools $(wireless_tools)/iwconfig: fakeinclude/stdio.h $(linux)/arch/x86/boot/bzImage cd $(wireless_tools) \ && $(MAKE) clean \ && $(MAKE) KERNEL_SRC=$(cwd)/$(linux) \ - CC=$(CC) CFLAGS="$(fakelib_cflags) -O2 -Wall" + CC="$(CC)" CFLAGS="$(fakelib_cflags) -O2 -Wall" [ -e $@ ] $(wireless_tools)/iwlist: $(wireless_tools)/iwconfig $(call copy_exe,$(wireless_tools)/iwconfig,stage1/sbin/iwconfig) $(call copy_exe,$(wireless_tools)/iwlist,stage1/sbin/iwlist) stage1 += stage1/sbin/iwconfig stage1/sbin/iwlist ## zlib (required by libmysqlclient.so) zlib_ver := $(patsubst zlib-%,%,$(zlib)) zlib_so := libz.so.$(zlib_ver) $(zlib)/$(zlib_so): fakeinclude/stdio.h rm -f $@ cd $(zlib) \ - && $(MAKE) CC=$(CC) CFLAGS="-O $(fakelib_cflags)" \ + && $(MAKE) CC="$(CC)" CFLAGS="-O $(fakelib_cflags)" \ LDSHARED="$(CC) -shared -Wl,-soname,libz.so.1" \ $(zlib_so) fakeinclude/zlib.h: $(zlib)/zlib.h $(zlib)/zconf.h mkdir -p $(dir $@) cp -f $^ $(dir $@) $(call copy_lib,$(zlib)/$(zlib_so),stage1/lib/libz.so) stage1 += stage1/lib/libz.so ## libexpat $(expat)/.libs/libexpat.so.1.5.2: cd $(expat) \ - && CC=$(CC) ./configure --prefix=/ \ + && CC="$(CC)" ./configure --prefix=/ \ && $(MAKE) $(call copy_lib,$(expat)/.libs/libexpat.so.1.5.2,stage1/lib/libexpat.so) $(call copy_file,$(expat)/lib/expat.h,fakeinclude/expat.h) $(call copy_file,$(expat)/lib/expat_external.h,fakeinclude/expat_external.h) stage1 += stage1/lib/libexpat.so ## libusb $(libusb)/.libs/libusb-0.1.so.4.4.4: cd $(libusb) \ - && CC=$(CC) ./configure --disable-static \ + && CC="$(CC)" CXX="$(CXX)" ./configure --disable-static \ --build=i586-linux \ --disable-dependency-tracking \ && $(MAKE) [ -e $@ ] $(call copy_lib,$(libusb)/.libs/libusb-0.1.so.4.4.4,stage1/lib/libusb.so) $(call copy_file,$(libusb)/usb.h,fakeinclude/usb.h) stage1 += stage1/lib/libusb.so ## usbutils ## use LIBUSB_CFLAGS and LIBUSB_LIBS to avoid pkg-config usage. ## FIXME '-lusb' is sufficient since usage of fakelib_cflags for CFLAGS. $(usbutils)/lsusb: stage1/lib/libusb.so fakeinclude/usb.h cd $(usbutils) \ - && CC=$(CC) CFLAGS="$(fakelib_cflags)" \ + && CC="$(CC)" CFLAGS="$(fakelib_cflags)" \ LIBUSB_CFLAGS="-I$(cwd)/fakeinclude" LIBUSB_LIBS="-lusb" \ ./configure --prefix=/usr \ && $(MAKE) $(call copy_exe, $(usbutils)/lsusb, stage1/sbin/lsusb) stage1 += stage1/sbin/lsusb @@ -913,17 +919,18 @@ initrd: devices.cpio .stamp-stage2 $(call copy_file,misc/isolinux.cfg,iso/isolinux/isolinux.cfg) $(call copy_file,$(syslinux)/com32/menu/menu.c32,iso/isolinux/menu.c32) $(call copy_file,$(syslinux)/core/isolinux.bin,iso/isolinux/isolinux.bin) linuxboot.iso: iso/isolinux/bzImage iso/isolinux/initrd \ - iso/isolinux/isolinux.cfg iso/isolinux/isolinux.bin + iso/isolinux/isolinux.cfg iso/isolinux/isolinux.bin \ + iso/isolinux/menu.c32 $(mkisofs) -quiet -o $...@.tmp -m CVS \ -b isolinux/isolinux.bin -c isolinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table \ iso > /dev/null mv $...@.tmp $@ iso: linuxboot.iso @@ -1083,16 +1090,17 @@ symlink_targets=$(addprefix symlink-,$(p symlinks: $(symlink_targets) # Blow away everything we do not want to ship. tidy: rm -rf $(patsubst symlink-%,%,$(symlink_targets)) rm -rf dosboot iso rm -rf .stamp-stage1 stage2 .stamp-stage2 rm -f devices.cpio initrd + rm -f *.tmp # Clean up all the stuff we built so we can build again clean: tidy rm -rf tftpboot rm -rf linuxboot.iso rm -rf ../install/linuxaux FORCE: diff --git a/trunk/linuxboot/misc/dosemu-dexeconfig-patch b/trunk/linuxboot/misc/dosemu-dexeconfig-patch new file mode 100644 --- /dev/null +++ b/trunk/linuxboot/misc/dosemu-dexeconfig-patch @@ -0,0 +1,12 @@ +diff -ur dosemu-1.4.0.1/src/tools/periph/dexeconfig.c dosemu-1.4.0.1-dev1/src/tools/periph/dexeconfig.c +--- dosemu-1.4.0.1/src/tools/periph/dexeconfig.c 2007-05-04 06:59:48.000000000 +0100 ++++ dosemu-1.4.0.1-dev1/src/tools/periph/dexeconfig.c 2009-05-17 11:09:27.000000000 +0100 +@@ -238,7 +238,7 @@ + exit(1); + } + close(fd); +- fc = open(cfile, O_WRONLY | O_CREAT | O_TRUNC); ++ fc = open(cfile, O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (fc < 0) { + perror("cannot open config file"); + exit(1);
<<attachment: jason_oster.vcf>>
------------------------------------------------------------------------------
_______________________________________________ unattended-devel mailing list unattended-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/unattended-devel