# do not edit this file
# all user configuration options are in
#
#		Makefile.config
#
# Use "make clean" to tidy up the source directory
#
# Use "make check_linux" to get some basic info about your Linux
#
# Use "make trial_patch_intl" to see if the international patch is OK
#
# Use "make apply_patch_intl" to patch the kernel
#
# Use "make trial_patch_jari" to see if the jari loop patch is OK
#
# Use "make apply_patch_jari" to patch the kernel
#
# Use "make trial_patch_ppdd" to see if the ppdd patch would apply
#
# Use "make apply_patch_ppdd" to patch the kernel
#
# Use "make trial_patch_util" to see if the util-linux patch would apply
#
# Use "make apply_patch_util" to patch util-linux
#
# Use "make trial_patch_mount" to see if the mount patch would apply
#
# Use "make apply_patch_mount" to patch util-linux/mount
#
# Use "make trial_patch_looplabels" to see if the loop labels patches apply
#
# Use "make apply_patch_looplabels" to see if the loop labels patches apply
#
# Use "make" or "make all" to compile the user programs
#            (note you must patch the kernel first)
# 
# Use "make initrd" to create an initrd for root filesystems
#            (note you need ram disc in the running kernel too)
#
# Use "make install" to install the user programs
#
# Use "make tests" to test everything
#            (note you must install the programs first and 
#             reboot and run from the ppdd patched kernel)   
#
# Use "make bootdisk" to make a bootable floppy for use with
#			root filesystem encryption
#
# You must modify your lilo configuation yourself !!!!
#
# If you are going to run ppdd on the root filesystem
# you must modify your init scripts yourself !!!!
#
# Please do not use any of the other make functions directly
#

include Makefile.config

PPDD_REVISION = 1.10
INITRD_SIZE=4096
CC = gcc
AR = ar
ARFLAGS = -r
CFLAGS = -I$(KERNEL_PATH)/linux/include -O2 -fno-builtin
SLDFLAGS = -static
WARNFLAGS = -Wall -Wstrict-prototypes -Wmissing-prototypes

# End of configuration section.

LOOP_MAJOR = 7

KSOURCE_PATH = $(KERNEL_PATH)/linux

COMPILE = $(CC) -c $(WARNFLAGS) $(CFLAGS) $(DEFINES)
ARCH = $(AR) $(ARFLAGS)
LINK = $(CC) $(LDFLAGS)
SLINK = $(CC) $(SLDFLAGS)

SBINPROGS = \
  ppddpassw \
  ppdecrypt \
  ppdncrypt \
  ppddcsum \
  ppddenter \
  ppddmchk

SBINSCRIPTS = 
IRDPROGS = 
PROGS = $(SBINPROGS) $(IRDPROGS)

LO_OBJS = \
  bf.o  \
  Blowfish_Decrypt_cbc.o \
  Blowfish_Encrypt_cbc.o \
  Blowfish_Decrypt_ecb.o \
  Blowfish_Encrypt_ecb.o \
  check_access.o \
  checkcsum.o \
  checkpass.o \
  crc32.o \
  find_ppdd_entry.o \
  getfilesize.o \
  getnewpass.o \
  getoldpass.o \
  make_crc.o \
  make_key.o \
  make_key_16.o \
  md5.o \
  newpass.o \
  ppdd_intro.o \
  ppdd_scramble.o \
  ppdd_unscramble.o \
  ppdderror.o \
  random_fill_fast.o \
  random_fill_slow.o \
  read_control_block.o \
  readoldpass.o \
  setup_bf.o \
  transfer_bf.o \
  write_control_block.o \
  write_md5_block.o
 

 
all: check_before_all $(PROGS)

%.o: %.c
	$(COMPILE) $<

libppdd.a : $(LO_OBJS)
	$(AR) $(ARFLAGS) libppdd.a $(LO_OBJS)

ppddenter: ppddenter.o libppdd.a 
	$(LINK) $^ -o $@

ppddcsum: ppddcsum.o libppdd.a
	$(LINK) $^ -o $@

ppdncrypt: ppdncrypt.o libppdd.a
	$(LINK) $^ -o $@

ppdecrypt: ppdecrypt.o libppdd.a
	$(LINK) $^ -o $@

ppddpassw: ppddpassw.o  libppdd.a
	$(LINK) $^ -o $@

ppddenter.o: ppddmount.h ppdderror.h
ppddreopen.o: ppddmount.h ppdderror.h
ppddcsum.o: ppddmount.h md5.h ppdderror.h
ppdncrypt.o: ppddmount.h md5.h ppdderror.h
ppdecrypt.o: ppddmount.h md5.h ppdderror.h
ppddpassw.o: ppddmount.h ppdderror.h
ppdderror.o: ppdderror.h


clean:
	@rm -f libppdd.a initrd.rd a.out core *~ *.o $(PROGS) 
	@(umount /dev/ram0 2>/dev/null; exit 0)
	@(umount /dev/loop$(LOOPDEV) 2>/dev/null;umount test_dir/mnt 2>/dev/null;exit 0)
	@sleep 1
	@(losetup -d /dev/loop$(LOOPDEV) 2>/dev/null >/dev/null;exit 0)
	@rm -rf test_dir
	@echo Clean


check_rr:
	@(if [ ! -b ${REAL_ROOT_DEVICE} ]; then \
	echo ${REAL_ROOT_DEVICE} is not a block special file; \
	exit 1; \
	fi)


initrd: check_rr
	@(umount /dev/loop$(LOOPDEV) 2>/dev/null; exit 0)
	@(umount initrd 2>/dev/null; exit 0)
	@(losetup -d /dev/loop$(LOOPDEV) 2>/dev/null; exit 0)
	@cp initrd.init initrd.rd
	@losetup /dev/loop$(LOOPDEV) initrd.rd
	@mount /dev/loop$(LOOPDEV) initrd
	@if [ "${ROOT_CHECKSUM}" = "Y" ]; then touch initrd/csum; \
chmod 0 initrd/csum; fi
	@(MAJOR=`ls -l ${REAL_ROOT_DEVICE}|sed -e"s/  */ /g" -e"s/,//"|cut -d" " -f5`; \
	MINOR=`ls -l ${REAL_ROOT_DEVICE}|sed -e"s/  */ /g" -e"s/,//"|cut -d" " -f6`; \
	echo; \
	echo Real root device is ${REAL_ROOT_DEVICE} Major=$${MAJOR} Minor=$${MINOR}; \
	echo "#!/bin/ash" >initrd/makedev; \
	echo "mknod /dev/hd b $${MAJOR} $${MINOR}" >>initrd/makedev)
	@chmod a+x initrd/makedev
	@umount /dev/loop$(LOOPDEV)
	@losetup -d /dev/loop$(LOOPDEV)
	@sync
	@echo
	@echo Initial ram disk created OK


install:
	@(for N in 1 5 ; \
	do \
		cp -f man/*.$$N $(INSTALL_MAN_DIR)/man$$N; \
	done)
	@echo ppdd man pages installed in $(INSTALL_MAN_DIR)
	@cp -f libppdd.a $(INSTALL_LIB_DIR)
	@echo libppdd.a installed in $(INSTALL_LIB_DIR)
	@cp -f $(SBINPROGS) $(SBINSCRIPTS) $(INSTALL_DIR)
	@(cd $(INSTALL_DIR); \
chown 0.0 $(SBINPROGS) $(SBINSCRIPTS); \
chmod 500 $(SBINPROGS) $(SBINSCRIPTS))
	@echo ppdd programs installed in $(INSTALL_DIR)
ifneq ($(INSTALL_INITRD_DIR),)
	@(if [ -f initrd.rd ]; then \
 cp -f initrd.rd $(INSTALL_INITRD_DIR); \
 echo ppdd initrd installed in $(INSTALL_INITRD_DIR); else \
 echo no initrd available to install in $(INSTALL_INITRD_DIR); fi)
ifeq ($(HAVE_LILO),Y)
	@echo running lilo to install in bootstrap
	@lilo
endif
endif


check_linux:
	@echo You asked for Linux version $(KERNEL_REVISION)
	@echo -n You are running on Linux version `cat /proc/version|cut -d" " -f3`" "
	@(PPDDCBC=`ls /proc/crypto/cipher/ppdd-cbc 2>/dev/null`; \
if [ "$${PPDDCBC}" = "" ]; then \
echo without ppdd support; else \
echo with ppdd installed; fi)
	@(if [ -f $(KSOURCE_PATH)/include/linux/version.h ]; then \
echo $(KSOURCE_PATH) contains Linux version \
`cat $(KSOURCE_PATH)/include/linux/version.h|fgrep "UTS"|cut -d'"' -f2`; else \
echo $(KSOURCE_PATH) contains no source or has not been compiled; fi)
	@(if [ -f $(KSOURCE_PATH)/include/linux/ppdd.h ]; then \
echo $(KSOURCE_PATH) contains the ppdd patch; \
diff -q $(KSOURCE_PATH)/include/linux/ppdd.h \
 linux-common-ppdd/include/linux/ppdd.h 2>&1 >/dev/null; \
if [ $$? != 0 ]; then \
echo but it differs from the one in this release; fi; else \
echo $(KSOURCE_PATH) does not contain the ppdd patch; fi)


check_before_all:
	@(if [ ! -f $(KSOURCE_PATH)/include/linux/version.h ]; then \
 echo $(KSOURCE_PATH) contains no source or has not been compiled; \
 exit 1; fi)
	@(SREV=`cat $(KSOURCE_PATH)/include/linux/version.h \
 |fgrep "UTS"|cut -d'"' -f2`; \
 if [ $${SREV} != $(KERNEL_REVISION) ]; then \
 echo You asked me to make ppdd for Linux $(KERNEL_REVISION) but your source is $${SREV}; \
 exit 1; fi)
	@(if [ ! -f $(KSOURCE_PATH)/include/linux/ppdd.h ]; then \
 echo $(KSOURCE_PATH) does not contain the ppdd patch; \
 exit 1; fi)
	@(diff -q $(KSOURCE_PATH)/include/linux/ppdd.h \
 linux-common-ppdd/include/linux/ppdd.h 2>&1 >/dev/null; \
if [ $$? != 0 ]; then \
echo The kernel patch is not the one from this release; exit 1; fi)


check_before_patch:
	@(if [ ! -f $(KSOURCE_PATH)/include/linux/version.h ]; then \
 echo $(KSOURCE_PATH) contains no source or has not been compiled; \
 exit 1; fi)
	@(SREV=`cat $(KSOURCE_PATH)/include/linux/version.h \
 |fgrep "UTS"|cut -d'"' -f2`; \
 if [ $${SREV} != $(KERNEL_REVISION) ]; then \
 echo You asked me to make ppdd for Linux $(KERNEL_REVISION) but your source is $${SREV}; \
 exit 1; fi)
	@(if [ -f $(KSOURCE_PATH)/include/linux/ppdd.h ]; then \
 echo $(KSOURCE_PATH) already contains the ppdd patch; \
 exit 1; fi)
	@(if [ ! -f ./patches/$(KERNEL_REVISION) ]; then \
 echo Sorry - I do not have a patch for $(KERNEL_REVISION); exit 1; fi)


trial_patch_intl: check_before_patch
	@patch --dry-run -d $(KERNEL_PATH)/linux -p1 <patches/$(INTL_PATCH)

apply_patch_intl: check_before_patch
	@patch -bVt -d $(KERNEL_PATH)/linux -p1 < patches/$(INTL_PATCH)	

trial_patch_jari: check_before_patch
	@patch --dry-run -d $(KERNEL_PATH)/linux -p1 <patches/$(JARI_PATCH)

apply_patch_jari: check_before_patch
	@patch -bVt -d $(KERNEL_PATH)/linux -p1 < patches/$(JARI_PATCH)	

trial_patch_ppdd: check_before_patch
	@patch --dry-run -d $(KERNEL_PATH)/linux -p1 <patches/$(KERNEL_REVISION)

apply_patch_ppdd: check_before_patch
	@patch -bVt -d $(KERNEL_PATH)/linux -p1 < patches/$(KERNEL_REVISION)	

trial_patch_util: 
	@patch --dry-run -d $(UTIL_LINUX) -p1 <patches/$(UTIL_LINUX_PATCH)

apply_patch_util: 
	@patch -bVt -d $(UTIL_LINUX) -p1 <patches/$(UTIL_LINUX_PATCH)

trial_patch_mount: 
	@patch --dry-run -d $(UTIL_LINUX) -p1 <patches/$(UTIL_LINUX_PPDD_PATCH)

apply_patch_mount: 
	@patch -bVt -d $(UTIL_LINUX) -p1 <patches/$(UTIL_LINUX_PPDD_PATCH)

trial_patch_looplabels: 
	@(patch --dry-run -d $(UTIL_LINUX) -p1 <patches/$(UTIL_LINUX_LOOPLABELS_PATCH); \
R=$$?; \
patch --dry-run -d $(E2FSPROGS) -p1 <patches/$(E2FSPROGS_PATCH); \
S=$$?; \
X=$$[ $$R + $$S ]; \
exit $$X)

apply_patch_looplabels: 
	@(patch -bVt -d $(UTIL_LINUX) -p1 <patches/$(UTIL_LINUX_LOOPLABELS_PATCH); \
R=$$?; \
patch -bVt -d $(E2FSPROGS) -p1 <patches/$(E2FSPROGS_PATCH); \
S=$$?; \
X=$$[ $$R + $$S ]; \
exit $$X)


bootdisk:
	@(umount floppy 2>/dev/null;exit 0)
	@mke2fs -b1024 $(FLOPPY_DEVICE)
	@(rmdir floppy 2>/dev/null; exit 0)
	@mkdir floppy
	@mount $(FLOPPY_DEVICE) floppy
	@cp $(FLOPPY_KERNEL) floppy/vmlinuz
	@gzip -v9 <initrd.rd >floppy/initrd
	@echo boot=$(FLOPPY_DEVICE) > floppy/lilo.conf
	@echo map=floppy/map >> floppy/lilo.conf
	@echo install=/boot/boot.b >> floppy/lilo.conf
	@echo image=floppy/vmlinuz >> floppy/lilo.conf
	@echo initrd=floppy/initrd >> floppy/lilo.conf
	@echo root=/dev/ram0 >> floppy/lilo.conf
	@echo append=\"init=linuxrc\" >> floppy/lilo.conf
	@echo read-only >> floppy/lilo.conf
	@lilo -C floppy/lilo.conf
	@umount floppy
	@rmdir floppy
	@echo boot floppy written on $(FLOPPY_DEVICE)

include Makefile.tests

