Preliminary UTF-16LE support for GPT descriptions
diff --git a/Makefile b/Makefile
index 07176d8..7f04243 100644
--- a/Makefile
+++ b/Makefile
@@ -14,10 +14,10 @@
all: gdisk sgdisk fixparts
gdisk: $(LIB_OBJS) gdisk.o gpttext.o
- $(CXX) $(LIB_OBJS) gdisk.o gpttext.o $(LDFLAGS) -luuid -o gdisk
+ $(CXX) $(LIB_OBJS) gdisk.o gpttext.o $(LDFLAGS) -licui18n -licuio -luuid -o gdisk
sgdisk: $(LIB_OBJS) sgdisk.o
- $(CXX) $(LIB_OBJS) sgdisk.o $(LDFLAGS) -luuid -lpopt -o sgdisk
+ $(CXX) $(LIB_OBJS) sgdisk.o $(LDFLAGS) -licui18n -licuio -luuid -lpopt -o sgdisk
fixparts: $(MBR_LIB_OBJS) fixparts.o
$(CXX) $(MBR_LIB_OBJS) fixparts.o $(LDFLAGS) -o fixparts
@@ -36,401 +36,3 @@
$(CRITICAL_CXX_FLAGS)
# DO NOT DELETE
-
-attributes.o: /usr/include/stdint.h /usr/include/features.h
-attributes.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-attributes.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-attributes.o: /usr/include/bits/wchar.h /usr/include/stdio.h
-attributes.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-attributes.o: /usr/include/libio.h /usr/include/_G_config.h
-attributes.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
-attributes.o: /usr/include/bits/sys_errlist.h attributes.h support.h
-attributes.o: /usr/include/stdlib.h /usr/include/sys/types.h
-attributes.o: /usr/include/time.h /usr/include/endian.h
-attributes.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-attributes.o: /usr/include/sys/select.h /usr/include/bits/select.h
-attributes.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-attributes.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-attributes.o: /usr/include/alloca.h
-basicmbr.o: /usr/include/stdio.h /usr/include/features.h
-basicmbr.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-basicmbr.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-basicmbr.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-basicmbr.o: /usr/include/libio.h /usr/include/_G_config.h
-basicmbr.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
-basicmbr.o: /usr/include/bits/sys_errlist.h /usr/include/stdlib.h
-basicmbr.o: /usr/include/sys/types.h /usr/include/time.h
-basicmbr.o: /usr/include/endian.h /usr/include/bits/endian.h
-basicmbr.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-basicmbr.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-basicmbr.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-basicmbr.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
-basicmbr.o: /usr/include/stdint.h /usr/include/bits/wchar.h
-basicmbr.o: /usr/include/fcntl.h /usr/include/bits/fcntl.h
-basicmbr.o: /usr/include/string.h /usr/include/xlocale.h
-basicmbr.o: /usr/include/sys/stat.h /usr/include/bits/stat.h
-basicmbr.o: /usr/include/errno.h /usr/include/bits/errno.h
-basicmbr.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
-basicmbr.o: /usr/include/asm-generic/errno.h
-basicmbr.o: /usr/include/asm-generic/errno-base.h mbr.h gptpart.h support.h
-basicmbr.o: parttypes.h guid.h /usr/include/uuid/uuid.h
-basicmbr.o: /usr/include/sys/time.h attributes.h diskio.h
-basicmbr.o: /usr/include/sys/ioctl.h /usr/include/bits/ioctls.h
-basicmbr.o: /usr/include/asm/ioctls.h /usr/include/asm-generic/ioctls.h
-basicmbr.o: /usr/include/linux/ioctl.h /usr/include/asm/ioctl.h
-basicmbr.o: /usr/include/asm-generic/ioctl.h /usr/include/bits/ioctl-types.h
-basicmbr.o: /usr/include/sys/ttydefaults.h basicmbr.h mbrpart.h
-bsd.o: /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h
-bsd.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h
-bsd.o: /usr/include/gnu/stubs-64.h /usr/include/bits/types.h
-bsd.o: /usr/include/bits/typesizes.h /usr/include/libio.h
-bsd.o: /usr/include/_G_config.h /usr/include/wchar.h
-bsd.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-bsd.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
-bsd.o: /usr/include/endian.h /usr/include/bits/endian.h
-bsd.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-bsd.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-bsd.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-bsd.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
-bsd.o: /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/fcntl.h
-bsd.o: /usr/include/bits/fcntl.h /usr/include/sys/stat.h
-bsd.o: /usr/include/bits/stat.h /usr/include/errno.h
-bsd.o: /usr/include/bits/errno.h /usr/include/linux/errno.h
-bsd.o: /usr/include/asm/errno.h /usr/include/asm-generic/errno.h
-bsd.o: /usr/include/asm-generic/errno-base.h support.h bsd.h gptpart.h
-bsd.o: parttypes.h guid.h /usr/include/uuid/uuid.h /usr/include/sys/time.h
-bsd.o: attributes.h diskio.h /usr/include/sys/ioctl.h
-bsd.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-bsd.o: /usr/include/asm-generic/ioctls.h /usr/include/linux/ioctl.h
-bsd.o: /usr/include/asm/ioctl.h /usr/include/asm-generic/ioctl.h
-bsd.o: /usr/include/bits/ioctl-types.h /usr/include/sys/ttydefaults.h
-crc32.o: /usr/include/stdio.h /usr/include/features.h
-crc32.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-crc32.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-crc32.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-crc32.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h
-crc32.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-crc32.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
-crc32.o: /usr/include/endian.h /usr/include/bits/endian.h
-crc32.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-crc32.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-crc32.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-crc32.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h crc32.h
-crc32.o: /usr/include/stdint.h /usr/include/bits/wchar.h
-diskio.o: /usr/include/sys/ioctl.h /usr/include/features.h
-diskio.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-diskio.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-diskio.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-diskio.o: /usr/include/asm-generic/ioctls.h /usr/include/linux/ioctl.h
-diskio.o: /usr/include/asm/ioctl.h /usr/include/asm-generic/ioctl.h
-diskio.o: /usr/include/bits/ioctl-types.h /usr/include/sys/ttydefaults.h
-diskio.o: /usr/include/stdint.h /usr/include/bits/wchar.h
-diskio.o: /usr/include/errno.h /usr/include/bits/errno.h
-diskio.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
-diskio.o: /usr/include/asm-generic/errno.h
-diskio.o: /usr/include/asm-generic/errno-base.h /usr/include/fcntl.h
-diskio.o: /usr/include/bits/fcntl.h /usr/include/sys/types.h
-diskio.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-diskio.o: /usr/include/time.h /usr/include/endian.h
-diskio.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-diskio.o: /usr/include/sys/select.h /usr/include/bits/select.h
-diskio.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-diskio.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-diskio.o: /usr/include/sys/stat.h /usr/include/bits/stat.h support.h
-diskio.o: /usr/include/stdlib.h /usr/include/alloca.h diskio.h
-diskio-unix.o: /usr/include/sys/ioctl.h /usr/include/features.h
-diskio-unix.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-diskio-unix.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-diskio-unix.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-diskio-unix.o: /usr/include/asm-generic/ioctls.h /usr/include/linux/ioctl.h
-diskio-unix.o: /usr/include/asm/ioctl.h /usr/include/asm-generic/ioctl.h
-diskio-unix.o: /usr/include/bits/ioctl-types.h /usr/include/sys/ttydefaults.h
-diskio-unix.o: /usr/include/string.h /usr/include/xlocale.h
-diskio-unix.o: /usr/include/stdint.h /usr/include/bits/wchar.h
-diskio-unix.o: /usr/include/errno.h /usr/include/bits/errno.h
-diskio-unix.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
-diskio-unix.o: /usr/include/asm-generic/errno.h
-diskio-unix.o: /usr/include/asm-generic/errno-base.h /usr/include/fcntl.h
-diskio-unix.o: /usr/include/bits/fcntl.h /usr/include/sys/types.h
-diskio-unix.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-diskio-unix.o: /usr/include/time.h /usr/include/endian.h
-diskio-unix.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-diskio-unix.o: /usr/include/sys/select.h /usr/include/bits/select.h
-diskio-unix.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-diskio-unix.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-diskio-unix.o: /usr/include/sys/stat.h /usr/include/bits/stat.h diskio.h
-diskio-unix.o: support.h /usr/include/stdlib.h /usr/include/alloca.h
-diskio-windows.o: /usr/include/stdio.h /usr/include/features.h
-diskio-windows.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-diskio-windows.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-diskio-windows.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-diskio-windows.o: /usr/include/libio.h /usr/include/_G_config.h
-diskio-windows.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
-diskio-windows.o: /usr/include/bits/sys_errlist.h /usr/include/stdint.h
-diskio-windows.o: /usr/include/bits/wchar.h /usr/include/errno.h
-diskio-windows.o: /usr/include/bits/errno.h /usr/include/linux/errno.h
-diskio-windows.o: /usr/include/asm/errno.h /usr/include/asm-generic/errno.h
-diskio-windows.o: /usr/include/asm-generic/errno-base.h /usr/include/fcntl.h
-diskio-windows.o: /usr/include/bits/fcntl.h /usr/include/sys/types.h
-diskio-windows.o: /usr/include/time.h /usr/include/endian.h
-diskio-windows.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-diskio-windows.o: /usr/include/sys/select.h /usr/include/bits/select.h
-diskio-windows.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-diskio-windows.o: /usr/include/sys/sysmacros.h
-diskio-windows.o: /usr/include/bits/pthreadtypes.h /usr/include/sys/stat.h
-diskio-windows.o: /usr/include/bits/stat.h support.h /usr/include/stdlib.h
-diskio-windows.o: /usr/include/alloca.h diskio.h /usr/include/sys/ioctl.h
-diskio-windows.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-diskio-windows.o: /usr/include/asm-generic/ioctls.h
-diskio-windows.o: /usr/include/linux/ioctl.h /usr/include/asm/ioctl.h
-diskio-windows.o: /usr/include/asm-generic/ioctl.h
-diskio-windows.o: /usr/include/bits/ioctl-types.h
-diskio-windows.o: /usr/include/sys/ttydefaults.h
-fixparts.o: /usr/include/stdio.h /usr/include/features.h
-fixparts.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-fixparts.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-fixparts.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-fixparts.o: /usr/include/libio.h /usr/include/_G_config.h
-fixparts.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
-fixparts.o: /usr/include/bits/sys_errlist.h /usr/include/string.h
-fixparts.o: /usr/include/xlocale.h basicmbr.h /usr/include/stdint.h
-fixparts.o: /usr/include/bits/wchar.h /usr/include/sys/types.h
-fixparts.o: /usr/include/time.h /usr/include/endian.h
-fixparts.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-fixparts.o: /usr/include/sys/select.h /usr/include/bits/select.h
-fixparts.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-fixparts.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-fixparts.o: diskio.h /usr/include/sys/ioctl.h /usr/include/bits/ioctls.h
-fixparts.o: /usr/include/asm/ioctls.h /usr/include/asm-generic/ioctls.h
-fixparts.o: /usr/include/linux/ioctl.h /usr/include/asm/ioctl.h
-fixparts.o: /usr/include/asm-generic/ioctl.h /usr/include/bits/ioctl-types.h
-fixparts.o: /usr/include/sys/ttydefaults.h support.h /usr/include/stdlib.h
-fixparts.o: /usr/include/alloca.h mbrpart.h
-gdisk.o: /usr/include/stdio.h /usr/include/features.h
-gdisk.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-gdisk.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-gdisk.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-gdisk.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h
-gdisk.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-gdisk.o: /usr/include/string.h /usr/include/xlocale.h mbr.h
-gdisk.o: /usr/include/stdint.h /usr/include/bits/wchar.h
-gdisk.o: /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h
-gdisk.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-gdisk.o: /usr/include/sys/select.h /usr/include/bits/select.h
-gdisk.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-gdisk.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-gdisk.o: gptpart.h support.h /usr/include/stdlib.h /usr/include/alloca.h
-gdisk.o: parttypes.h guid.h /usr/include/uuid/uuid.h /usr/include/sys/time.h
-gdisk.o: attributes.h diskio.h /usr/include/sys/ioctl.h
-gdisk.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-gdisk.o: /usr/include/asm-generic/ioctls.h /usr/include/linux/ioctl.h
-gdisk.o: /usr/include/asm/ioctl.h /usr/include/asm-generic/ioctl.h
-gdisk.o: /usr/include/bits/ioctl-types.h /usr/include/sys/ttydefaults.h
-gdisk.o: basicmbr.h mbrpart.h gpttext.h gpt.h bsd.h
-gpt.o: /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h
-gpt.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h
-gpt.o: /usr/include/gnu/stubs-64.h /usr/include/bits/types.h
-gpt.o: /usr/include/bits/typesizes.h /usr/include/libio.h
-gpt.o: /usr/include/_G_config.h /usr/include/wchar.h
-gpt.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-gpt.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
-gpt.o: /usr/include/endian.h /usr/include/bits/endian.h
-gpt.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-gpt.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-gpt.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-gpt.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
-gpt.o: /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/fcntl.h
-gpt.o: /usr/include/bits/fcntl.h /usr/include/string.h /usr/include/xlocale.h
-gpt.o: /usr/include/math.h /usr/include/bits/huge_val.h
-gpt.o: /usr/include/bits/huge_valf.h /usr/include/bits/huge_vall.h
-gpt.o: /usr/include/bits/inf.h /usr/include/bits/nan.h
-gpt.o: /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h
-gpt.o: /usr/include/sys/stat.h /usr/include/bits/stat.h /usr/include/errno.h
-gpt.o: /usr/include/bits/errno.h /usr/include/linux/errno.h
-gpt.o: /usr/include/asm/errno.h /usr/include/asm-generic/errno.h
-gpt.o: /usr/include/asm-generic/errno-base.h crc32.h gpt.h gptpart.h
-gpt.o: support.h parttypes.h guid.h /usr/include/uuid/uuid.h
-gpt.o: /usr/include/sys/time.h attributes.h mbr.h diskio.h
-gpt.o: /usr/include/sys/ioctl.h /usr/include/bits/ioctls.h
-gpt.o: /usr/include/asm/ioctls.h /usr/include/asm-generic/ioctls.h
-gpt.o: /usr/include/linux/ioctl.h /usr/include/asm/ioctl.h
-gpt.o: /usr/include/asm-generic/ioctl.h /usr/include/bits/ioctl-types.h
-gpt.o: /usr/include/sys/ttydefaults.h basicmbr.h mbrpart.h bsd.h
-gptpart.o: /usr/include/string.h /usr/include/features.h
-gptpart.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-gptpart.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-gptpart.o: /usr/include/xlocale.h /usr/include/stdio.h
-gptpart.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-gptpart.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h
-gptpart.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-gptpart.o: gptpart.h /usr/include/stdint.h /usr/include/bits/wchar.h
-gptpart.o: /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h
-gptpart.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-gptpart.o: /usr/include/sys/select.h /usr/include/bits/select.h
-gptpart.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-gptpart.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-gptpart.o: support.h /usr/include/stdlib.h /usr/include/alloca.h parttypes.h
-gptpart.o: guid.h /usr/include/uuid/uuid.h /usr/include/sys/time.h
-gptpart.o: attributes.h
-gpttext.o: /usr/include/string.h /usr/include/features.h
-gpttext.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-gpttext.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-gpttext.o: /usr/include/xlocale.h /usr/include/errno.h
-gpttext.o: /usr/include/bits/errno.h /usr/include/linux/errno.h
-gpttext.o: /usr/include/asm/errno.h /usr/include/asm-generic/errno.h
-gpttext.o: /usr/include/asm-generic/errno-base.h /usr/include/stdint.h
-gpttext.o: /usr/include/bits/wchar.h /usr/include/limits.h
-gpttext.o: /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h
-gpttext.o: /usr/include/linux/limits.h /usr/include/bits/posix2_lim.h
-gpttext.o: attributes.h gpttext.h gpt.h /usr/include/sys/types.h
-gpttext.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-gpttext.o: /usr/include/time.h /usr/include/endian.h
-gpttext.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-gpttext.o: /usr/include/sys/select.h /usr/include/bits/select.h
-gpttext.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-gpttext.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-gpttext.o: gptpart.h support.h /usr/include/stdlib.h /usr/include/alloca.h
-gpttext.o: parttypes.h guid.h /usr/include/uuid/uuid.h
-gpttext.o: /usr/include/sys/time.h mbr.h diskio.h /usr/include/sys/ioctl.h
-gpttext.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-gpttext.o: /usr/include/asm-generic/ioctls.h /usr/include/linux/ioctl.h
-gpttext.o: /usr/include/asm/ioctl.h /usr/include/asm-generic/ioctl.h
-gpttext.o: /usr/include/bits/ioctl-types.h /usr/include/sys/ttydefaults.h
-gpttext.o: basicmbr.h mbrpart.h bsd.h
-guid.o: /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h
-guid.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h
-guid.o: /usr/include/gnu/stubs-64.h /usr/include/bits/types.h
-guid.o: /usr/include/bits/typesizes.h /usr/include/libio.h
-guid.o: /usr/include/_G_config.h /usr/include/wchar.h
-guid.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-guid.o: /usr/include/time.h /usr/include/string.h /usr/include/xlocale.h
-guid.o: guid.h /usr/include/stdint.h /usr/include/bits/wchar.h
-guid.o: /usr/include/uuid/uuid.h /usr/include/sys/types.h
-guid.o: /usr/include/endian.h /usr/include/bits/endian.h
-guid.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-guid.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-guid.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-guid.o: /usr/include/bits/pthreadtypes.h /usr/include/sys/time.h support.h
-guid.o: /usr/include/stdlib.h /usr/include/alloca.h
-mbr.o: /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h
-mbr.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h
-mbr.o: /usr/include/gnu/stubs-64.h /usr/include/bits/types.h
-mbr.o: /usr/include/bits/typesizes.h /usr/include/libio.h
-mbr.o: /usr/include/_G_config.h /usr/include/wchar.h
-mbr.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-mbr.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
-mbr.o: /usr/include/endian.h /usr/include/bits/endian.h
-mbr.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-mbr.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-mbr.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-mbr.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
-mbr.o: /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/fcntl.h
-mbr.o: /usr/include/bits/fcntl.h /usr/include/string.h /usr/include/xlocale.h
-mbr.o: /usr/include/sys/stat.h /usr/include/bits/stat.h /usr/include/errno.h
-mbr.o: /usr/include/bits/errno.h /usr/include/linux/errno.h
-mbr.o: /usr/include/asm/errno.h /usr/include/asm-generic/errno.h
-mbr.o: /usr/include/asm-generic/errno-base.h mbr.h gptpart.h support.h
-mbr.o: parttypes.h guid.h /usr/include/uuid/uuid.h /usr/include/sys/time.h
-mbr.o: attributes.h diskio.h /usr/include/sys/ioctl.h
-mbr.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-mbr.o: /usr/include/asm-generic/ioctls.h /usr/include/linux/ioctl.h
-mbr.o: /usr/include/asm/ioctl.h /usr/include/asm-generic/ioctl.h
-mbr.o: /usr/include/bits/ioctl-types.h /usr/include/sys/ttydefaults.h
-mbr.o: basicmbr.h mbrpart.h
-mbrpart.o: /usr/include/stdint.h /usr/include/features.h
-mbrpart.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-mbrpart.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-mbrpart.o: /usr/include/bits/wchar.h support.h /usr/include/stdlib.h
-mbrpart.o: /usr/include/sys/types.h /usr/include/bits/types.h
-mbrpart.o: /usr/include/bits/typesizes.h /usr/include/time.h
-mbrpart.o: /usr/include/endian.h /usr/include/bits/endian.h
-mbrpart.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-mbrpart.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-mbrpart.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-mbrpart.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h mbrpart.h
-parttypes.o: /usr/include/string.h /usr/include/features.h
-parttypes.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-parttypes.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-parttypes.o: /usr/include/xlocale.h /usr/include/stdint.h
-parttypes.o: /usr/include/bits/wchar.h /usr/include/stdio.h
-parttypes.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-parttypes.o: /usr/include/libio.h /usr/include/_G_config.h
-parttypes.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
-parttypes.o: /usr/include/bits/sys_errlist.h parttypes.h
-parttypes.o: /usr/include/stdlib.h /usr/include/sys/types.h
-parttypes.o: /usr/include/time.h /usr/include/endian.h
-parttypes.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-parttypes.o: /usr/include/sys/select.h /usr/include/bits/select.h
-parttypes.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-parttypes.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-parttypes.o: /usr/include/alloca.h support.h guid.h /usr/include/uuid/uuid.h
-parttypes.o: /usr/include/sys/time.h
-sgdisk.o: /usr/include/stdio.h /usr/include/features.h
-sgdisk.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-sgdisk.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-sgdisk.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-sgdisk.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h
-sgdisk.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-sgdisk.o: /usr/include/popt.h /usr/include/errno.h /usr/include/bits/errno.h
-sgdisk.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
-sgdisk.o: /usr/include/asm-generic/errno.h
-sgdisk.o: /usr/include/asm-generic/errno-base.h /usr/include/stdint.h
-sgdisk.o: /usr/include/bits/wchar.h mbr.h /usr/include/sys/types.h
-sgdisk.o: /usr/include/time.h /usr/include/endian.h
-sgdisk.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-sgdisk.o: /usr/include/sys/select.h /usr/include/bits/select.h
-sgdisk.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-sgdisk.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-sgdisk.o: gptpart.h support.h /usr/include/stdlib.h /usr/include/alloca.h
-sgdisk.o: parttypes.h guid.h /usr/include/uuid/uuid.h /usr/include/sys/time.h
-sgdisk.o: attributes.h diskio.h /usr/include/sys/ioctl.h
-sgdisk.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-sgdisk.o: /usr/include/asm-generic/ioctls.h /usr/include/linux/ioctl.h
-sgdisk.o: /usr/include/asm/ioctl.h /usr/include/asm-generic/ioctl.h
-sgdisk.o: /usr/include/bits/ioctl-types.h /usr/include/sys/ttydefaults.h
-sgdisk.o: basicmbr.h mbrpart.h gpt.h bsd.h
-support.o: /usr/include/stdio.h /usr/include/features.h
-support.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-support.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-support.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-support.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h
-support.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-support.o: /usr/include/stdint.h /usr/include/bits/wchar.h
-support.o: /usr/include/errno.h /usr/include/bits/errno.h
-support.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
-support.o: /usr/include/asm-generic/errno.h
-support.o: /usr/include/asm-generic/errno-base.h /usr/include/fcntl.h
-support.o: /usr/include/bits/fcntl.h /usr/include/sys/types.h
-support.o: /usr/include/time.h /usr/include/endian.h
-support.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-support.o: /usr/include/sys/select.h /usr/include/bits/select.h
-support.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-support.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-support.o: /usr/include/string.h /usr/include/xlocale.h
-support.o: /usr/include/sys/stat.h /usr/include/bits/stat.h support.h
-support.o: /usr/include/stdlib.h /usr/include/alloca.h
-test.o: /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h
-test.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h
-test.o: /usr/include/gnu/stubs-64.h /usr/include/bits/types.h
-test.o: /usr/include/bits/typesizes.h /usr/include/libio.h
-test.o: /usr/include/_G_config.h /usr/include/wchar.h
-test.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-test.o: support.h /usr/include/stdint.h /usr/include/bits/wchar.h
-test.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
-test.o: /usr/include/endian.h /usr/include/bits/endian.h
-test.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-test.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-test.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-test.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
-testguid.o: guid.h /usr/include/stdint.h /usr/include/features.h
-testguid.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-testguid.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-testguid.o: /usr/include/bits/wchar.h /usr/include/uuid/uuid.h
-testguid.o: /usr/include/sys/types.h /usr/include/bits/types.h
-testguid.o: /usr/include/bits/typesizes.h /usr/include/time.h
-testguid.o: /usr/include/endian.h /usr/include/bits/endian.h
-testguid.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-testguid.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-testguid.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-testguid.o: /usr/include/bits/pthreadtypes.h /usr/include/sys/time.h
-testguid.o: parttypes.h /usr/include/stdlib.h /usr/include/alloca.h support.h
diff --git a/NEWS b/NEWS
index 70a7cf7..5827153 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,10 @@
0.7.1 (?/?/2011):
-----------------
+- Fixed bug that caused second protective MBR partition, when created
+ as part of a hybrid MBR, to always be of type 0xEE, even when the
+ user specified something else.
+
- Integrated a number of code cleanups contributed by Florian Zumbiehl.
0.7.0 (3/11/2011):
diff --git a/README b/README
index 0cda714..56c6a6b 100644
--- a/README
+++ b/README
@@ -161,6 +161,10 @@
called uuid-dev or something similar to get the headers. On FreeBSD, the
e2fsprogs-libuuid port must be installed.
+* The ICU library (http://site.icu-project.org) is required on all
+ platforms. This library is normally installed in Linux, but you may need
+ to install the development headers (libicu-dev or something similar).
+
* The sgdisk program also requires the popt library and its development
files (headers). Most Linux distributions install popt by default, but
you may need to install a package called popt-dev, popt-devel, or
diff --git a/basicmbr.cc b/basicmbr.cc
index 52076d1..4f2fa34 100644
--- a/basicmbr.cc
+++ b/basicmbr.cc
@@ -1544,15 +1544,13 @@
// user selected the 'q' option. (Thus, the caller should save data
// if the return value is >0, or possibly >=0 depending on intentions.)
int BasicMBRData::DoMenu(const string& prompt) {
- char line[255];
int goOn = 1, quitting = 0, retval, num, haveShownInfo = 0;
unsigned int hexCode = 0x00;
do {
cout << prompt;
- ReadCString(line, sizeof(line));
- switch (*line) {
- case '\n':
+ switch (ReadString()[0]) {
+ case '\0':
break;
case 'a': case 'A':
num = GetNumber(1, MAX_MBR_PARTS, 1, "Toggle active flag for partition: ") - 1;
@@ -1598,13 +1596,9 @@
case 't': case 'T':
num = GetNumber(1, MAX_MBR_PARTS, 1, "Partition to change type code: ") - 1;
if (partitions[num].GetLengthLBA() > 0) {
- hexCode = 0;
while ((hexCode <= 0) || (hexCode > 255)) {
cout << "Enter an MBR hex code: ";
- ReadCString(line, sizeof(line));
- sscanf(line, "%x", &hexCode);
- if (line[0] == '\n')
- hexCode = 0x00;
+ hexCode = StrToHex(ReadString(), 0);
} // while
partitions[num].SetType(hexCode);
} // if
diff --git a/fixparts.cc b/fixparts.cc
index 39d1fb5..8a7c7d0 100644
--- a/fixparts.cc
+++ b/fixparts.cc
@@ -22,21 +22,18 @@
int main(int argc, char* argv[]) {
BasicMBRData mbrTable;
- char *device = NULL;
- int i, doItAgain;
+ string device;
+ int doItAgain;
switch (argc) {
case 1:
cout << "Type device filename, or press <Enter> to exit: ";
- device = new char[255];
- ReadCString(device, 255);
- i = strlen(device);
- if (i && device[i - 1] == '\n')
- device[i - 1] = '\0';
+ device = ReadString();
+ if (device.length() == 0)
+ exit(0);
break;
case 2:
- device = new char[strlen(argv[1]) + 1];
- strcpy(device, argv[1]);
+ device = argv[1];
break;
default:
cerr << "Usage: " << argv[0] << " device_filename\n";
@@ -45,39 +42,39 @@
cout << "FixParts " << GPTFDISK_VERSION << "\n";
cout << "\nLoading MBR data from " << device << "\n";
- mbrTable.ReadMBRData(device);
- if (mbrTable.CheckForGPT() > 0) {
- if ((mbrTable.GetValidity() == hybrid) || (mbrTable.GetValidity() == gpt)) {
- cerr << "\nThis disk appears to be a GPT disk. Use GNU Parted or GPT fdisk on it!\n";
- cerr << "Exiting!\n\n";
- exit(1);
- } else {
- cout << "\nNOTICE: GPT signatures detected on the disk, but no 0xEE protective "
- << "partition!\nThe GPT signatures are probably left over from a previous "
- << "partition table.\nDo you want to delete them (if you answer 'Y', this "
- << "will happen\nimmediately)? ";
- if (GetYN() == 'Y') {
- cout << "Erasing GPT data!\n";
- if (mbrTable.BlankGPTData() != 1)
- cerr << "GPT signature erasure failed!\n";
- } // if
- } // if/else
- } // if
- mbrTable.MakeItLegal();
- do {
- doItAgain = 0;
- if (mbrTable.DoMenu() > 0) {
- cout << "\nFinal checks complete. About to write MBR data. THIS WILL OVERWRITE EXISTING\n"
- << "PARTITIONS!!\n\nDo you want to proceed? ";
- if (GetYN() == 'Y') {
- mbrTable.WriteMBRData();
- mbrTable.DiskSync();
- doItAgain = 0;
+ if (mbrTable.ReadMBRData(device)) {
+ if (mbrTable.CheckForGPT() > 0) {
+ if ((mbrTable.GetValidity() == hybrid) || (mbrTable.GetValidity() == gpt)) {
+ cerr << "\nThis disk appears to be a GPT disk. Use GNU Parted or GPT fdisk on it!\n";
+ cerr << "Exiting!\n\n";
+ exit(1);
} else {
- doItAgain = 1;
- } // else
+ cout << "\nNOTICE: GPT signatures detected on the disk, but no 0xEE protective "
+ << "partition!\nThe GPT signatures are probably left over from a previous "
+ << "partition table.\nDo you want to delete them (if you answer 'Y', this "
+ << "will happen\nimmediately)? ";
+ if (GetYN() == 'Y') {
+ cout << "Erasing GPT data!\n";
+ if (mbrTable.BlankGPTData() != 1)
+ cerr << "GPT signature erasure failed!\n";
+ } // if
+ } // if/else
} // if
- } while (doItAgain);
- delete[] device;
+ mbrTable.MakeItLegal();
+ do {
+ doItAgain = 0;
+ if (mbrTable.DoMenu() > 0) {
+ cout << "\nFinal checks complete. About to write MBR data. THIS WILL OVERWRITE EXISTING\n"
+ << "PARTITIONS!!\n\nDo you want to proceed? ";
+ if (GetYN() == 'Y') {
+ mbrTable.WriteMBRData();
+ mbrTable.DiskSync();
+ doItAgain = 0;
+ } else {
+ doItAgain = 1;
+ } // else
+ } // if
+ } while (doItAgain);
+ } // if read OK
return 0;
} // main()
diff --git a/gdisk.cc b/gdisk.cc
index f824777..35f7e9d 100644
--- a/gdisk.cc
+++ b/gdisk.cc
@@ -28,8 +28,8 @@
int main(int argc, char* argv[]) {
GPTDataTextUI theGPT;
- size_t i;
- char *device = NULL;
+ string device = "";
+ UnicodeString uString;
cout << "GPT fdisk (gdisk) version " << GPTFDISK_VERSION << "\n\n";
@@ -40,14 +40,12 @@
case 1:
WinWarning();
cout << "Type device filename, or press <Enter> to exit: ";
- device = new char[255];
- ReadCString(device, 255);
- i = strlen(device);
- if (i && device[i - 1] == '\n')
- device[i - 1] = '\0';
- if (*device && theGPT.LoadPartitions(device))
+ device = ReadString();
+ if (device.length() == 0)
+ exit(0);
+ else if (theGPT.LoadPartitions(device)) {
MainMenu(device, &theGPT);
- delete[] device;
+ } // if/elseif
break;
case 2: // basic usage
WinWarning();
@@ -56,15 +54,15 @@
break;
case 3: // usage with "-l" option
if (strcmp(argv[1], "-l") == 0) {
- device = argv[2];
+ device = (string) argv[2];
} else if (strcmp(argv[2], "-l") == 0) {
- device = argv[1];
+ device = (string) argv[1];
} else { // 3 arguments, but none is "-l"
cerr << "Usage: " << argv[0] << " [-l] device_file\n";
} // if/elseif/else
- if (device != NULL) {
+ if (device != "") {
theGPT.JustLooking();
- if (theGPT.LoadPartitions((string) device))
+ if (theGPT.LoadPartitions(device))
theGPT.DisplayGPTData();
} // if
break;
@@ -77,22 +75,18 @@
// Accept a command and execute it. Returns only when the user
// wants to exit (such as after a 'w' or 'q' command).
void MainMenu(string filename, GPTDataTextUI* theGPT) {
- char line[255], buFile[255];
int goOn = 1;
PartType typeHelper;
uint32_t temp1, temp2;
do {
cout << "\nCommand (? for help): ";
- ReadCString(line, sizeof(line));
- switch (*line) {
- case '\n':
+ switch (ReadString()[0]) {
+ case '\0':
break;
case 'b': case 'B':
cout << "Enter backup filename to save: ";
- ReadCString(line, sizeof(line));
- sscanf(line, "%s", buFile);
- theGPT->SaveGPTBackup(buFile);
+ theGPT->SaveGPTBackup(ReadString());
break;
case 'c': case 'C':
if (theGPT->GetPartRange(&temp1, &temp2) > 0)
@@ -177,15 +171,13 @@
// Accept a recovery & transformation menu command. Returns only when the user
// issues an exit command, such as 'w' or 'q'.
void RecoveryMenu(string filename, GPTDataTextUI* theGPT) {
- char line[255], buFile[255];
uint32_t numParts;
int goOn = 1, temp1;
do {
cout << "\nRecovery/transformation command (? for help): ";
- ReadCString(line, sizeof(line));
- switch (*line) {
- case '\n':
+ switch (ReadString()[0]) {
+ case '\0':
break;
case 'b': case 'B':
theGPT->RebuildMainHeader();
@@ -239,9 +231,7 @@
break;
case 'l': case 'L':
cout << "Enter backup filename to load: ";
- ReadCString(line, sizeof(line));
- sscanf(line, "%s", buFile);
- theGPT->LoadGPTBackup(buFile);
+ theGPT->LoadGPTBackup(ReadString());
break;
case 'm': case 'M':
MainMenu(filename, theGPT);
@@ -303,19 +293,16 @@
// selects an exit command, such as 'w' or 'q'.
void ExpertsMenu(string filename, GPTDataTextUI* theGPT) {
GPTData secondDevice;
- char line[255], *device;
uint32_t pn, temp1, temp2;
int goOn = 1;
- size_t i;
- char guidStr[255];
+ string guidStr, device;
GUIDData aGUID;
ostringstream prompt;
do {
cout << "\nExpert command (? for help): ";
- ReadCString(line, sizeof(line));
- switch (*line) {
- case '\n':
+ switch (ReadString()[0]) {
+ case '\0':
break;
case 'a': case 'A':
if (theGPT->GetPartRange(&temp1, &temp2) > 0)
@@ -327,8 +314,8 @@
if (theGPT->GetPartRange(&temp1, &temp2) > 0) {
pn = theGPT->GetPartNum();
cout << "Enter the partition's new unique GUID ('R' to randomize): ";
- ReadCString(guidStr, sizeof(guidStr));
- if ((strlen(guidStr) >= 33) || (guidStr[0] == 'R') || (guidStr[0] == 'r')) {
+ guidStr = ReadString();
+ if ((guidStr.length() >= 32) || (guidStr[0] == 'R') || (guidStr[0] == 'r')) {
theGPT->SetPartitionGUID(pn, (GUIDData) guidStr);
cout << "New GUID is " << theGPT->operator[](pn).GetUniqueGUID() << "\n";
} else {
@@ -349,12 +336,13 @@
break;
case 'g': case 'G':
cout << "Enter the disk's unique GUID ('R' to randomize): ";
- ReadCString(guidStr, sizeof(guidStr));
- if ((strlen(guidStr) >= 33) || (guidStr[0] == 'R') || (guidStr[0] == 'r')) {
+ guidStr = ReadString();
+ if ((guidStr.length() >= 32) || (guidStr[0] == 'R') || (guidStr[0] == 'r')) {
theGPT->SetDiskGUID((GUIDData) guidStr);
cout << "The new disk GUID is " << theGPT->GetDiskGUID() << "\n";
- } else
+ } else {
cout << "GUID is too short!\n";
+ } // if/else
break;
case 'h': case 'H':
theGPT->RecomputeCHS();
@@ -397,17 +385,12 @@
break;
case 'u': case 'U':
cout << "Type device filename, or press <Enter> to exit: ";
- device = new char[255];
- ReadCString(device, 255);
- i = strlen(device);
- if (i && device[i - 1] == '\n')
- device[i - 1] = '\0';
- if (*device) {
+ device = ReadString();
+ if (device.length() > 0) {
secondDevice = *theGPT;
secondDevice.SetDisk(device);
secondDevice.SaveGPTData(0);
} // if
- delete[] device;
break;
case 'v': case 'V':
theGPT->Verify();
diff --git a/gpt.cc b/gpt.cc
index 2c5e138..bf99c6a 100644
--- a/gpt.cc
+++ b/gpt.cc
@@ -1028,7 +1028,7 @@
myDisk.Close();
} else {
- cerr << "Unable to open device " << myDisk.GetName() << " for writing! Errno is "
+ cerr << "Unable to open device '" << myDisk.GetName() << "' for writing! Errno is "
<< errno << "! Aborting write!\n";
allOK = 0;
} // if/else
@@ -1078,7 +1078,7 @@
} // if/else
backupFile.Close();
} else {
- cerr << "Unable to open file " << filename << " for writing! Aborting!\n";
+ cerr << "Unable to open file '" << filename << "' for writing! Aborting!\n";
allOK = 0;
} // if/else
return allOK;
@@ -1190,7 +1190,7 @@
} // if
} else {
allOK = 0;
- cerr << "Unable to open file " << filename << " for reading! Aborting!\n";
+ cerr << "Unable to open file '" << filename << "' for reading! Aborting!\n";
} // if/else
return allOK;
@@ -1253,7 +1253,7 @@
<< "other utilities.\n";
delete[] emptyTable;
} else {
- cerr << "Problem opening " << device << " for writing! Program will now terminate.\n";
+ cerr << "Problem opening '" << device << "' for writing! Program will now terminate.\n";
} // if/else (fd != -1)
return (allOK);
} // GPTDataTextUI::DestroyGPT()
@@ -1766,7 +1766,7 @@
secondHeader.partitionEntriesLBA = secondHeader.lastUsableLBA + UINT64_C(1);
} // GPTData::FixSecondHeaderLocation()
-int GPTData::SetName(uint32_t partNum, const string & theName) {
+int GPTData::SetName(uint32_t partNum, const UnicodeString & theName) {
int retval = 1;
if (!IsFreePartNum(partNum)) {
diff --git a/gpt.h b/gpt.h
index ee50bda..eb91bb3 100644
--- a/gpt.h
+++ b/gpt.h
@@ -151,7 +151,7 @@
int SwapPartitions(uint32_t partNum1, uint32_t partNum2);
int ClearGPTData(void);
void MoveSecondHeaderToEnd();
- int SetName(uint32_t partNum, const string & theName = "");
+ int SetName(uint32_t partNum, const UnicodeString & theName = "");
void SetDiskGUID(GUIDData newGUID);
int SetPartitionGUID(uint32_t pn, GUIDData theGUID);
void RandomizeGUIDs(void);
diff --git a/gptpart.cc b/gptpart.cc
index 473e2ef..b5bf771 100644
--- a/gptpart.cc
+++ b/gptpart.cc
@@ -17,6 +17,7 @@
#include <string.h>
#include <stdio.h>
+#include <unicode/ustdio.h>
#include <iostream>
#include "gptpart.h"
#include "attributes.h"
@@ -46,6 +47,16 @@
return partitionType.TypeName();
} // GPTPart::GetNameType()
+// Return a Unicode description of the partition type (e.g., "Linux/Windows
+// data" or "Linux swap").
+UnicodeString GPTPart::GetUTypeName(void) {
+ return partitionType.UTypeName();
+/* UnicodeString temp;
+
+ temp = temp.fromUTF8(partitionType.TypeName());
+ return temp; */
+} // GPTPart::GetNameType()
+
// Compute and return the partition's length (or 0 if the end is incorrectly
// set before the beginning).
uint64_t GPTPart::GetLengthLBA(void) const {
@@ -56,7 +67,7 @@
return length;
} // GPTPart::GetLengthLBA()
-// Return partition's name field, converted to a C++ ASCII string
+/* // Return partition's name field, converted to a C++ ASCII string
string GPTPart::GetDescription(void) {
string theName;
int i;
@@ -67,6 +78,20 @@
theName += name[i];
} // for
return theName;
+} // GPTPart::GetDescription() */
+
+UnicodeString GPTPart::GetDescription(void) {
+ UnicodeString theName;
+ UChar *temp;
+ int i;
+
+ theName = "";
+ temp = (UChar*) name;
+ for (i = 0; i < NAME_SIZE / 2; i++) {
+ if (temp[i] != '\0')
+ theName += temp[i];
+ } // for
+ return theName;
} // GPTPart::GetDescription()
// Return 1 if the partition is in use
@@ -78,41 +103,38 @@
// name *IF* the current name is the generic one for the current partition
// type.
void GPTPart::SetType(PartType t) {
- if (GetDescription() == partitionType.TypeName()) {
+ if (GetDescription() == partitionType.UTypeName()) {
SetName(t.TypeName());
} // if
partitionType = t;
} // GPTPart::SetType()
// Set the name for a partition to theName, or prompt for a name if
-// theName is empty. Note that theName is a standard C++-style ASCII
-// string, although the GUID partition definition requires a UTF-16LE
-// string. This function creates a simple-minded copy for this.
-void GPTPart::SetName(const string & theName) {
- char newName[NAME_SIZE];
- size_t i;
+// theName is empty, using a C++-style string as input.
+void GPTPart::SetName(string theName) {
+ UnicodeString uString;
- // Blank out new name string, so that it will terminate in a null
- // when data are copied to it....
- memset(newName, 0, NAME_SIZE);
+ uString = theName.c_str();
+ SetName(uString);
+} // GPTPart::SetName()
+
+// Set the name for a partition to theName, or prompt for a name
+// if theName is empty, using a Unicode string as input.
+void GPTPart::SetName(UnicodeString theName) {
+ int i;
+ UChar temp[NAME_SIZE / 2];
if (theName == "") { // No name specified, so get one from the user
cout << "Enter name: ";
- ReadCString(newName, NAME_SIZE / 2 + 1);
-
- // Input is likely to include a newline, so remove it....
- i = strlen(newName);
- if (i && newName[i - 1] == '\n')
- newName[i - 1] = '\0';
- } else {
- strcpy(newName, theName.substr(0, NAME_SIZE / 2).c_str());
+ theName = ReadUString();
} // if
- // Copy the C-style ASCII string from newName into a form that the GPT
+ // Copy the C++-style string from newName into a form that the GPT
// table will accept....
- memset(name, 0, NAME_SIZE);
- for (i = 0; i < NAME_SIZE / 2; i++)
- name[i * 2] = newName[i];
+ memset(temp, 0, NAME_SIZE);
+ for (i = 0; i < theName.length(); i++)
+ temp[i] = theName[i];
+ memcpy(name, temp, NAME_SIZE);
} // GPTPart::SetName()
// Set the name for the partition based on the current GUID partition type
@@ -146,6 +168,7 @@
// Display summary information; does nothing if the partition is empty.
void GPTPart::ShowSummary(int partNum, uint32_t blockSize) {
string sizeInIeee;
+ UnicodeString description;
size_t i;
if (firstLBA != 0) {
@@ -166,7 +189,13 @@
cout.setf(ios::uppercase);
cout << hex << partitionType.GetHexType() << " " << dec;
cout.fill(' ');
- cout << GetDescription().substr(0, 23) << "\n";
+// description = GetDescription();
+ GetDescription().extractBetween(0, 24, description);
+ cout << description << "\n";
+// for (i = 0; i < 23; i++)
+// cout << (char) description.;
+// cout << GetDescription().tempSubString(0, 23) << "\n";
+// cout << GetDescription().substr(0, 23) << "\n";
cout.fill(' ');
} // if
} // GPTPart::ShowSummary()
@@ -217,11 +246,16 @@
(firstLBA <= other.lastLBA) != (lastLBA < other.firstLBA);
} // GPTPart::DoTheyOverlap()
-// Reverse the bytes of integral data types; used on big-endian systems.
+// Reverse the bytes of integral data types and of the UTF-16LE name;
+// used on big-endian systems.
void GPTPart::ReversePartBytes(void) {
+ int i;
+
ReverseBytes(&firstLBA, 8);
ReverseBytes(&lastLBA, 8);
ReverseBytes(&attributes, 8);
+ for (i = 0; i < NAME_SIZE; i += 2)
+ ReverseBytes(name + i, 2);
} // GPTPart::ReverseBytes()
/****************************************
@@ -231,20 +265,20 @@
// Change the type code on the partition. Also changes the name if the original
// name is the generic one for the partition type.
void GPTPart::ChangeType(void) {
- char line[255];
+ string line;
int changeName;
PartType tempType = (GUIDData) "00000000-0000-0000-0000-000000000000";
- changeName = (GetDescription() == GetTypeName());
+ changeName = (GetDescription() == GetUTypeName());
cout << "Current type is '" << GetTypeName() << "'\n";
do {
cout << "Hex code or GUID (L to show codes, Enter = 0700): ";
- ReadCString(line, sizeof(line));
+ line = ReadString();
if ((line[0] == 'L') || (line[0] == 'l')) {
partitionType.ShowAllTypes();
} else {
- if (strlen(line) == 1)
+ if (line.length() == 0)
tempType = 0x0700;
else
tempType = line;
diff --git a/gptpart.h b/gptpart.h
index 81653d0..d47f505 100644
--- a/gptpart.h
+++ b/gptpart.h
@@ -54,13 +54,15 @@
PartType & GetType(void) {return partitionType;}
uint16_t GetHexType(void) const;
string GetTypeName(void);
+ UnicodeString GetUTypeName(void);
const GUIDData GetUniqueGUID(void) const {return uniqueGUID;}
uint64_t GetFirstLBA(void) const {return firstLBA;}
uint64_t GetLastLBA(void) const {return lastLBA;}
uint64_t GetLengthLBA(void) const;
Attributes GetAttributes(void) {return attributes;}
void ShowAttributes(uint32_t partNum) {attributes.ShowAttributes(partNum);}
- string GetDescription(void);
+// string GetDescription(void);
+ UnicodeString GetDescription(void);
int IsUsed(void);
// Simple data assignment:
@@ -72,7 +74,9 @@
void SetLastLBA(uint64_t l) {lastLBA = l;}
void SetAttributes(uint64_t a) {attributes = a;}
void SetAttributes(void) {attributes.ChangeAttributes();}
- void SetName(const string & n);
+ void SetName(string theName);
+ void SetName(UnicodeString theName);
+// void SetName(UChar *theName);
void SetDefaultDescription(void);
// Additional functions
diff --git a/gpttext.cc b/gpttext.cc
index aa209cb..ff63be9 100644
--- a/gpttext.cc
+++ b/gpttext.cc
@@ -355,7 +355,7 @@
// OSes that don't understand GPT.
void GPTDataTextUI::MakeHybrid(void) {
uint32_t partNums[3];
- char line[255];
+ string line;
int numPartsToCvt, i, j, mbrNum = 0;
unsigned int hexCode = 0;
MBRPart hybridPart;
@@ -371,8 +371,8 @@
// hybrid MBR....
cout << "Type from one to three GPT partition numbers, separated by spaces, to be\n"
<< "added to the hybrid MBR, in sequence: ";
- ReadCString(line, sizeof(line));
- numPartsToCvt = sscanf(line, "%d %d %d", &partNums[0], &partNums[1], &partNums[2]);
+ line = ReadString();
+ numPartsToCvt = sscanf(line.c_str(), "%d %d %d", &partNums[0], &partNums[1], &partNums[2]);
if (numPartsToCvt > 0) {
cout << "Place EFI GPT (0xEE) partition first in MBR (good for GRUB)? ";
@@ -422,16 +422,11 @@
if (hybridMBR.CountParts() < 4) { // unused entry....
cout << "\nUnused partition space(s) found. Use one to protect more partitions? ";
if (GetYN() == 'Y') {
- while ((hexCode <= 0) || (hexCode > 255)) {
- cout << "Enter an MBR hex code (EE is EFI GPT, but may confuse MacOS): ";
- // Comment on above: Mac OS treats disks with more than one
- // 0xEE MBR partition as MBR disks, not as GPT disks.
- ReadCString(line, sizeof(line));
- sscanf(line, "%x", &hexCode);
- if (line[0] == '\n')
- hexCode = 0x00;
- } // while
- hybridMBR.MakeBiggestPart(3, 0xEE);
+ cout << "Note: Default is 0xEE, but this may confuse Mac OS X.\n";
+ // Comment on above: Mac OS treats disks with more than one
+ // 0xEE MBR partition as MBR disks, not as GPT disks.
+ hexCode = GetMBRTypeCode(0xEE);
+ hybridMBR.MakeBiggestPart(3, hexCode);
} // if (GetYN() == 'Y')
} // if unused entry
protectiveMBR = hybridMBR;
@@ -471,7 +466,7 @@
// Get an MBR type code from the user and return it
int GetMBRTypeCode(int defType) {
- char line[255];
+ string line;
int typeCode;
cout.setf(ios::uppercase);
@@ -480,11 +475,11 @@
cout << "Enter an MBR hex code (default " << hex;
cout.width(2);
cout << defType << "): " << dec;
- ReadCString(line, sizeof(line));
- if (line[0] == '\n')
+ line = ReadString();
+ if (line[0] == '\0')
typeCode = defType;
else
- sscanf(line, "%x", &typeCode);
+ typeCode = StrToHex(line, 0);
} while ((typeCode <= 0) || (typeCode > 255));
cout.fill(' ');
return typeCode;
diff --git a/guid.cc b/guid.cc
index bfbc7d4..b9d102b 100644
--- a/guid.cc
+++ b/guid.cc
@@ -33,6 +33,10 @@
memcpy(uuidData, orig.uuidData, sizeof(uuidData));
} // copy constructor
+GUIDData::GUIDData(const string & orig) {
+ operator=(orig);
+} // copy (from string) constructor
+
GUIDData::GUIDData(const char * orig) {
operator=(orig);
} // copy (from char*) constructor
diff --git a/guid.h b/guid.h
index d22ec86..59e1bc9 100644
--- a/guid.h
+++ b/guid.h
@@ -37,6 +37,7 @@
public:
GUIDData(void);
GUIDData(const GUIDData & orig);
+ GUIDData(const string & orig);
GUIDData(const char * orig);
~GUIDData(void);
diff --git a/parttypes.cc b/parttypes.cc
index fce2d46..99de500 100644
--- a/parttypes.cc
+++ b/parttypes.cc
@@ -270,6 +270,26 @@
return typeName;
} // PartType::TypeName()
+// Return the Unicode description of the partition type (e.g., "Linux/Windows data")
+UnicodeString PartType::UTypeName(void) const {
+ AType* theItem = allTypes;
+ int found = 0;
+ UnicodeString typeName;
+
+ while ((theItem != NULL) && (!found)) {
+ if (theItem->GUIDType == *this) { // found it!
+ typeName = theItem->name.c_str();
+ found = 1;
+ } else {
+ theItem = theItem->next;
+ } // if/else
+ } // while
+ if (!found) {
+ typeName = "Unknown";
+ } // if (!found)
+ return typeName;
+} // PartType::TypeName()
+
// Return the custom GPT fdisk 2-byte (16-bit) hex code for this GUID partition type
// Note that this function ignores entries for which the display variable
// is set to 0. This enables control of which values get returned when
@@ -337,3 +357,29 @@
} // while
return found;
} // PartType::Valid()
+
+/********************************
+ * *
+ * Non-class support functions. *
+ * *
+ ********************************/
+
+// Note: ReadUString() is here rather than in support.cc so that the ICU
+// libraries need not be linked to fixparts.
+
+// Reads a Unicode string from stdin, returning it as a ICU-style string.
+// Note that the returned string will NOT include the carriage return
+// entered by the user.
+UnicodeString ReadUString(void) {
+ UnicodeString inString = "", oneWord;
+
+ do {
+ cin >> oneWord;
+ if (inString.length() > 0)
+ inString += " ";
+ inString += oneWord;
+ } while (cin.peek() != '\n');
+ cin.get(); // discard CR
+ return inString;
+} // ReadUString()
+
diff --git a/parttypes.h b/parttypes.h
index 9f38b76..77ed851 100644
--- a/parttypes.h
+++ b/parttypes.h
@@ -3,6 +3,8 @@
#include <stdint.h>
#include <stdlib.h>
+#include <unicode/unistr.h>
+#include <unicode/ustream.h>
#include <string>
#include "support.h"
#include "guid.h"
@@ -51,6 +53,7 @@
// Retrieve transformed GUID data based on type code matches
string TypeName(void) const;
+ UnicodeString UTypeName(void) const;
uint16_t GetHexType() const;
// Information relating to all type data
@@ -58,4 +61,6 @@
int Valid(uint16_t code) const;
};
+UnicodeString ReadUString(void);
+
#endif
diff --git a/sgdisk.cc b/sgdisk.cc
index e946bb3..802e49b 100644
--- a/sgdisk.cc
+++ b/sgdisk.cc
@@ -30,6 +30,11 @@
int BuildMBR(GPTData& theGPT, char* argument, int isHybrid);
int CountColons(char* argument);
+// Extract colon-separated fields from a string....
+uint64_t GetInt(const string & argument, int itemNum);
+string GetString(string argument, int itemNum);
+
+
int main(int argc, char *argv[]) {
GPTData theGPT, secondDevice;
uint32_t sSize;
@@ -173,7 +178,7 @@
case 'c':
theGPT.JustLooking(0);
partNum = (int) GetInt(partName, 1) - 1;
- if (theGPT.SetName(partNum, GetString(partName, 2))) {
+ if (theGPT.SetName(partNum, (UnicodeString) GetString(partName, 2).c_str())) {
saveData = 1;
} else {
cerr << "Unable to set partition " << partNum + 1
@@ -473,3 +478,39 @@
return num;
} // CountColons()
+
+// Extract integer data from argument string, which should be colon-delimited
+uint64_t GetInt(const string & argument, int itemNum) {
+ uint64_t retval;
+
+ istringstream inString(GetString(argument, itemNum));
+ inString >> retval;
+ return retval;
+} // GetInt()
+
+// Extract string data from argument string, which should be colon-delimited
+// If string begins with a colon, that colon is skipped in the counting. If an
+// invalid itemNum is specified, returns an empty string.
+string GetString(string argument, int itemNum) {
+ size_t startPos = 0, endPos = 0;
+ string retVal = "";
+ int foundLast = 0;
+ int numFound = 0;
+
+ if (argument[0] == ':')
+ argument.erase(0, 1);
+ while ((numFound < itemNum) && (!foundLast)) {
+ endPos = argument.find(':', startPos);
+ numFound++;
+ if (endPos == string::npos) {
+ foundLast = 1;
+ endPos = argument.length();
+ } else if (numFound < itemNum) {
+ startPos = endPos + 1;
+ } // if/elseif
+ } // while
+ if ((numFound == itemNum) && (numFound > 0))
+ retVal = argument.substr(startPos, endPos - startPos);
+
+ return retVal;
+} // GetString()
diff --git a/support.cc b/support.cc
index f51973a..4e7c874 100644
--- a/support.cc
+++ b/support.cc
@@ -15,6 +15,7 @@
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
+#include <unicode/ustdio.h>
#include <string>
#include <iostream>
#include <sstream>
@@ -31,13 +32,15 @@
using namespace std;
-void ReadCString(char *inStr, int numchars) {
- if (!fgets(inStr, numchars, stdin)) {
- cerr << "Error! Failed fgets() in ReadCString()\n";
- if ((numchars > 0) && (inStr != NULL))
- inStr[0] = '\0';
- } // if
-} // ReadCString()
+// Reads a string from stdin, returning it as a C++-style string.
+// Note that the returned string will NOT include the carriage return
+// entered by the user.
+string ReadString(void) {
+ string inString;
+
+ getline(cin, inString);
+ return inString;
+} // ReadString()
// Get a numeric value from the user, between low and high (inclusive).
// Keeps looping until the user enters a value within that range.
@@ -69,12 +72,12 @@
// Gets a Y/N response (and converts lowercase to uppercase)
char GetYN(void) {
- char line[255];
char response;
+ string line;
do {
cout << "(Y/N): ";
- ReadCString(line, sizeof(line));
+ line = ReadString();
response = toupper(line[0]);
} while ((response != 'Y') && (response != 'N'));
return response;
@@ -180,7 +183,7 @@
// (sectorSize defaults to 1).
string BytesToIeee(uint64_t size, uint32_t sectorSize) {
float sizeInIeee;
- uint index = 0;
+ unsigned int index = 0;
string units, prefixes = " KMGTPE";
ostringstream theValue;
@@ -209,7 +212,7 @@
unsigned char retval = 0x00;
unsigned int temp;
- if (input.length() >= (position + 2)) {
+ if (input.length() > position) {
sscanf(input.substr(position, 2).c_str(), "%x", &temp);
retval = (unsigned char) temp;
} // if
@@ -267,39 +270,3 @@
delete[] tempValue;
} // if
} // ReverseBytes()
-
-// Extract integer data from argument string, which should be colon-delimited
-uint64_t GetInt(const string & argument, int itemNum) {
- uint64_t retval;
-
- istringstream inString(GetString(argument, itemNum));
- inString >> retval;
- return retval;
-} // GetInt()
-
-// Extract string data from argument string, which should be colon-delimited
-// If string begins with a colon, that colon is skipped in the counting. If an
-// invalid itemNum is specified, returns an empty string.
-string GetString(string argument, int itemNum) {
- size_t startPos = 0, endPos = 0;
- string retVal = "";
- int foundLast = 0;
- int numFound = 0;
-
- if (argument[0] == ':')
- argument.erase(0, 1);
- while ((numFound < itemNum) && (!foundLast)) {
- endPos = argument.find(':', startPos);
- numFound++;
- if (endPos == string::npos) {
- foundLast = 1;
- endPos = argument.length();
- } else if (numFound < itemNum) {
- startPos = endPos + 1;
- } // if/elseif
- } // while
- if ((numFound == itemNum) && (numFound > 0))
- retVal = argument.substr(startPos, endPos - startPos);
-
- return retVal;
-} // GetString()
diff --git a/support.h b/support.h
index e77c02f..290b737 100644
--- a/support.h
+++ b/support.h
@@ -8,7 +8,7 @@
#ifndef __GPTSUPPORT
#define __GPTSUPPORT
-#define GPTFDISK_VERSION "0.7.1-pre1"
+#define GPTFDISK_VERSION "0.7.1-pre2"
#if defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined (__APPLE__)
// Darwin (Mac OS) only: disk IOCTLs are different, and there is no lseek64
@@ -38,8 +38,8 @@
#define APM_SIGNATURE1 UINT64_C(0x00004D5000000000)
#define APM_SIGNATURE2 UINT64_C(0x0000535400000000)
-// Maximum line length ignored on some input functions
-#define MAX_IGNORED 999
+// Maximum line length on some input functions
+#define MAX_LINE_LENGTH 255
/**************************
* Some GPT constants.... *
@@ -56,7 +56,7 @@
using namespace std;
-void ReadCString(char *inStr, int numchars);
+string ReadString(void);
int GetNumber(int low, int high, int def, const string & prompt);
char GetYN(void);
uint64_t GetSectorNum(uint64_t low, uint64_t high, uint64_t def, uint64_t sSize, const std::string& prompt);
@@ -67,8 +67,4 @@
int IsLittleEndian(void); // Returns 1 if CPU is little-endian, 0 if it's big-endian
void ReverseBytes(void* theValue, int numBytes); // Reverses byte-order of theValue
-// Extract colon-separated fields from a string....
-uint64_t GetInt(const string & argument, int itemNum);
-string GetString(string argument, int itemNum);
-
#endif