Preliminary UTF-16LE support for GPT descriptions

This commit is contained in:
srs5694
2011-03-17 13:53:01 -04:00
parent c2f6e0cb81
commit 5a6085310b
18 changed files with 282 additions and 605 deletions

402
Makefile
View File

@@ -14,10 +14,10 @@ DEPEND= makedepend $(CXXFLAGS)
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 @@ $(OBJS):
$(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

4
NEWS
View File

@@ -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):

4
README
View File

@@ -161,6 +161,10 @@ used.) In addition, note these requirements:
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

View File

@@ -1544,15 +1544,13 @@ MBRPart* BasicMBRData::GetPartition(int i) {
// 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 @@ int BasicMBRData::DoMenu(const string& prompt) {
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

View File

@@ -22,21 +22,18 @@ using namespace std;
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 @@ int main(int argc, char* argv[]) {
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()

View File

@@ -28,8 +28,8 @@ void WinWarning(void);
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 @@ int main(int argc, char* argv[]) {
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 @@ int main(int argc, char* argv[]) {
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 @@ int main(int argc, char* argv[]) {
// 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 @@ void ShowCommands(void) {
// 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 @@ void RecoveryMenu(string filename, GPTDataTextUI* theGPT) {
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 @@ void ShowRecoveryCommands(void) {
// 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 @@ void ExpertsMenu(string filename, GPTDataTextUI* theGPT) {
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 @@ void ExpertsMenu(string filename, GPTDataTextUI* theGPT) {
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 @@ void ExpertsMenu(string filename, GPTDataTextUI* theGPT) {
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();

10
gpt.cc
View File

@@ -1028,7 +1028,7 @@ int GPTData::SaveGPTData(int quiet) {
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 @@ int GPTData::SaveGPTBackup(const string & filename) {
} // 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 @@ int GPTData::LoadGPTBackup(const string & filename) {
} // 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 @@ int GPTData::DestroyGPT(void) {
<< "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 @@ void GPTData::MoveSecondHeaderToEnd() {
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)) {

2
gpt.h
View File

@@ -151,7 +151,7 @@ public:
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);

View File

@@ -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 @@ string GPTPart::GetTypeName(void) {
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 @@ uint64_t GPTPart::GetLengthLBA(void) const {
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 @@ string GPTPart::GetDescription(void) {
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 @@ int GPTPart::IsUsed(void) {
// 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 @@ bool GPTPart::operator<(const GPTPart &other) const {
// 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 @@ void GPTPart::ShowSummary(int partNum, uint32_t blockSize) {
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 @@ int GPTPart::DoTheyOverlap(const GPTPart & other) {
(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 @@ void GPTPart::ReversePartBytes(void) {
// 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;

View File

@@ -54,13 +54,15 @@ class GPTPart {
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 @@ class GPTPart {
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

View File

@@ -355,7 +355,7 @@ void GPTDataTextUI::ShowDetails(void) {
// 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 @@ void GPTDataTextUI::MakeHybrid(void) {
// 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 @@ void GPTDataTextUI::MakeHybrid(void) {
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 @@ int GPTDataTextUI::XFormToMBR(void) {
// 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 @@ int GetMBRTypeCode(int defType) {
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;

View File

@@ -33,6 +33,10 @@ GUIDData::GUIDData(const GUIDData & orig) {
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

1
guid.h
View File

@@ -37,6 +37,7 @@ class GUIDData {
public:
GUIDData(void);
GUIDData(const GUIDData & orig);
GUIDData(const string & orig);
GUIDData(const char * orig);
~GUIDData(void);

View File

@@ -270,6 +270,26 @@ string PartType::TypeName(void) const {
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 @@ int PartType::Valid(uint16_t code) const {
} // 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()

View File

@@ -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 @@ public:
// 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 @@ public:
int Valid(uint16_t code) const;
};
UnicodeString ReadUString(void);
#endif

View File

@@ -30,6 +30,11 @@ using namespace std;
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 @@ int main(int argc, char *argv[]) {
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 @@ int CountColons(char* argument) {
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()

View File

@@ -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 @@ int GetNumber(int low, int high, int def, const string & prompt) {
// 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 @@ uint64_t IeeeToInt(string inValue, uint64_t sSize, uint64_t low, uint64_t high,
// (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 StrToHex(const string & input, unsigned int position) {
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 @@ void ReverseBytes(void* theValue, int numBytes) {
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()

View File

@@ -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 IsHex(const string & input); // Returns 1 if input can be hexadecimal number
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