Package: dpkg
Version: 1.10.27

The attached patch adds the following information to the reports of
--status-fd (and updates the man-page):

Errors are reported as:
`status: $pkg : error : extend-error-message

Configuration file conflicts are reported as
`status: conffile-prompt: $conffile : 'current-conffile' 'new-conffile' 
useredited distedited`

This is usefull for GUI tools (like synaptic) that want to hide the
dpkg-messages and present nice status progress bar instead.

Cheers,
 Michael
--- orig/main/configure.c
+++ mod/main/configure.c
@@ -53,6 +53,9 @@
                const char* realnew, int useredited, int distedited,
                enum conffopt what);
 
+extern struct pipef *status_pipes;
+
+
 void deferred_configure(struct pkginfo *pkg) {
        /* The algorithm for deciding what to configure first is as follows:
         * Loop through all packages doing a `try 1' until we've been round
@@ -215,7 +218,7 @@
                        debug(dbg_conff,
                                        "deferred_configure `%s' (= `%s') 
useredited=%d distedited=%d what=%o",
                                        conff->name, cdr.buf, useredited, 
distedited, what);
-
+                       
                        what=promptconfaction(conff->name, cdr.buf, cdr2.buf, 
useredited, distedited, what);
 
                        switch (what & ~cfof_isnew) {
@@ -525,6 +528,27 @@
        if (!(what&cfof_prompt))
                return what;
 
+       /* if there is a status pipe, send conffile-prompt there */
+       if (status_pipes) {
+          static struct varbuf *status= NULL;
+          struct pipef *pipef= status_pipes;
+          int r;
+          if (status == NULL) {
+             status = nfmalloc(sizeof(struct varbuf));
+             varbufinit(status);
+          } else
+             varbufreset(status);
+          
+          r= varbufprintf(status, "status: %s : %s : '%s' '%s' %i %i \n", 
+                          cfgfile, "conffile-prompt", 
+                          realold, realnew, useredited, distedited);
+          while (pipef) {
+             write(pipef->fd, status->buf, r);
+             pipef= pipef->next;
+          }
+       }
+       
+
        do {
                fprintf(stderr, _("\nConfiguration file `%s'"), cfgfile);
                if (strcmp(cfgfile, realold))


--- orig/main/dpkg.8
+++ mod/main/dpkg.8
@@ -477,6 +477,9 @@
 \fB\-\-status\-fd \fP\fI<n>\fP
 Send package status info to file descriptor \fI<n>\fP.  This can be given
 multiple times.  Status updates are of the form `status: <pkg>: <pkg qstate>'.
+Errors are reported as `status: <pkg>: error: extend-error-message'.
+Configuration file conflicts are reported as 
+`status: conffile-prompt: conffile : 'current-conffile' 'new-conffile' 
useredited distedited'
 .SH FILES
 .TP
 .I /etc/dpkg/dpkg.cfg


--- orig/main/errors.c
+++ mod/main/errors.c
@@ -50,11 +50,32 @@
 static struct error_report **lastreport= &reports;
 static struct error_report emergency;
 
+extern struct pipef *status_pipes;
+
 void print_error_perpackage(const char *emsg, const char *arg) {
   struct error_report *nr;
   
   fprintf(stderr, _("%s: error processing %s (--%s):\n %s\n"),
           DPKG, arg, cipaction->olong, emsg);
+
+  if (status_pipes) {
+     static struct varbuf *status= NULL;
+     struct pipef *pipef= status_pipes;
+     int r;
+     if (status == NULL) {
+       status = nfmalloc(sizeof(struct varbuf));
+       varbufinit(status);
+     } else
+       varbufreset(status);
+
+     r= varbufprintf(status, "status: %s : %s : %s\n", arg, "error",emsg);
+     while (pipef) {
+       write(pipef->fd, status->buf, r);
+       pipef= pipef->next;
+     }
+  }
+
+
   nr= malloc(sizeof(struct error_report));
   if (!nr) {
     perror(_("dpkg: failed to allocate memory for new entry in list of failed 
packages."));


--- orig/man/en/dpkg.8.sgml
+++ mod/man/en/dpkg.8.sgml
@@ -1329,11 +1329,15 @@
          </cmdsynopsis>
        </term>
 
-       <listitem><para>
+       <listitem><para> 
          Send package status info to file descriptor
          <option>&lt;n&gt;</option>. This can be given multiple times.
          Status updates are of the form 
          <screen>`status: &lt;pkg&gt;: &lt;pkg qstate&gt;'</screen>
+         Errors are reported as 
+         <screen>`status: &lt;pkg&gt; : error : extend-error-message`</screen>
+         Configuration file conflicts are reported as 
+         <screen>`status: conffile-prompt:&lt;conffile&gt; : 
'current-conffile' 'new-conffile' useredited distedited`</screen>
        </para></listitem>
       </varlistentry>
     </variablelist>



Reply via email to