Browse Source

libdpkg: Pass pkgbin to trig_parse_ci callbacks

[hertzog@debian.org:
 - Track pkgbin in struct trigfileint. ]
Guillem Jover 14 years ago
parent
commit
bbd5801c99
5 changed files with 48 additions and 35 deletions
  1. 29 20
      lib/dpkg/triglib.c
  2. 7 5
      lib/dpkg/triglib.h
  3. 3 3
      src/processarc.c
  4. 1 1
      src/remove.c
  5. 8 6
      src/trigproc.c

+ 29 - 20
lib/dpkg/triglib.c

@@ -150,8 +150,9 @@ struct trigkindinfo {
 	/* Rest are for everyone: */
 	void (*activate_awaiter)(struct pkginfo *pkg /* may be NULL */);
 	void (*activate_done)(void);
-	void (*interest_change)(const char *name, struct pkginfo *pkg, int signum,
-	                        enum trig_options opts);
+	void (*interest_change)(const char *name, struct pkginfo *pkg,
+	                        struct pkgbin *pkgbin,
+	                        int signum, enum trig_options opts);
 };
 
 static const struct trigkindinfo tki_explicit, tki_file, tki_unknown;
@@ -216,7 +217,8 @@ trk_unknown_activate_done(void)
 }
 
 static void DPKG_ATTR_NORET
-trk_unknown_interest_change(const char *trig, struct pkginfo *pkg, int signum,
+trk_unknown_interest_change(const char *trig, struct pkginfo *pkg,
+                            struct pkgbin *pkgbin, int signum,
                             enum trig_options opts)
 {
 	ohshit(_("invalid or unknown syntax in trigger name `%.250s'"
@@ -312,7 +314,8 @@ trk_explicit_activate_awaiter(struct pkginfo *aw)
 }
 
 static void
-trk_explicit_interest_change(const char *trig,  struct pkginfo *pkg, int signum,
+trk_explicit_interest_change(const char *trig,  struct pkginfo *pkg,
+                             struct pkgbin *pkgbin, int signum,
                              enum trig_options opts)
 {
 	char buf[1024];
@@ -379,7 +382,8 @@ static int filetriggers_edited = -1;
  * but die if already present.
  */
 static void
-trk_file_interest_change(const char *trig, struct pkginfo *pkg, int signum,
+trk_file_interest_change(const char *trig, struct pkginfo *pkg,
+                         struct pkgbin *pkgbin, int signum,
                          enum trig_options opts)
 {
 	struct filenamenode *fnn;
@@ -403,6 +407,7 @@ trk_file_interest_change(const char *trig, struct pkginfo *pkg, int signum,
 
 	tfi = nfmalloc(sizeof(*tfi));
 	tfi->pkg = pkg;
+	tfi->pkgbin = pkgbin;
 	tfi->fnn = fnn;
 	tfi->options = opts;
 	tfi->samefile_next = *trigh.namenode_interested(fnn);
@@ -475,6 +480,7 @@ trig_file_interests_ensure(void)
 	FILE *f;
 	char linebuf[1024], *space;
 	struct pkginfo *pkg;
+	struct pkgbin *pkgbin;
 	const char *emsg;
 
 	if (filetriggers_edited >= 0)
@@ -509,7 +515,8 @@ trig_file_interests_ensure(void)
 			         "package name `%.250s' (for interest in file "
 				 "`%.250s'): %.250s"), space, linebuf, emsg);
 		pkg = pkg_db_find(space);
-		trk_file_interest_change(linebuf, pkg, +2, trig_opts);
+		pkgbin = &pkg->installed;
+		trk_file_interest_change(linebuf, pkg, pkgbin, +2, trig_opts);
 	}
 	pop_cleanup(ehflag_normaltidy);
 ok:
@@ -567,32 +574,33 @@ static const struct trigkindinfo tki_file = {
 /*---------- Trigger control info file. ----------*/
 
 static void
-trig_cicb_interest_change(const char *trig, struct pkginfo *pkg, int signum,
+trig_cicb_interest_change(const char *trig, struct pkginfo *pkg,
+                          struct pkgbin *pkgbin, int signum,
                           enum trig_options opts)
 {
 	const struct trigkindinfo *tki = trig_classify_byname(trig);
 
 	assert(filetriggers_edited >= 0);
-	tki->interest_change(trig, pkg, signum, opts);
+	tki->interest_change(trig, pkg, pkgbin, signum, opts);
 }
 
 void
 trig_cicb_interest_delete(const char *trig, struct pkginfo *pkg,
-                          enum trig_options opts)
+                          struct pkgbin *pkgbin, enum trig_options opts)
 {
-	trig_cicb_interest_change(trig, pkg, -1, opts);
+	trig_cicb_interest_change(trig, pkg, pkgbin, -1, opts);
 }
 
 void
 trig_cicb_interest_add(const char *trig, struct pkginfo *pkg,
-                       enum trig_options opts)
+                       struct pkgbin *pkgbin, enum trig_options opts)
 {
-	trig_cicb_interest_change(trig, pkg, +1, opts);
+	trig_cicb_interest_change(trig, pkg, pkgbin, +1, opts);
 }
 
 void
 trig_cicb_statuschange_activate(const char *trig, struct pkginfo *pkg,
-                                enum trig_options opts)
+                                struct pkgbin *pkgbin, enum trig_options opts)
 {
 	struct pkginfo *aw = pkg;
 
@@ -603,7 +611,7 @@ trig_cicb_statuschange_activate(const char *trig, struct pkginfo *pkg,
 
 static void
 parse_ci_call(const char *file, const char *cmd, trig_parse_cicb *cb,
-              const char *trig, struct pkginfo *pkg,
+              const char *trig, struct pkginfo *pkg, struct pkgbin *pkgbin,
               enum trig_options opts)
 {
 	const char *emsg;
@@ -614,12 +622,13 @@ parse_ci_call(const char *file, const char *cmd, trig_parse_cicb *cb,
 		         "syntax in trigger name `%.250s': %.250s"),
 		       file, trig, emsg);
 	if (cb)
-		cb(trig, pkg, opts);
+		cb(trig, pkg, pkgbin, opts);
 }
 
 void
 trig_parse_ci(const char *file, trig_parse_cicb *interest,
-              trig_parse_cicb *activate, struct pkginfo *pkg)
+              trig_parse_cicb *activate, struct pkginfo *pkg,
+              struct pkgbin *pkgbin)
 {
 	FILE *f;
 	char linebuf[MAXTRIGDIRECTIVE], *cmd, *spc, *eol;
@@ -649,13 +658,13 @@ trig_parse_ci(const char *file, trig_parse_cicb *interest,
 		while (cisspace(*spc))
 			spc++;
 		if (!strcmp(cmd, "interest")) {
-			parse_ci_call(file, cmd, interest, spc, pkg, trig_await);
+			parse_ci_call(file, cmd, interest, spc, pkg, pkgbin, trig_await);
 		} else if (!strcmp(cmd, "interest-noawait")) {
-			parse_ci_call(file, cmd, interest, spc, pkg, trig_noawait);
+			parse_ci_call(file, cmd, interest, spc, pkg, pkgbin, trig_noawait);
 		} else if (!strcmp(cmd, "activate")) {
-			parse_ci_call(file, cmd, activate, spc, pkg, trig_await);
+			parse_ci_call(file, cmd, activate, spc, pkg, pkgbin, trig_await);
 		} else if (!strcmp(cmd, "activate-noawait")) {
-			parse_ci_call(file, cmd, activate, spc, pkg, trig_noawait);
+			parse_ci_call(file, cmd, activate, spc, pkg, pkgbin, trig_noawait);
 		} else {
 			ohshit(_("triggers ci file contains unknown directive `%.250s'"),
 			       cmd);

+ 7 - 5
lib/dpkg/triglib.h

@@ -45,6 +45,7 @@ enum trig_options {
 
 struct trigfileint {
 	struct pkginfo *pkg;
+	struct pkgbin *pkgbin;
 	struct filenamenode *fnn;
 	enum trig_options options;
 	struct trigfileint *samefile_next;
@@ -95,15 +96,16 @@ void trig_file_interests_ensure(void);
 void trig_file_interests_save(void);
 
 typedef void trig_parse_cicb(const char *trig, struct pkginfo *pkg,
-                             enum trig_options to);
+                             struct pkgbin *pkgbin, enum trig_options to);
 void trig_cicb_interest_delete(const char *trig, struct pkginfo *pkg,
-                               enum trig_options to);
+                             struct pkgbin *pkgbin, enum trig_options to);
 void trig_cicb_interest_add(const char *trig, struct pkginfo *pkg,
-                            enum trig_options to);
+                             struct pkgbin *pkgbin, enum trig_options to);
 void trig_cicb_statuschange_activate(const char *trig, struct pkginfo *pkg,
-                                     enum trig_options to);
+                             struct pkgbin *pkgbin, enum trig_options to);
 void trig_parse_ci(const char *file, trig_parse_cicb *interest,
-                   trig_parse_cicb *activate, struct pkginfo *pkg);
+                   trig_parse_cicb *activate, struct pkginfo *pkg,
+                   struct pkgbin *pkgbin);
 
 void trig_incorporate(enum modstatdb_rw cstatus);
 

+ 3 - 3
src/processarc.c

@@ -571,7 +571,7 @@ void process_archive(const char *filename) {
 
   trig_activate_packageprocessing(pkg);
   strcpy(cidirrest, TRIGGERSCIFILE);
-  trig_parse_ci(cidir, NULL, trig_cicb_statuschange_activate, pkg);
+  trig_parse_ci(cidir, NULL, trig_cicb_statuschange_activate, pkg, &pkg->available);
 
   /* Read the conffiles, and copy the hashes across. */
   newconffiles = NULL;
@@ -1048,8 +1048,8 @@ void process_archive(const char *filename) {
    * Then we go through the new list adding them. */
   strcpy(cidirrest, TRIGGERSCIFILE);
   trig_parse_ci(pkgadminfile(pkg, &pkg->installed, TRIGGERSCIFILE),
-                trig_cicb_interest_delete, NULL, pkg);
-  trig_parse_ci(cidir, trig_cicb_interest_add, NULL, pkg);
+                trig_cicb_interest_delete, NULL, pkg, &pkg->installed);
+  trig_parse_ci(cidir, trig_cicb_interest_add, NULL, pkg, &pkg->available);
   trig_file_interests_save();
 
   /* We also install the new maintainer scripts, and any other

+ 1 - 1
src/remove.c

@@ -293,7 +293,7 @@ removal_bulk_remove_files(struct pkginfo *pkg)
                                 "remove", NULL);
 
     trig_parse_ci(pkgadminfile(pkg, &pkg->installed, TRIGGERSCIFILE),
-                  trig_cicb_interest_delete, NULL, pkg);
+                  trig_cicb_interest_delete, NULL, pkg, &pkg->installed);
     trig_file_interests_save();
 
     debug(dbg_general, "removal_bulk cleaning info directory");

+ 8 - 6
src/trigproc.c

@@ -136,7 +136,7 @@ trig_activate_packageprocessing(struct pkginfo *pkg)
 	      pkg->set->name);
 
 	trig_parse_ci(pkgadminfile(pkg, &pkg->installed, TRIGGERSCIFILE), NULL,
-	              trig_cicb_statuschange_activate, pkg);
+	              trig_cicb_statuschange_activate, pkg, &pkg->installed);
 }
 
 /*========== Actual trigger processing. ==========*/
@@ -351,7 +351,7 @@ trigproc(struct pkginfo *pkg)
 
 static void
 transitional_interest_callback_ro(const char *trig, struct pkginfo *pkg,
-                                  enum trig_options opts)
+                                  struct pkgbin *pkgbin, enum trig_options opts)
 {
 	struct pkginfo *pend = pkg;
 
@@ -364,12 +364,13 @@ transitional_interest_callback_ro(const char *trig, struct pkginfo *pkg,
 
 static void
 transitional_interest_callback(const char *trig, struct pkginfo *pkg,
-                               enum trig_options opts)
+                               struct pkgbin *pkgbin, enum trig_options opts)
 {
 	struct pkginfo *pend = pkg;
+	struct pkgbin *pendbin = pkgbin;
 
-	trig_cicb_interest_add(trig, pend, opts);
-	transitional_interest_callback_ro(trig, pend, opts);
+	trig_cicb_interest_add(trig, pend, pendbin, opts);
+	transitional_interest_callback_ro(trig, pend, pendbin, opts);
 }
 
 /*
@@ -393,7 +394,8 @@ trig_transitional_activate(enum modstatdb_rw cstatus)
 		trig_parse_ci(pkgadminfile(pkg, &pkg->installed, TRIGGERSCIFILE),
 		              cstatus >= msdbrw_write ?
 		              transitional_interest_callback :
-		              transitional_interest_callback_ro, NULL, pkg);
+		              transitional_interest_callback_ro, NULL,
+		              pkg, &pkg->installed);
 		/* Ensure we're not creating incoherent data that can't
 		 * be written down. This should never happen in theory but
 		 * can happen if you restore an old status file that is