Hi,

I got the same error message.

In contrast, there is no such an error if I make use
of the wrapper chfn.fakechroot below :
$ chmod +x chfn.fakechroot
$ export FAKECHROOT_CMD_SUBST=/usr/bin/chfn=$(readlink -f chfn.fakechroot)
$ debirf make rescue
[ ... ]
debirf> debirf initrd created.
debirf> kernel: /home/me/rescue/vmlinuz-3.16-2-amd64
debirf> initrd: /home/me/rescue/debirf-rescue_sid_3.16-2-amd64.cgz
$ echo $?
0

It seems that this bug #763391 and #745082 share a common cause.

Regards,
JH Chatenet

File chfn.fakechroot :
----------8<-------------------8<------------------
#!/bin/bash

# chfn
#
# Replacement for chfn command which changes a gecos field in
# etc/passwd under the (fake)chroot.  There is no locking and no permission 
check.

which_option() {
        option_name="$1"
        option_value="$2"
        case $option_name in
                -f|--full-name)
                        has_new_name=1
                        new_name="$(echo $option_value|tr -d ':,=')"
                        ;;
                -h|--home-phone)
                        has_new_home_phone=1
                        new_home_phone="$(echo $option_value|tr -d ':,=')"
                        ;;
                -o|--other)
                        has_new_other=1
                        new_other="$(echo $option_value|tr -d ':')"
                        ;;
                -r|--room)
                        has_new_room=1
                        new_room="$(echo $option_value|tr -d ':,=')"
                        ;;
                -R|--root)
                        has_root=1
                        root="$option_value"
                        ;;
                -w|--work-phone)
                        has_new_work_phone=1
                        new_work_phone="$(echo $option_value|tr -d ':,=')"
                        ;;
        esac
}

parse_gecos_field() {
        gecos_field="$1"

        old_name="${gecos_field%%,*}"
        gecos_field="${gecos_field#$old_name}"

        if [ -z "$gecos_field" ]; then
                return
        else
                gecos_field="${gecos_field#,}"
        fi

        old_room="${gecos_field%%,*}"
        gecos_field="${gecos_field#$old_room}"
        gecos_field="${gecos_field#,}"

        old_work_phone="${gecos_field%%,*}"
        gecos_field="${gecos_field#$old_work_phone}"
        gecos_field="${gecos_field#,}"

        old_home_phone="${gecos_field%%,*}"
        gecos_field="${gecos_field#$old_home_phone}"
        gecos_field="${gecos_field#,}"

        if [ -n "$gecos_field" ]; then
                has_old_other=1
                old_other="$gecos_field"
        fi
}

while [ $# -gt 0 ]; do
        case $1 in
                -u|--help)
                        echo "fakechroot : replacement of chfn"
                        chfn -u
                        exit 0
                        ;;
                
-f|--full-name|-h|--home-phone|-o|--other|-r|--room|-R|--root|-w|--work-phone)
                        option_name="$1"
                        option_value="$2"
                        which_option "$option_name" "$option_value"
                        shift 2
                        ;;
                
--full-name=*|--home-phone=*|--other=*|--room=*|--root=*|--work-phone=*)
                        option_name="${1%%=*}"
                        option_value="${1#*=}"
                        which_option "$option_name" "$option_value"
                        shift
                        ;;
                -f*|-h*|-o*|-r*|-R*|-w*)
                        option_value="${1#-?}"
                        option_name="${1%$option_value}"
                        which_option "$option_name" "$option_value"
                        shift
                        ;;
                --)
                        shift
                        break
                        ;;
                *)
                        break
                        ;;
        esac
done

if [ $# -gt 0 ]; then
        user="$1"
else
        user=$(id -u -n)
fi


# Where is the root ?
if [ -n "$root" ]; then
        if [ "${root#/}" != "$root" ]; then
                root="${FAKECHROOT_BASE_ORIG}${root}"
        fi
else
        root="$FAKECHROOT_BASE_ORIG"
fi

if [ ! -e "$root/etc/passwd" ]; then
        echo "fakechroot chfn replacement : $root/etc/passwd : no such file" >&2
        exit 1
fi

# Is there such user ?
grep -q "^${user}:" "$root/etc/passwd"
ret=$?

if [ $ret -eq 1 ]; then
        echo "fakechroot chfn replacement : $user : no such user" >&2
        exit 2
elif [ $ret -eq 2 ]; then
        echo "fakechroot chfn replacement : grep error" >&2
        exit 3
fi

# What is the old gecos field ?
old_gecos_field=$(sed -n "/^${user}/ {s/^\([^:]*:\)\{4\}\([^:]*\):.*$/\2/;p;q}" 
"$root/etc/passwd")

parse_gecos_field "$old_gecos_field"

# Assemble new gecos

if [ -n "$has_new_name" ]; then
        new_gecos_field="$new_name"
else
        new_gecos_field="$old_name"
fi

if [ -n "$has_new_room" ]; then
        new_gecos_field="${new_gecos_field},$new_room"
else
        new_gecos_field="${new_gecos_field},$old_room"
fi

if [ -n "$has_new_work_phone" ]; then
         new_gecos_field="${new_gecos_field},$new_work_phone"
else
         new_gecos_field="${new_gecos_field},$old_work_phone"
fi

if [ -n "$has_new_home_phone" ]; then
        new_gecos_field="${new_gecos_field},$new_home_phone"
else
        new_gecos_field="${new_gecos_field},$old_home_phone"
fi

if [ -n "$has_new_other" ]; then
        new_gecos_field="${new_gecos_field},$new_other"
elif [ -n "$has_old_other" ]; then
        new_gecos_field="${new_gecos_field},$old_other"
fi

name_only="${new_gecos_field%%,*}"

if [ "${new_gecos_field#$name_only}" = ",,," ]; then
        new_gecos_field="$name_only"
fi

# New /etc/passwd
sed -i "s/^\(${user}:\([^:]*:\)\{3\}\)\([^:]*\)/\1${new_gecos_field}/" 
"$root/etc/passwd"
----------8<-------------------8<------------------


-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to