On Sat, Jul 17, 2010 at 15:24:52 +0200, Marek Kubica wrote:

> tag +pending
> thanks
> 
> Hi,
> 
> In the course of todays BSP in Munich, I created an NMU patch, you'll
> find it attached. I applied David's patch unchanged. I hope we can
> upload this at the end of the BSP.
> 
> regards,
> Marek

> reverted:
> --- dash-0.5.5.1/debian/dash.preinst
> +++ dash-0.5.5.1.orig/debian/dash.preinst
> @@ -1,27 +0,0 @@
> -#!/bin/sh
> -set -e
> -
> -divert() {
> -     dfile=$1
> -     ltarget=$2
> -     div=$(dpkg-divert --list $dfile)
> -     distrib=${3:-$dfile.distrib}
> -     if [ -z "$div" ]; then
> -             dpkg-divert --package dash --divert $distrib --add $dfile
> -             # This differs from dpkg-divert's --rename because we
> -             # first make a copy of $dfile (the file being diverted)
> -             # in $distrib. Then, a symlink to $ltarget is forcibly created
> -             # from $dfile.
> -             # dpkg-divert's --rename direct equivalent would be:
> -             # mv $dfile $distrib -- but we could end up without a symlink
> -             cp -dp $dfile $distrib
> -             ln -sf $ltarget $dfile
> -     fi
> -}
> -
> -# Divert the following files if no diversion exists already
> -# It is currently used to prevent the files collision between bash and
> -# dash: they both provide the files in the package.
> -divert /bin/sh dash
> -divert /usr/share/man/man1/sh.1.gz dash.1.gz \
> -     /usr/share/man/man1/sh.distrib.1.gz
> diff -u dash-0.5.5.1/debian/changelog dash-0.5.5.1/debian/changelog
> --- dash-0.5.5.1/debian/changelog
> +++ dash-0.5.5.1/debian/changelog
> @@ -1,3 +1,11 @@
> +dash (0.5.5.1-7.1) unstable; urgency=low
> +
> +  * Non-maintainer upload.
> +  * Fix "dash's preinst shouldn't rely on /bin/sh" by applying the patch by
> +    David Riebenbauer (Closes: #546528)
> +
> + -- Marek Kubica <ma...@xivilization.net>  Sat, 17 Jul 2010 15:10:54 +0200
> +
>  dash (0.5.5.1-7) unstable; urgency=low
>  
>    [ Raphael Geissert ]
> diff -u dash-0.5.5.1/debian/rules dash-0.5.5.1/debian/rules
> --- dash-0.5.5.1/debian/rules
> +++ dash-0.5.5.1/debian/rules
> @@ -36,7 +36,7 @@
>         exec ../configure --host='$(DEB_HOST_GNU_TYPE)')
>       touch configure-stamp
>  
> -build: deb-checkdir build-stamp
> +build: preinst-build deb-checkdir build-stamp

this should be a dependency of build-stamp, not build.  Also why not use
debian/dash.preinst directly instead of this indirection?

>  build-stamp: configure-stamp
>       -$(CC) -v
>       (cd build-tmp && exec $(MAKE) CFLAGS='$(CFLAGS)') || \
> @@ -55,6 +55,11 @@
>       rm -f configure-stamp patch-stamp build-stamp po-templates-stamp
>       rm -rf '$(DIR)' '$(DIRA)'
>       rm -f debian/files debian/substvars debian/dash.templates changelog
> +     rm -f debian/dash.preinst
> +
> +preinst-build: debian/dash.preinst
> +debian/dash.preinst: debian/dash.preinst.c
> +     $(CC) -O2 -s -o debian/dash.preinst debian/dash.preinst.c
>  
-s?

>  install: install-indep install-arch
>  install-indep: deb-checkdir deb-checkuid
> only in patch2:
> unchanged:
> --- dash-0.5.5.1.orig/debian/dash.preinst.c
> +++ dash-0.5.5.1/debian/dash.preinst.c
> @@ -0,0 +1,151 @@
> +/* Copyright (c) 2009 David Riebenbuaer <davr...@liegesta.at>
> + *
> + * You may freely use, distribute, and modify this program.
> + */
> +
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <fcntl.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <sys/types.h>
> +#include <sys/wait.h>
> +#include <err.h>
> +#include <errno.h>
> +#include <error.h>
> +
> +#define DPKG_DIVERT "/usr/bin/dpkg-divert"
> +#define LINE_LEN 1024
> +
> +void run_op(const char *const op[])
> +{
> +  pid_t child;
> +
> +  switch (child = fork()) {
> +    case -1:
> +      // fork failed
> +      {
> +        err(EXIT_FAILURE, "fork failed");
> +      }
> +
> +
> +    case 0:
> +      // child
> +      {
> +        execvp(op[0], (char *const *)(op));
> +
> +        err(EXIT_FAILURE, "failed to exec %s", op[0]);
> +      }
> +
> +
> +    default:
> +      // parent
> +      {
> +        int status;
> +        pid_t pid;
> +
> +        pid = waitpid(child, &status, 0);
> +
> +        if (pid != -1) {
> +          if (WIFEXITED(status)) {
> +            if (WEXITSTATUS(status) == 0) {
> +              return;
> +            }
> +            else {
> +              exit(WEXITSTATUS(status));
> +            }
> +          }
> +          else {
> +            fprintf(stderr, "child didn't exit normally");
> +            exit(EXIT_FAILURE);
> +          }
> +        }
> +        else {
> +          err(EXIT_FAILURE, "wait failed");
> +        }
> +
> +        break;
> +      }
> +  }
> +}
> +
> +void divert(const char *target, const char *source, const char *distrib)
> +{
> +  pid_t child;
> +  int pipedes[2];
> +  static char line[LINE_LEN];
> +
> +  memset(line, '\0', LINE_LEN);
> +
> +  if (pipe(pipedes)) {
> +    err(EXIT_FAILURE, "pipe creation failed");
> +  }
> +
> +  switch(child = fork()) {
> +    case -1:
> +      // fork failed
> +      {
> +        int errnum = errno;
> +
> +        close(pipedes[0]);
> +        close(pipedes[1]);
> +        error(EXIT_FAILURE, errnum, "fork failed");
> +      }
> +
> +
> +    case 0:
> +      // child
> +      {
> +        if (dup2(pipedes[STDOUT_FILENO], STDOUT_FILENO) < 0) {
> +          err(EXIT_FAILURE, "replacing stdout with pipe failed");
> +        }
> +

kind of weird to use STD{IN,OUT}_FILENO here, but 0 and 1 three lines
earlier.

> +        close(pipedes[STDIN_FILENO]);
> +        close(pipedes[STDOUT_FILENO]);
> +
> +        execlp(DPKG_DIVERT, DPKG_DIVERT, "--list", target, NULL);
> +

(void *)NULL instead of NULL.

> +        err(EXIT_FAILURE, "dpkg-divert exec failed");
> +      }
> +
> +
> +    default:
> +      // parent
> +      {
> +        FILE *fd;
> +
> +        close(pipedes[STDOUT_FILENO]);
> +        fcntl(pipedes[STDIN_FILENO], F_SETFD, FD_CLOEXEC);
> +        fd = fdopen(pipedes[STDIN_FILENO], "r");
> +
> +        while (fgets(line, LINE_LEN, fd) != NULL) {
> +          line[strlen(line)-1] = '\0';
> +          break;
> +        }
> +        fclose(fd);
> +

missing waitpid() and handling of dpkg-divert --list failure?

> +        break;
> +      }
> +  }
> +
> +  if (strlen(line) == 0) {
> +    const char *const dpkg_divert_op[] = {DPKG_DIVERT, "--package", "dash",
> +      "--divert", distrib, "--add", target, NULL};
> +    const char *const cp_op[] = {"cp", "-pd", target, distrib, NULL};
> +    const char *const ln_op[] = {"ln", "-fs", source, target, NULL};
> +
> +    run_op(dpkg_divert_op);
> +    run_op(cp_op);
> +    run_op(ln_op);
> +  }
> +}
> +
> +int main(void)
> +{
> +  divert("/bin/sh", "dash", "/bin/sh.distrib");
> +  divert("/usr/share/man/man1/sh.1.gz", "dash.1.gz",
> +      "/usr/share/man/man1/sh.distrib.1.gz");
> +
> +  return EXIT_SUCCESS;
> +}
> +

Cheers,
Julien

Attachment: signature.asc
Description: Digital signature

Reply via email to