]> err.no Git - dpkg/commitdiff
Refactor status-fd duplicate output code into a new function
authorGuillem Jover <guillem@debian.org>
Tue, 25 Mar 2008 05:02:56 +0000 (07:02 +0200)
committerGuillem Jover <guillem@debian.org>
Tue, 25 Mar 2008 05:47:50 +0000 (07:47 +0200)
Based on a patch by Ian Jackson <ian@davenant.greenend.org.uk>.

ChangeLog
TODO
lib/dbmodify.c
lib/dpkg-db.h
lib/dpkg.h
lib/log.c
src/configure.c
src/errors.c

index 57eef74dcec516bd9a66649e176ced4075978750..562fdda827c4fc0c765a46b4f3543c2a06251246 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2008-03-25  Ian Jackson  <ian@davenant.greenend.org.uk>,
+            Guillem Jover  <guillem@debian.org>
+
+       * lib/dbmodify.c (status_pipes): Move definitions to ...
+       * lib/log.c: ... here.
+       * lib/dpkg-db.h (struct pipef, status_pipes): Move declarations to ...
+       * lib/dpkg.h: ... here.
+       (statusfd_send): New function protoype.
+       * lib/log.c: Include <assert.h> and <unistd.h>.
+       (statusfd_send): New function.
+       * lib/dbmodify.c: Use statusfd_send instead of duplicate code.
+       * src/configure.c: Likewise.
+       * src/errors.c: Likewise.
+
 2008-03-25  Guillem Jover  <guillem@debian.org>
 
        * lib/dbmodify.c (log_file, log_message): Move to ...
diff --git a/TODO b/TODO
index 4fb96932bbcd0ffa1209d09a7ed9e75d684ce00a..ec45fb290da8d1f52a8ccffeef855790af452a74 100644 (file)
--- a/TODO
+++ b/TODO
@@ -20,7 +20,6 @@ lenny
 ------
 
  * Code cleanup:
-   - Coalesce status_pipe handling.
    - blankfoo embedded code.
    - static variables inside functions.
    - Coalesce admindir / infodir / foodir generation.
index 6abc4fe97e1bf198210a1cf2102215eb8d564483..8be4042a166809feba9266f16ec5ddba47d84885 100644 (file)
@@ -234,30 +234,14 @@ void modstatdb_shutdown(void) {
   free(updatefnbuf);
 }
 
-struct pipef *status_pipes= NULL;
-
 void modstatdb_note(struct pkginfo *pkg) {
   assert(cstatus >= msdbrw_write);
 
   onerr_abort++;
 
-  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\n", pkg->name, statusinfos[pkg->status].name);
-    while (pipef) {
-      write(pipef->fd, status->buf, r);
-      pipef= pipef->next;
-    }
-  }
   log_message("status %s %s %s", statusinfos[pkg->status].name, pkg->name,
              versiondescribe(&pkg->installed.version, vdew_nonambig));
+  statusfd_send("status: %s: %s", pkg->name, statusinfos[pkg->status].name);
 
   varbufreset(&uvb);
   varbufrecord(&uvb, pkg, &pkg->installed);
index 565d629f6a3fd0a734cf04e65aa8d8cb1861162f..de7764fb47bd5ff0fc89fd3e1e1a621e16f4b4b2 100644 (file)
@@ -166,12 +166,6 @@ enum modstatdb_rw {
   msdbrw_noavail= 0100,
 };
 
-struct pipef {
-  int fd;
-  struct pipef *next;
-};
-extern struct pipef *status_pipes;
-
 enum modstatdb_rw modstatdb_init(const char *admindir, enum modstatdb_rw reqrwflags);
 void modstatdb_note(struct pkginfo *pkg);
 void modstatdb_checkpoint(void);
index d6c06f9d7ccb7f40887d76f19fe6a12bafbb6879..b3dd47a70d92f3b274ec7a35a583bb5f182ab752 100644 (file)
@@ -212,6 +212,15 @@ void warningf(const char *fmt, ...) PRINTFFORMAT(1, 2);
 extern const char *log_file;
 void log_message(const char *fmt, ...) PRINTFFORMAT(1, 2);
 
+/* FIXME: pipef and status_pipes should not be publicly exposed. */
+struct pipef {
+  int fd;
+  struct pipef *next;
+};
+extern struct pipef *status_pipes;
+
+void statusfd_send(const char *fmt, ...);
+
 /*** cleanup.c ***/
 
 void cu_closefile(int argc, void **argv);
index 2e607b7479d80c14ab65766785d1b265e117387b..23cd828bb2c61a9dc721c31595e73cdb69f7e331 100644 (file)
--- a/lib/log.c
+++ b/lib/log.c
 
 #include <config.h>
 
+#include <assert.h>
 #include <stdarg.h>
 #include <stdio.h>
+#include <unistd.h>
 #include <time.h>
 #include <errno.h>
 
@@ -72,3 +74,34 @@ log_message(const char *fmt, ...)
        fprintf(logfd, "%s %s\n", time_str, log->buf);
 }
 
+struct pipef *status_pipes = NULL;
+
+void
+statusfd_send(const char *fmt, ...)
+{
+       static struct varbuf vb;
+       struct pipef *pipef;
+       const char *p;
+       int r, l;
+       va_list al;
+
+       if (!status_pipes)
+               return;
+
+       va_start(al, fmt);
+       varbufreset(&vb);
+       varbufvprintf(&vb, fmt, al);
+       varbufaddc(&vb, '\n');
+       va_end(al);
+
+       for (pipef = status_pipes; pipef; pipef = pipef->next) {
+               for (p = vb.buf, l = vb.used; l;  p += r, l -= r) {
+                       r = write(pipef->fd, vb.buf, vb.used);
+                       if (r < 0)
+                               ohshite("unable to write to status fd %d",
+                                       pipef->fd);
+                       assert(r && r <= l);
+               }
+       }
+}
+
index 9c73f8dc7d7fb57e834f6b7854830b984904a858..8f447fe1cf53056565ee92ea4e17d3d3daa52ebb 100644 (file)
@@ -531,25 +531,9 @@ static enum conffopt promptconfaction(const char* cfgfile, const char* realold,
        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", 
+       statusfd_send("status: %s : %s : '%s' '%s' %i %i ",
                           cfgfile, "conffile-prompt", 
                           realold, realnew, useredited, distedited);
-          while (pipef) {
-             write(pipef->fd, status->buf, r);
-             pipef= pipef->next;
-          }
-       }
 
        do {
                /* Flush the terminal's input in case the user
index ab2c9d272f01427450b8431a5580371e63262d2a..83daa0f07de243ff7fa4ec4d90278b26551cf370 100644 (file)
@@ -56,23 +56,7 @@ void print_error_perpackage(const char *emsg, const char *arg) {
   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;
-     }
-  }
-
+  statusfd_send("status: %s : %s : %s", arg, "error", emsg);
 
   nr= malloc(sizeof(struct error_report));
   if (!nr) {