Branch data Line data Source code
1 : : /*
2 : : * libdpkg - Debian packaging suite library routines
3 : : * trignote.c - trigger note handling
4 : : *
5 : : * Copyright © 2007 Canonical Ltd
6 : : * Written by Ian Jackson <ijackson@chiark.greenend.org.uk>
7 : : * Copyright © 2008-2014 Guillem Jover <guillem@debian.org>
8 : : *
9 : : * This is free software; you can redistribute it and/or modify
10 : : * it under the terms of the GNU General Public License as published by
11 : : * the Free Software Foundation; either version 2 of the License, or
12 : : * (at your option) any later version.
13 : : *
14 : : * This is distributed in the hope that it will be useful,
15 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : : * GNU General Public License for more details.
18 : : *
19 : : * You should have received a copy of the GNU General Public License
20 : : * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 : : */
22 : :
23 : : #include <config.h>
24 : : #include <compat.h>
25 : :
26 : : #include <string.h>
27 : :
28 : : #include <dpkg/dpkg.h>
29 : : #include <dpkg/dpkg-db.h>
30 : : #include <dpkg/pkg.h>
31 : : #include <dpkg/pkg-list.h>
32 : : #include <dpkg/dlist.h>
33 : : #include <dpkg/triglib.h>
34 : :
35 : : /*
36 : : * Note: This is also called from fields.c where *pend is a temporary!
37 : : *
38 : : * trig is not copied!
39 : : */
40 : : bool
41 : 0 : trig_note_pend_core(struct pkginfo *pend, const char *trig)
42 : : {
43 : : struct trigpend *tp;
44 : :
45 [ # # ]: 0 : for (tp = pend->trigpend_head; tp; tp = tp->next)
46 [ # # ]: 0 : if (strcmp(tp->name, trig) == 0)
47 : 0 : return false;
48 : :
49 : 0 : tp = nfmalloc(sizeof(*tp));
50 : 0 : tp->name = trig;
51 : 0 : tp->next = pend->trigpend_head;
52 : 0 : pend->trigpend_head = tp;
53 : :
54 : 0 : return true;
55 : : }
56 : :
57 : : /*
58 : : * trig is not copied!
59 : : *
60 : : * @retval true For done.
61 : : * @retval false For already noted.
62 : : */
63 : : bool
64 : 0 : trig_note_pend(struct pkginfo *pend, const char *trig)
65 : : {
66 [ # # ]: 0 : if (!trig_note_pend_core(pend, trig))
67 : 0 : return false;
68 : :
69 [ # # ]: 0 : if (pend->trigaw.head)
70 : 0 : pkg_set_status(pend, PKG_STAT_TRIGGERSAWAITED);
71 : : else
72 : 0 : pkg_set_status(pend, PKG_STAT_TRIGGERSPENDING);
73 : :
74 : 0 : return true;
75 : : }
76 : :
77 : : /*
78 : : * Note: This is called also from fields.c where *aw is a temporary
79 : : * but pend is from pkg_hash_find()!
80 : : *
81 : : * @retval true For done.
82 : : * @retval false For already noted.
83 : : */
84 : : bool
85 : 0 : trig_note_aw(struct pkginfo *pend, struct pkginfo *aw)
86 : : {
87 : : struct trigaw *ta;
88 : :
89 : : /* We search through aw's list because that's probably shorter. */
90 [ # # ]: 0 : for (ta = aw->trigaw.head; ta; ta = ta->sameaw.next)
91 [ # # ]: 0 : if (ta->pend == pend)
92 : 0 : return false;
93 : :
94 : 0 : ta = nfmalloc(sizeof(*ta));
95 : 0 : ta->aw = aw;
96 : 0 : ta->pend = pend;
97 : 0 : ta->samepend_next = pend->othertrigaw_head;
98 : 0 : pend->othertrigaw_head = ta;
99 [ # # ]: 0 : LIST_LINK_TAIL_PART(aw->trigaw, ta, sameaw);
100 : :
101 : 0 : return true;
102 : : }
103 : :
104 : : static struct pkg_list *trig_awaited_pend_head;
105 : :
106 : : void
107 : 0 : trig_awaited_pend_enqueue(struct pkginfo *pend)
108 : : {
109 : : struct pkg_list *tp;
110 : :
111 [ # # ]: 0 : for (tp = trig_awaited_pend_head; tp; tp = tp->next)
112 [ # # ]: 0 : if (tp->pkg == pend)
113 : 0 : return;
114 : :
115 : 0 : pkg_list_prepend(&trig_awaited_pend_head, pend);
116 : : }
117 : :
118 : : void
119 : 0 : trig_awaited_pend_foreach(trig_awaited_pend_foreach_func *func)
120 : : {
121 : : struct pkg_list *tp;
122 : :
123 [ # # ]: 0 : for (tp = trig_awaited_pend_head; tp; tp = tp->next)
124 [ # # ]: 0 : if (!tp->pkg->trigpend_head)
125 : 0 : func(tp->pkg);
126 : 0 : }
127 : :
128 : : void
129 : 0 : trig_awaited_pend_free(void)
130 : : {
131 : 0 : pkg_list_free(trig_awaited_pend_head);
132 : 0 : trig_awaited_pend_head = NULL;
133 : 0 : }
|