Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/pkg
Path: blob/main/libpkg/pkg_event.c
2645 views
1
/*-
2
* Copyright (c) 2011-2013 Baptiste Daroussin <[email protected]>
3
* Copyright (c) 2011-2012 Julien Laffaye <[email protected]>
4
* Copyright (c) 2015 Matthew Seaman <[email protected]>
5
* Copyright (c) 2023 Serenity Cyber Security, LLC <[email protected]>
6
* Author: Gleb Popov <[email protected]>
7
* All rights reserved.
8
*
9
* Redistribution and use in source and binary forms, with or without
10
* modification, are permitted provided that the following conditions
11
* are met:
12
* 1. Redistributions of source code must retain the above copyright
13
* notice, this list of conditions and the following disclaimer
14
* in this position and unchanged.
15
* 2. Redistributions in binary form must reproduce the above copyright
16
* notice, this list of conditions and the following disclaimer in the
17
* documentation and/or other materials provided with the distribution.
18
*
19
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
20
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22
* IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
23
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
*/
30
31
#include <errno.h>
32
#include <string.h>
33
#include <syslog.h>
34
#include <xstring.h>
35
36
#include "pkg.h"
37
#include "private/pkg.h"
38
#include "private/event.h"
39
40
static pkg_event_cb _cb = NULL;
41
static void *_data = NULL;
42
43
static void
44
pipeevent(struct pkg_event *ev)
45
{
46
int i;
47
struct pkg_dep *dep = NULL;
48
xstring *msg;
49
struct pkg_event_conflict *cur_conflict;
50
if (ctx.eventpipe < 0)
51
return;
52
53
msg = xstring_new();
54
55
switch(ev->type) {
56
case PKG_EVENT_ERRNO:
57
fprintf(msg->fp, "{ \"type\": \"ERROR\", "
58
"\"data\": {"
59
"\"msg\": \"%s(%s): %s\","
60
"\"errno\": %d}}",
61
json_escape(ev->e_errno.func),
62
json_escape(ev->e_errno.arg),
63
json_escape(strerror(ev->e_errno.no)),
64
ev->e_errno.no);
65
break;
66
case PKG_EVENT_ERROR:
67
fprintf(msg->fp, "{ \"type\": \"ERROR\", "
68
"\"data\": {\"msg\": \"%s\"}}",
69
json_escape(ev->e_pkg_error.msg));
70
break;
71
case PKG_EVENT_NOTICE:
72
fprintf(msg->fp, "{ \"type\": \"NOTICE\", "
73
"\"data\": {\"msg\": \"%s\"}}",
74
json_escape(ev->e_pkg_notice.msg));
75
break;
76
case PKG_EVENT_DEVELOPER_MODE:
77
fprintf(msg->fp, "{ \"type\": \"ERROR\", "
78
"\"data\": {\"msg\": \"DEVELOPER_MODE: %s\"}}",
79
json_escape(ev->e_pkg_error.msg));
80
break;
81
case PKG_EVENT_UPDATE_ADD:
82
fprintf(msg->fp, "{ \"type\": \"INFO_UPDATE_ADD\", "
83
"\"data\": { "
84
"\"fetched\": %d, "
85
"\"total\": %d"
86
"}}",
87
ev->e_upd_add.done,
88
ev->e_upd_add.total
89
);
90
break;
91
case PKG_EVENT_UPDATE_REMOVE:
92
fprintf(msg->fp, "{ \"type\": \"INFO_UPDATE_REMOVE\", "
93
"\"data\": { "
94
"\"fetched\": %d, "
95
"\"total\": %d"
96
"}}",
97
ev->e_upd_remove.done,
98
ev->e_upd_remove.total
99
);
100
break;
101
case PKG_EVENT_FETCH_BEGIN:
102
fprintf(msg->fp, "{ \"type\": \"INFO_FETCH_BEGIN\", "
103
"\"data\": { "
104
"\"url\": \"%s\" "
105
"}}",
106
json_escape(ev->e_fetching.url)
107
);
108
break;
109
case PKG_EVENT_FETCH_FINISHED:
110
fprintf(msg->fp, "{ \"type\": \"INFO_FETCH_FINISHED\", "
111
"\"data\": { "
112
"\"url\": \"%s\" "
113
"}}",
114
json_escape(ev->e_fetching.url)
115
);
116
break;
117
case PKG_EVENT_INSTALL_BEGIN:
118
pkg_fprintf(msg->fp, "{ \"type\": \"INFO_INSTALL_BEGIN\", "
119
"\"data\": { "
120
"\"pkgname\": \"%n\", "
121
"\"pkgversion\": \"%v\""
122
"}}", ev->e_install_begin.pkg, ev->e_install_begin.pkg);
123
break;
124
case PKG_EVENT_EXTRACT_BEGIN:
125
pkg_fprintf(msg->fp, "{ \"type\": \"INFO_EXTRACT_BEGIN\", "
126
"\"data\": { "
127
"\"pkgname\": \"%n\", "
128
"\"pkgversion\": \"%v\""
129
"}}", ev->e_extract_begin.pkg, ev->e_extract_begin.pkg);
130
break;
131
case PKG_EVENT_EXTRACT_FINISHED:
132
pkg_fprintf(msg->fp, "{ \"type\": \"INFO_EXTRACT_FINISHED\", "
133
"\"data\": { "
134
"\"pkgname\": \"%n\", "
135
"\"pkgversion\": \"%v\""
136
"}}", ev->e_extract_finished.pkg, ev->e_extract_finished.pkg);
137
break;
138
case PKG_EVENT_INSTALL_FINISHED:
139
pkg_fprintf(msg->fp, "{ \"type\": \"INFO_INSTALL_FINISHED\", "
140
"\"data\": { "
141
"\"pkgname\": \"%n\", "
142
"\"pkgversion\": \"%v\", "
143
"\"message\": \"%S\""
144
"}}",
145
ev->e_install_finished.pkg,
146
ev->e_install_finished.pkg,
147
pkg_has_message(ev->e_install_finished.pkg) ?
148
pkg_message_to_str(ev->e_install_finished.pkg) :
149
"");
150
break;
151
case PKG_EVENT_INTEGRITYCHECK_BEGIN:
152
fputs("{ \"type\": \"INFO_INTEGRITYCHECK_BEGIN\", "
153
"\"data\": {}}", msg->fp);
154
break;
155
case PKG_EVENT_INTEGRITYCHECK_CONFLICT:
156
fprintf(msg->fp, "{ \"type\": \"INFO_INTEGRITYCHECK_CONFLICT\","
157
"\"data\": { "
158
"\"pkguid\": \"%s\", "
159
"\"pkgpath\": \"%s\", "
160
"\"conflicts\": [",
161
ev->e_integrity_conflict.pkg_uid,
162
ev->e_integrity_conflict.pkg_path);
163
cur_conflict = ev->e_integrity_conflict.conflicts;
164
while (cur_conflict != NULL) {
165
if (cur_conflict->next != NULL) {
166
fprintf(msg->fp, "{\"uid\":\"%s\"},",
167
cur_conflict->uid);
168
}
169
else {
170
fprintf(msg->fp, "{\"uid\":\"%s\"}",
171
cur_conflict->uid);
172
break;
173
}
174
cur_conflict = cur_conflict->next;
175
}
176
fputs("]}}", msg->fp);
177
break;
178
case PKG_EVENT_INTEGRITYCHECK_FINISHED:
179
fprintf(msg->fp, "{ \"type\": \"INFO_INTEGRITYCHECK_FINISHED\", "
180
"\"data\": {\"conflicting\": %d}}",
181
ev->e_integrity_finished.conflicting);
182
break;
183
case PKG_EVENT_DEINSTALL_BEGIN:
184
pkg_fprintf(msg->fp, "{ \"type\": \"INFO_DEINSTALL_BEGIN\", "
185
"\"data\": { "
186
"\"pkgname\": \"%n\", "
187
"\"pkgversion\": \"%v\""
188
"}}",
189
ev->e_deinstall_begin.pkg,
190
ev->e_deinstall_begin.pkg);
191
break;
192
case PKG_EVENT_DEINSTALL_FINISHED:
193
pkg_fprintf(msg->fp, "{ \"type\": \"INFO_DEINSTALL_FINISHED\", "
194
"\"data\": { "
195
"\"pkgname\": \"%n\", "
196
"\"pkgversion\": \"%v\""
197
"}}",
198
ev->e_deinstall_finished.pkg,
199
ev->e_deinstall_finished.pkg);
200
break;
201
case PKG_EVENT_UPGRADE_BEGIN:
202
pkg_fprintf(msg->fp, "{ \"type\": \"INFO_UPGRADE_BEGIN\", "
203
"\"data\": { "
204
"\"pkgname\": \"%n\", "
205
"\"pkgversion\": \"%v\" ,"
206
"\"pkgnewversion\": \"%v\""
207
"}}",
208
ev->e_upgrade_begin.o,
209
ev->e_upgrade_begin.o,
210
ev->e_upgrade_begin.n);
211
break;
212
case PKG_EVENT_UPGRADE_FINISHED:
213
pkg_fprintf(msg->fp, "{ \"type\": \"INFO_UPGRADE_FINISHED\", "
214
"\"data\": { "
215
"\"pkgname\": \"%n\", "
216
"\"pkgversion\": \"%v\" ,"
217
"\"pkgnewversion\": \"%v\""
218
"}}",
219
ev->e_upgrade_finished.o,
220
ev->e_upgrade_finished.o,
221
ev->e_upgrade_finished.n);
222
break;
223
case PKG_EVENT_LOCKED:
224
pkg_fprintf(msg->fp, "{ \"type\": \"ERROR_LOCKED\", "
225
"\"data\": { "
226
"\"pkgname\": \"%n\", "
227
"\"pkgversion\": \"%n\""
228
"}}",
229
ev->e_locked.pkg,
230
ev->e_locked.pkg);
231
break;
232
case PKG_EVENT_REQUIRED:
233
pkg_fprintf(msg->fp, "{ \"type\": \"ERROR_REQUIRED\", "
234
"\"data\": { "
235
"\"pkgname\": \"%n\", "
236
"\"pkgversion\": \"%v\", "
237
"\"force\": %S, "
238
"\"required_by\": [",
239
ev->e_required.pkg,
240
ev->e_required.pkg,
241
ev->e_required.force == 1 ? "true": "false");
242
while (pkg_rdeps(ev->e_required.pkg, &dep) == EPKG_OK)
243
fprintf(msg->fp, "{ \"pkgname\": \"%s\", "
244
"\"pkgversion\": \"%s\" }, ",
245
dep->name, dep->version);
246
int c = 0;
247
ungetc(c, msg->fp);
248
ungetc(c, msg->fp);
249
fputs("]}}", msg->fp);
250
break;
251
case PKG_EVENT_ALREADY_INSTALLED:
252
pkg_fprintf(msg->fp, "{ \"type\": \"ERROR_ALREADY_INSTALLED\", "
253
"\"data\": { "
254
"\"pkgname\": \"%n\", "
255
"\"pkgversion\": \"%v\""
256
"}}",
257
ev->e_already_installed.pkg,
258
ev->e_already_installed.pkg);
259
break;
260
case PKG_EVENT_MISSING_DEP:
261
fprintf(msg->fp, "{ \"type\": \"ERROR_MISSING_DEP\", "
262
"\"data\": { "
263
"\"depname\": \"%s\", "
264
"\"depversion\": \"%s\""
265
"}}" ,
266
ev->e_missing_dep.dep->name,
267
ev->e_missing_dep.dep->version);
268
break;
269
case PKG_EVENT_NOREMOTEDB:
270
fprintf(msg->fp, "{ \"type\": \"ERROR_NOREMOTEDB\", "
271
"\"data\": { "
272
"\"url\": \"%s\" "
273
"}}" ,
274
ev->e_remotedb.repo);
275
break;
276
case PKG_EVENT_NOLOCALDB:
277
fputs("{ \"type\": \"ERROR_NOLOCALDB\", \"data\": {}} ",
278
msg->fp);
279
break;
280
case PKG_EVENT_NEWPKGVERSION:
281
fputs("{ \"type\": \"INFO_NEWPKGVERSION\", \"data\": {}} ",
282
msg->fp);
283
break;
284
case PKG_EVENT_FILE_MISMATCH:
285
pkg_fprintf(msg->fp, "{ \"type\": \"ERROR_FILE_MISMATCH\", "
286
"\"data\": { "
287
"\"pkgname\": \"%n\", "
288
"\"pkgversion\": \"%v\", "
289
"\"path\": \"%S\""
290
"}}",
291
ev->e_file_mismatch.pkg,
292
ev->e_file_mismatch.pkg,
293
json_escape(ev->e_file_mismatch.file->path));
294
break;
295
case PKG_EVENT_PLUGIN_ERRNO:
296
fprintf(msg->fp, "{ \"type\": \"ERROR_PLUGIN\", "
297
"\"data\": {"
298
"\"plugin\": \"%s\", "
299
"\"msg\": \"%s(%s): %s\","
300
"\"errno\": %d"
301
"}}",
302
pkg_plugin_get(ev->e_plugin_errno.plugin, PKG_PLUGIN_NAME),
303
json_escape(ev->e_plugin_errno.func),
304
json_escape(ev->e_plugin_errno.arg),
305
json_escape(strerror(ev->e_plugin_errno.no)),
306
ev->e_plugin_errno.no);
307
break;
308
case PKG_EVENT_PLUGIN_ERROR:
309
fprintf(msg->fp, "{ \"type\": \"ERROR_PLUGIN\", "
310
"\"data\": {"
311
"\"plugin\": \"%s\", "
312
"\"msg\": \"%s\""
313
"}}",
314
pkg_plugin_get(ev->e_plugin_error.plugin, PKG_PLUGIN_NAME),
315
json_escape(ev->e_plugin_error.msg));
316
break;
317
case PKG_EVENT_PLUGIN_INFO:
318
fprintf(msg->fp, "{ \"type\": \"INFO_PLUGIN\", "
319
"\"data\": {"
320
"\"plugin\": \"%s\", "
321
"\"msg\": \"%s\""
322
"}}",
323
pkg_plugin_get(ev->e_plugin_info.plugin, PKG_PLUGIN_NAME),
324
json_escape(ev->e_plugin_info.msg));
325
break;
326
case PKG_EVENT_INCREMENTAL_UPDATE:
327
fprintf(msg->fp, "{ \"type\": \"INFO_INCREMENTAL_UPDATE\", "
328
"\"data\": {"
329
"\"name\": \"%s\", "
330
"\"processed\": %d"
331
"}}", ev->e_incremental_update.reponame,
332
ev->e_incremental_update.processed);
333
break;
334
case PKG_EVENT_QUERY_YESNO:
335
fprintf(msg->fp, "{ \"type\": \"QUERY_YESNO\", "
336
"\"data\": {"
337
"\"msg\": \"%s\","
338
"\"default\": \"%d\""
339
"}}", ev->e_query_yesno.msg,
340
ev->e_query_yesno.deft);
341
break;
342
case PKG_EVENT_QUERY_SELECT:
343
fprintf(msg->fp, "{ \"type\": \"QUERY_SELECT\", "
344
"\"data\": {"
345
"\"msg\": \"%s\","
346
"\"ncnt\": \"%d\","
347
"\"default\": \"%d\","
348
"\"items\": ["
349
, ev->e_query_select.msg,
350
ev->e_query_select.ncnt,
351
ev->e_query_select.deft);
352
for (i = 0; i < ev->e_query_select.ncnt - 1; i++)
353
{
354
fprintf(msg->fp, "{ \"text\": \"%s\" },",
355
ev->e_query_select.items[i]);
356
}
357
fprintf(msg->fp, "{ \"text\": \"%s\" } ] }}",
358
ev->e_query_select.items[i]);
359
break;
360
case PKG_EVENT_PROGRESS_START:
361
fputs("{ \"type\": \"INFO_PROGRESS_START\", \"data\": {}}",
362
msg->fp);
363
break;
364
case PKG_EVENT_PROGRESS_TICK:
365
fprintf(msg->fp, "{ \"type\": \"INFO_PROGRESS_TICK\", "
366
"\"data\": { \"current\": %jd, \"total\" : %jd}}",
367
(intmax_t)ev->e_progress_tick.current,
368
(intmax_t)ev->e_progress_tick.total);
369
break;
370
case PKG_EVENT_TRIGGERS_BEGIN:
371
fputs("{ \"type\": \"INFO_TRIGGERS_BEGIN\", \"data\": {}}",
372
msg->fp);
373
break;
374
case PKG_EVENT_TRIGGERS_FINISHED:
375
fputs("{ \"type\": \"INFO_TRIGGERS_FINISHED\", \"data\": {}}",
376
msg->fp);
377
break;
378
case PKG_EVENT_TRIGGER:
379
fprintf(msg->fp, "{ \"type\": \"INFO_TRIGGER\", \"data\": { "
380
"\"cleanup\": %s, \"name\": \"%s\" }}",
381
ev->e_trigger.cleanup ? "true" : "false",
382
ev->e_trigger.name);
383
case PKG_EVENT_BACKUP:
384
case PKG_EVENT_RESTORE:
385
break;
386
default:
387
break;
388
}
389
fflush(msg->fp);
390
dprintf(ctx.eventpipe, "%s\n", msg->buf);
391
xstring_free(msg);
392
}
393
394
void
395
pkg_event_register(pkg_event_cb cb, void *data)
396
{
397
_cb = cb;
398
_data = data;
399
}
400
401
static int
402
pkg_emit_event(struct pkg_event *ev)
403
{
404
int ret = 0;
405
pkg_plugins_hook_run(PKG_PLUGIN_HOOK_EVENT, ev, NULL);
406
if (_cb != NULL)
407
ret = _cb(_data, ev);
408
pipeevent(ev);
409
return (ret);
410
}
411
412
void
413
pkg_emit_error(const char *fmt, ...)
414
{
415
struct pkg_event ev;
416
va_list ap;
417
418
ev.type = PKG_EVENT_ERROR;
419
420
va_start(ap, fmt);
421
vasprintf(&ev.e_pkg_error.msg, fmt, ap);
422
va_end(ap);
423
424
pkg_emit_event(&ev);
425
free(ev.e_pkg_error.msg);
426
}
427
428
void
429
pkg_emit_notice(const char *fmt, ...)
430
{
431
struct pkg_event ev;
432
va_list ap;
433
434
ev.type = PKG_EVENT_NOTICE;
435
436
va_start(ap, fmt);
437
vasprintf(&ev.e_pkg_notice.msg, fmt, ap);
438
va_end(ap);
439
440
pkg_emit_event(&ev);
441
free(ev.e_pkg_error.msg);
442
}
443
444
void
445
pkg_emit_developer_mode(const char *fmt, ...)
446
{
447
struct pkg_event ev;
448
va_list ap;
449
450
ev.type = PKG_EVENT_DEVELOPER_MODE;
451
452
va_start(ap, fmt);
453
vasprintf(&ev.e_pkg_error.msg, fmt, ap);
454
va_end(ap);
455
456
pkg_emit_event(&ev);
457
free(ev.e_pkg_error.msg);
458
}
459
460
void
461
pkg_emit_errno(const char *func, const char *arg)
462
{
463
struct pkg_event ev;
464
465
ev.type = PKG_EVENT_ERRNO;
466
ev.e_errno.func = func;
467
ev.e_errno.arg = arg;
468
ev.e_errno.no = errno;
469
470
pkg_emit_event(&ev);
471
}
472
473
void
474
pkg_emit_pkg_errno(pkg_error_t err, const char *func, const char *arg)
475
{
476
struct pkg_event ev;
477
478
ev.type = PKG_EVENT_PKG_ERRNO;
479
ev.e_errno.func = func;
480
ev.e_errno.arg = arg;
481
ev.e_errno.no = err;
482
483
pkg_emit_event(&ev);
484
}
485
486
void
487
pkg_emit_already_installed(struct pkg *p)
488
{
489
struct pkg_event ev;
490
491
ev.type = PKG_EVENT_ALREADY_INSTALLED;
492
ev.e_already_installed.pkg = p;
493
494
pkg_emit_event(&ev);
495
}
496
497
void
498
pkg_emit_fetch_begin(const char *url)
499
{
500
struct pkg_event ev;
501
502
ev.type = PKG_EVENT_FETCH_BEGIN;
503
ev.e_fetching.url = url;
504
505
pkg_emit_event(&ev);
506
}
507
508
void
509
pkg_emit_fetch_finished(const char *url)
510
{
511
struct pkg_event ev;
512
513
ev.type = PKG_EVENT_FETCH_FINISHED;
514
ev.e_fetching.url = url;
515
516
pkg_emit_event(&ev);
517
}
518
519
void
520
pkg_emit_update_remove(int total, int done)
521
{
522
struct pkg_event ev;
523
524
ev.type = PKG_EVENT_UPDATE_REMOVE;
525
ev.e_upd_remove.total = total;
526
ev.e_upd_remove.done = done;
527
528
pkg_emit_event(&ev);
529
}
530
531
532
void
533
pkg_emit_update_add(int total, int done)
534
{
535
struct pkg_event ev;
536
537
ev.type = PKG_EVENT_UPDATE_ADD;
538
ev.e_upd_add.total = total;
539
ev.e_upd_add.done = done;
540
541
pkg_emit_event(&ev);
542
}
543
544
void
545
pkg_emit_install_begin(struct pkg *p)
546
{
547
struct pkg_event ev;
548
549
ev.type = PKG_EVENT_INSTALL_BEGIN;
550
ev.e_install_begin.pkg = p;
551
552
pkg_emit_event(&ev);
553
}
554
555
void
556
pkg_emit_install_finished(struct pkg *p, struct pkg *old)
557
{
558
struct pkg_event ev;
559
bool syslog_enabled = false;
560
561
ev.type = PKG_EVENT_INSTALL_FINISHED;
562
ev.e_install_finished.pkg = p;
563
ev.e_install_finished.old = old;
564
565
syslog_enabled = pkg_object_bool(pkg_config_get("SYSLOG"));
566
if (syslog_enabled) {
567
syslog(LOG_NOTICE, "%s-%s installed",
568
p->name, p->version);
569
}
570
571
pkg_emit_event(&ev);
572
}
573
574
void
575
pkg_emit_add_deps_begin(struct pkg *p)
576
{
577
struct pkg_event ev;
578
579
ev.type = PKG_EVENT_ADD_DEPS_BEGIN;
580
ev.e_add_deps_begin.pkg = p;
581
582
pkg_emit_event(&ev);
583
}
584
585
void
586
pkg_emit_add_deps_finished(struct pkg *p)
587
{
588
struct pkg_event ev;
589
590
ev.type = PKG_EVENT_ADD_DEPS_FINISHED;
591
ev.e_add_deps_finished.pkg = p;
592
593
pkg_emit_event(&ev);
594
}
595
596
void
597
pkg_emit_extract_begin(struct pkg *p)
598
{
599
struct pkg_event ev;
600
601
ev.type = PKG_EVENT_EXTRACT_BEGIN;
602
ev.e_extract_begin.pkg = p;
603
604
pkg_emit_event(&ev);
605
}
606
607
void
608
pkg_emit_extract_finished(struct pkg *p)
609
{
610
struct pkg_event ev;
611
612
ev.type = PKG_EVENT_EXTRACT_FINISHED;
613
ev.e_extract_finished.pkg = p;
614
615
pkg_emit_event(&ev);
616
}
617
618
void
619
pkg_emit_delete_files_begin(struct pkg *p)
620
{
621
struct pkg_event ev;
622
623
ev.type = PKG_EVENT_DELETE_FILES_BEGIN;
624
ev.e_delete_files_begin.pkg = p;
625
626
pkg_emit_event(&ev);
627
}
628
629
void
630
pkg_emit_delete_files_finished(struct pkg *p)
631
{
632
struct pkg_event ev;
633
634
ev.type = PKG_EVENT_DELETE_FILES_FINISHED;
635
ev.e_delete_files_finished.pkg = p;
636
637
pkg_emit_event(&ev);
638
}
639
640
void
641
pkg_emit_integritycheck_begin(void)
642
{
643
struct pkg_event ev;
644
ev.type = PKG_EVENT_INTEGRITYCHECK_BEGIN;
645
646
pkg_emit_event(&ev);
647
}
648
649
void
650
pkg_emit_integritycheck_finished(int conflicting)
651
{
652
struct pkg_event ev;
653
ev.type = PKG_EVENT_INTEGRITYCHECK_FINISHED;
654
ev.e_integrity_finished.conflicting = conflicting;
655
656
pkg_emit_event(&ev);
657
}
658
659
void
660
pkg_emit_integritycheck_conflict(const char *uid,
661
const char *path, struct pkg_event_conflict *conflicts)
662
{
663
struct pkg_event ev;
664
ev.type = PKG_EVENT_INTEGRITYCHECK_CONFLICT;
665
ev.e_integrity_conflict.pkg_uid = uid;
666
ev.e_integrity_conflict.pkg_path = path;
667
ev.e_integrity_conflict.conflicts = conflicts;
668
669
pkg_emit_event(&ev);
670
}
671
672
void
673
pkg_emit_deinstall_begin(struct pkg *p)
674
{
675
struct pkg_event ev;
676
677
ev.type = PKG_EVENT_DEINSTALL_BEGIN;
678
ev.e_deinstall_begin.pkg = p;
679
680
pkg_emit_event(&ev);
681
}
682
683
void
684
pkg_emit_deinstall_finished(struct pkg *p)
685
{
686
struct pkg_event ev;
687
bool syslog_enabled = false;
688
689
ev.type = PKG_EVENT_DEINSTALL_FINISHED;
690
ev.e_deinstall_finished.pkg = p;
691
692
syslog_enabled = pkg_object_bool(pkg_config_get("SYSLOG"));
693
if (syslog_enabled) {
694
syslog(LOG_NOTICE, "%s-%s deinstalled",
695
p->name, p->version);
696
}
697
698
pkg_emit_event(&ev);
699
}
700
701
void
702
pkg_emit_upgrade_begin(struct pkg *new, struct pkg *old)
703
{
704
struct pkg_event ev;
705
706
ev.type = PKG_EVENT_UPGRADE_BEGIN;
707
ev.e_upgrade_begin.n = new;
708
ev.e_upgrade_begin.o = old;
709
710
pkg_emit_event(&ev);
711
}
712
713
void
714
pkg_emit_upgrade_finished(struct pkg *new, struct pkg *old)
715
{
716
struct pkg_event ev;
717
bool syslog_enabled = false;
718
719
ev.type = PKG_EVENT_UPGRADE_FINISHED;
720
ev.e_upgrade_finished.n = new;
721
ev.e_upgrade_finished.o = old;
722
723
syslog_enabled = pkg_object_bool(pkg_config_get("SYSLOG"));
724
if (syslog_enabled) {
725
const char *actions[] = {
726
[PKG_DOWNGRADE] = "downgraded",
727
[PKG_REINSTALL] = "reinstalled",
728
[PKG_UPGRADE] = "upgraded",
729
};
730
pkg_change_t action;
731
732
action = pkg_version_change_between(new, old);
733
syslog(LOG_NOTICE, "%s %s: %s %s %s ",
734
new->name, actions[action],
735
old->version != NULL ? old->version : new->version,
736
old->version != NULL ? "->" : "",
737
old->version != NULL ? new->version : "");
738
}
739
740
pkg_emit_event(&ev);
741
}
742
743
void
744
pkg_emit_missing_dep(struct pkg *p, struct pkg_dep *d)
745
{
746
struct pkg_event ev;
747
748
ev.type = PKG_EVENT_MISSING_DEP;
749
ev.e_missing_dep.pkg = p;
750
ev.e_missing_dep.dep = d;
751
752
pkg_emit_event(&ev);
753
}
754
755
void
756
pkg_emit_locked(struct pkg *p)
757
{
758
struct pkg_event ev;
759
760
ev.type = PKG_EVENT_LOCKED;
761
ev.e_locked.pkg = p;
762
763
pkg_emit_event(&ev);
764
}
765
766
void
767
pkg_emit_required(struct pkg *p, int force)
768
{
769
struct pkg_event ev;
770
771
ev.type = PKG_EVENT_REQUIRED;
772
ev.e_required.pkg = p;
773
ev.e_required.force = force;
774
775
pkg_emit_event(&ev);
776
}
777
778
void
779
pkg_emit_nolocaldb(void)
780
{
781
struct pkg_event ev;
782
ev.type = PKG_EVENT_NOLOCALDB;
783
784
pkg_emit_event(&ev);
785
}
786
787
void
788
pkg_emit_noremotedb(const char *repo)
789
{
790
struct pkg_event ev;
791
ev.type = PKG_EVENT_NOREMOTEDB;
792
793
ev.e_remotedb.repo = repo;
794
795
pkg_emit_event(&ev);
796
}
797
798
void
799
pkg_emit_newpkgversion(void)
800
{
801
struct pkg_event ev;
802
ev.type = PKG_EVENT_NEWPKGVERSION;
803
804
pkg_emit_event(&ev);
805
}
806
807
void
808
pkg_emit_file_mismatch(struct pkg *pkg, struct pkg_file *f, const char *newsum)
809
{
810
struct pkg_event ev;
811
ev.type = PKG_EVENT_FILE_MISMATCH;
812
813
ev.e_file_mismatch.pkg = pkg;
814
ev.e_file_mismatch.file = f;
815
ev.e_file_mismatch.newsum = newsum;
816
817
pkg_emit_event(&ev);
818
}
819
820
void
821
pkg_emit_file_missing(struct pkg *pkg, struct pkg_file *f)
822
{
823
struct pkg_event ev;
824
ev.type = PKG_EVENT_FILE_MISSING;
825
826
ev.e_file_missing.pkg = pkg;
827
ev.e_file_missing.file = f;
828
829
pkg_emit_event(&ev);
830
}
831
832
void
833
pkg_emit_dir_missing(struct pkg *pkg, struct pkg_dir *d)
834
{
835
struct pkg_event ev;
836
ev.type = PKG_EVENT_DIR_MISSING;
837
838
ev.e_dir_missing.pkg = pkg;
839
ev.e_dir_missing.dir = d;
840
841
pkg_emit_event(&ev);
842
}
843
844
void
845
pkg_emit_file_meta_mismatch(struct pkg *pkg, struct pkg_file *file,
846
enum pkg_meta_attribute attrib,
847
const char *db_val, const char *fs_val)
848
{
849
struct pkg_event ev;
850
ev.type = PKG_EVENT_FILE_META_MISMATCH;
851
852
ev.e_file_meta_mismatch.pkg = pkg;
853
ev.e_file_meta_mismatch.file = file;
854
ev.e_file_meta_mismatch.attrib = attrib;
855
ev.e_file_meta_mismatch.db_val = db_val;
856
ev.e_file_meta_mismatch.fs_val = fs_val;
857
858
pkg_emit_event(&ev);
859
}
860
861
void
862
pkg_emit_dir_meta_mismatch(struct pkg *pkg, struct pkg_dir *dir,
863
enum pkg_meta_attribute attrib,
864
const char *db_val, const char *fs_val)
865
{
866
struct pkg_event ev;
867
ev.type = PKG_EVENT_DIR_META_MISMATCH;
868
869
ev.e_dir_meta_mismatch.pkg = pkg;
870
ev.e_dir_meta_mismatch.dir = dir;
871
ev.e_dir_meta_mismatch.attrib = attrib;
872
ev.e_dir_meta_mismatch.db_val = db_val;
873
ev.e_dir_meta_mismatch.fs_val = fs_val;
874
875
pkg_emit_event(&ev);
876
}
877
878
void
879
pkg_emit_file_meta_ok(struct pkg *pkg, struct pkg_file *file)
880
{
881
struct pkg_event ev;
882
ev.type = PKG_EVENT_FILE_META_OK;
883
884
ev.e_file_ok.pkg = pkg;
885
ev.e_file_ok.file = file;
886
887
pkg_emit_event(&ev);
888
}
889
890
void
891
pkg_emit_dir_meta_ok(struct pkg *pkg, struct pkg_dir *dir)
892
{
893
struct pkg_event ev;
894
ev.type = PKG_EVENT_DIR_META_OK;
895
896
ev.e_dir_ok.pkg = pkg;
897
ev.e_dir_ok.dir = dir;
898
899
pkg_emit_event(&ev);
900
}
901
902
void
903
pkg_plugin_errno(struct pkg_plugin *p, const char *func, const char *arg)
904
{
905
struct pkg_event ev;
906
907
ev.type = PKG_EVENT_PLUGIN_ERRNO;
908
ev.e_plugin_errno.plugin = p;
909
ev.e_plugin_errno.func = func;
910
ev.e_plugin_errno.arg = arg;
911
ev.e_plugin_errno.no = errno;
912
913
pkg_emit_event(&ev);
914
}
915
916
void
917
pkg_plugin_error(struct pkg_plugin *p, const char *fmt, ...)
918
{
919
struct pkg_event ev;
920
va_list ap;
921
922
ev.type = PKG_EVENT_PLUGIN_ERROR;
923
ev.e_plugin_error.plugin = p;
924
925
va_start(ap, fmt);
926
vasprintf(&ev.e_plugin_error.msg, fmt, ap);
927
va_end(ap);
928
929
pkg_emit_event(&ev);
930
free(ev.e_plugin_error.msg);
931
}
932
933
void
934
pkg_plugin_info(struct pkg_plugin *p, const char *fmt, ...)
935
{
936
struct pkg_event ev;
937
va_list ap;
938
939
ev.type = PKG_EVENT_PLUGIN_INFO;
940
ev.e_plugin_info.plugin = p;
941
942
va_start(ap, fmt);
943
vasprintf(&ev.e_plugin_info.msg, fmt, ap);
944
va_end(ap);
945
946
pkg_emit_event(&ev);
947
free(ev.e_plugin_info.msg);
948
}
949
950
void
951
pkg_emit_package_not_found(const char *p)
952
{
953
struct pkg_event ev;
954
955
ev.type = PKG_EVENT_NOT_FOUND;
956
ev.e_not_found.pkg_name = p;
957
958
pkg_emit_event(&ev);
959
}
960
961
void
962
pkg_emit_incremental_update_begin(const char *reponame)
963
{
964
struct pkg_event ev;
965
966
ev.type = PKG_EVENT_INCREMENTAL_UPDATE_BEGIN;
967
ev.e_incremental_update.reponame = reponame;
968
ev.e_incremental_update.processed = 0;
969
970
pkg_emit_event(&ev);
971
}
972
973
void
974
pkg_emit_incremental_update(const char *reponame, int processed)
975
{
976
struct pkg_event ev;
977
978
ev.type = PKG_EVENT_INCREMENTAL_UPDATE;
979
ev.e_incremental_update.reponame = reponame;
980
ev.e_incremental_update.processed = processed;
981
982
pkg_emit_event(&ev);
983
}
984
985
bool
986
pkg_emit_query_yesno(bool deft, const char *msg)
987
{
988
struct pkg_event ev;
989
int ret;
990
991
ev.type = PKG_EVENT_QUERY_YESNO;
992
ev.e_query_yesno.msg = msg;
993
ev.e_query_yesno.deft = deft;
994
995
ret = pkg_emit_event(&ev);
996
return (ret ? true : false);
997
}
998
999
int
1000
pkg_emit_query_select(const char *msg, const char **items, int ncnt, int deft)
1001
{
1002
struct pkg_event ev;
1003
int ret;
1004
1005
ev.type = PKG_EVENT_QUERY_SELECT;
1006
ev.e_query_select.msg = msg;
1007
ev.e_query_select.items = items;
1008
ev.e_query_select.ncnt = ncnt;
1009
ev.e_query_select.deft = deft;
1010
1011
ret = pkg_emit_event(&ev);
1012
return ret;
1013
}
1014
1015
int
1016
pkg_emit_sandbox_get_string(pkg_sandbox_cb call, void *ud, char **str, int64_t *len)
1017
{
1018
struct pkg_event ev;
1019
int ret;
1020
1021
ev.type = PKG_EVENT_SANDBOX_GET_STRING;
1022
ev.e_sandbox_call_str.call = call;
1023
ev.e_sandbox_call_str.userdata = ud;
1024
ev.e_sandbox_call_str.result = str;
1025
ev.e_sandbox_call_str.len = len;
1026
1027
ret = pkg_emit_event(&ev);
1028
return ret;
1029
}
1030
1031
int
1032
pkg_emit_sandbox_call(pkg_sandbox_cb call, int fd, void *ud)
1033
{
1034
struct pkg_event ev;
1035
int ret;
1036
1037
ev.type = PKG_EVENT_SANDBOX_CALL;
1038
ev.e_sandbox_call.call = call;
1039
ev.e_sandbox_call.fd = fd;
1040
ev.e_sandbox_call.userdata = ud;
1041
1042
ret = pkg_emit_event(&ev);
1043
return ret;
1044
}
1045
1046
void
1047
pkg_debug(int level, const char *fmt, ...)
1048
{
1049
struct pkg_event ev;
1050
va_list ap;
1051
1052
if (ctx.debug_level < level)
1053
return;
1054
1055
ev.type = PKG_EVENT_DEBUG;
1056
ev.e_debug.level = level;
1057
va_start(ap, fmt);
1058
vasprintf(&ev.e_debug.msg, fmt, ap);
1059
va_end(ap);
1060
1061
pkg_emit_event(&ev);
1062
free(ev.e_debug.msg);
1063
}
1064
1065
void
1066
pkg_dbg(uint64_t flags, int level, const char *fmt, ...)
1067
{
1068
struct pkg_event ev;
1069
va_list ap;
1070
xstring *string_fmt;
1071
char *nfmt;
1072
1073
if (ctx.debug_level < level)
1074
return;
1075
1076
if ((ctx.debug_flags & (flags|PKG_DBG_ALL)) == 0)
1077
return;
1078
1079
string_fmt = xstring_new();
1080
ev.type = PKG_EVENT_DEBUG;
1081
ev.e_debug.level = level;
1082
for (size_t i = 0; i < NELEM(debug_flags); i++) {
1083
if (flags & debug_flags[i].flag) {
1084
if (string_fmt->size == 0) {
1085
fprintf(string_fmt->fp, "(%s", debug_flags[i].name);
1086
fflush(string_fmt->fp);
1087
} else {
1088
fprintf(string_fmt->fp, "|%s", debug_flags[i].name);
1089
}
1090
}
1091
}
1092
fprintf(string_fmt->fp, ") %s", fmt);
1093
nfmt = xstring_get(string_fmt);
1094
va_start(ap, fmt);
1095
vasprintf(&ev.e_debug.msg, nfmt, ap);
1096
va_end(ap);
1097
1098
pkg_emit_event(&ev);
1099
free(ev.e_debug.msg);
1100
free(nfmt);
1101
}
1102
1103
1104
void
1105
pkg_emit_backup(void)
1106
{
1107
struct pkg_event ev;
1108
1109
ev.type = PKG_EVENT_BACKUP;
1110
1111
pkg_emit_event(&ev);
1112
}
1113
1114
void
1115
pkg_emit_restore(void)
1116
{
1117
struct pkg_event ev;
1118
1119
ev.type = PKG_EVENT_RESTORE;
1120
1121
pkg_emit_event(&ev);
1122
}
1123
1124
void
1125
pkg_emit_progress_start(const char *fmt, ...)
1126
{
1127
struct pkg_event ev;
1128
va_list ap;
1129
1130
ev.type = PKG_EVENT_PROGRESS_START;
1131
if (fmt != NULL) {
1132
va_start(ap, fmt);
1133
vasprintf(&ev.e_progress_start.msg, fmt, ap);
1134
va_end(ap);
1135
} else {
1136
ev.e_progress_start.msg = NULL;
1137
}
1138
1139
pkg_emit_event(&ev);
1140
free(ev.e_progress_start.msg);
1141
}
1142
1143
int
1144
pkg_emit_progress_tick(int64_t current, int64_t total)
1145
{
1146
struct pkg_event ev;
1147
1148
ev.type = PKG_EVENT_PROGRESS_TICK;
1149
ev.e_progress_tick.current = current;
1150
ev.e_progress_tick.total = total;
1151
1152
return !!pkg_emit_event(&ev);
1153
}
1154
1155
void
1156
pkg_emit_new_action(size_t current, size_t total)
1157
{
1158
struct pkg_event ev;
1159
1160
ev.type = PKG_EVENT_NEW_ACTION;
1161
ev.e_action.total = total;
1162
ev.e_action.current = current;
1163
1164
pkg_emit_event(&ev);
1165
}
1166
1167
void
1168
pkg_emit_message(const char *message)
1169
{
1170
struct pkg_event ev;
1171
1172
ev.type = PKG_EVENT_MESSAGE;
1173
ev.e_pkg_message.msg = message;
1174
pkg_emit_event(&ev);
1175
}
1176
1177
void
1178
pkg_register_cleanup_callback(void (*cleanup_cb)(void *data), void *data)
1179
{
1180
struct pkg_event ev;
1181
1182
ev.type = PKG_EVENT_CLEANUP_CALLBACK_REGISTER;
1183
ev.e_cleanup_callback.cleanup_cb = cleanup_cb;
1184
ev.e_cleanup_callback.data = data;
1185
pkg_emit_event(&ev);
1186
}
1187
1188
void
1189
pkg_unregister_cleanup_callback(void (*cleanup_cb)(void *data), void *data)
1190
{
1191
struct pkg_event ev;
1192
1193
ev.type = PKG_EVENT_CLEANUP_CALLBACK_UNREGISTER;
1194
ev.e_cleanup_callback.cleanup_cb = cleanup_cb;
1195
ev.e_cleanup_callback.data = data;
1196
pkg_emit_event(&ev);
1197
}
1198
1199
void
1200
pkg_emit_conflicts(struct pkg *p1, struct pkg *p2, const char *path)
1201
{
1202
struct pkg_event ev;
1203
1204
ev.type = PKG_EVENT_CONFLICTS;
1205
ev.e_conflicts.p1 = p1;
1206
ev.e_conflicts.p2 = p2;
1207
ev.e_conflicts.path = path;
1208
pkg_emit_event(&ev);
1209
}
1210
1211
void
1212
pkg_emit_triggers_begin(void)
1213
{
1214
struct pkg_event ev;
1215
1216
ev.type = PKG_EVENT_TRIGGERS_BEGIN;
1217
1218
pkg_emit_event(&ev);
1219
}
1220
1221
void
1222
pkg_emit_triggers_finished(void)
1223
{
1224
struct pkg_event ev;
1225
1226
ev.type = PKG_EVENT_TRIGGERS_FINISHED;
1227
1228
pkg_emit_event(&ev);
1229
}
1230
1231
void
1232
pkg_emit_trigger(const char *name, bool cleanup)
1233
{
1234
struct pkg_event ev;
1235
1236
ev.type = PKG_EVENT_TRIGGER;
1237
ev.e_trigger.name = name;
1238
ev.e_trigger.cleanup = cleanup;
1239
1240
pkg_emit_event(&ev);
1241
}
1242
1243