Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/pkg
Path: blob/main/libpkg/pkg_event.c
2065 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_plugin_errno(struct pkg_plugin *p, const char *func, const char *arg)
834
{
835
struct pkg_event ev;
836
837
ev.type = PKG_EVENT_PLUGIN_ERRNO;
838
ev.e_plugin_errno.plugin = p;
839
ev.e_plugin_errno.func = func;
840
ev.e_plugin_errno.arg = arg;
841
ev.e_plugin_errno.no = errno;
842
843
pkg_emit_event(&ev);
844
}
845
846
void
847
pkg_plugin_error(struct pkg_plugin *p, const char *fmt, ...)
848
{
849
struct pkg_event ev;
850
va_list ap;
851
852
ev.type = PKG_EVENT_PLUGIN_ERROR;
853
ev.e_plugin_error.plugin = p;
854
855
va_start(ap, fmt);
856
vasprintf(&ev.e_plugin_error.msg, fmt, ap);
857
va_end(ap);
858
859
pkg_emit_event(&ev);
860
free(ev.e_plugin_error.msg);
861
}
862
863
void
864
pkg_plugin_info(struct pkg_plugin *p, const char *fmt, ...)
865
{
866
struct pkg_event ev;
867
va_list ap;
868
869
ev.type = PKG_EVENT_PLUGIN_INFO;
870
ev.e_plugin_info.plugin = p;
871
872
va_start(ap, fmt);
873
vasprintf(&ev.e_plugin_info.msg, fmt, ap);
874
va_end(ap);
875
876
pkg_emit_event(&ev);
877
free(ev.e_plugin_info.msg);
878
}
879
880
void
881
pkg_emit_package_not_found(const char *p)
882
{
883
struct pkg_event ev;
884
885
ev.type = PKG_EVENT_NOT_FOUND;
886
ev.e_not_found.pkg_name = p;
887
888
pkg_emit_event(&ev);
889
}
890
891
void
892
pkg_emit_incremental_update_begin(const char *reponame)
893
{
894
struct pkg_event ev;
895
896
ev.type = PKG_EVENT_INCREMENTAL_UPDATE_BEGIN;
897
ev.e_incremental_update.reponame = reponame;
898
ev.e_incremental_update.processed = 0;
899
900
pkg_emit_event(&ev);
901
}
902
903
void
904
pkg_emit_incremental_update(const char *reponame, int processed)
905
{
906
struct pkg_event ev;
907
908
ev.type = PKG_EVENT_INCREMENTAL_UPDATE;
909
ev.e_incremental_update.reponame = reponame;
910
ev.e_incremental_update.processed = processed;
911
912
pkg_emit_event(&ev);
913
}
914
915
bool
916
pkg_emit_query_yesno(bool deft, const char *msg)
917
{
918
struct pkg_event ev;
919
int ret;
920
921
ev.type = PKG_EVENT_QUERY_YESNO;
922
ev.e_query_yesno.msg = msg;
923
ev.e_query_yesno.deft = deft;
924
925
ret = pkg_emit_event(&ev);
926
return (ret ? true : false);
927
}
928
929
int
930
pkg_emit_query_select(const char *msg, const char **items, int ncnt, int deft)
931
{
932
struct pkg_event ev;
933
int ret;
934
935
ev.type = PKG_EVENT_QUERY_SELECT;
936
ev.e_query_select.msg = msg;
937
ev.e_query_select.items = items;
938
ev.e_query_select.ncnt = ncnt;
939
ev.e_query_select.deft = deft;
940
941
ret = pkg_emit_event(&ev);
942
return ret;
943
}
944
945
int
946
pkg_emit_sandbox_get_string(pkg_sandbox_cb call, void *ud, char **str, int64_t *len)
947
{
948
struct pkg_event ev;
949
int ret;
950
951
ev.type = PKG_EVENT_SANDBOX_GET_STRING;
952
ev.e_sandbox_call_str.call = call;
953
ev.e_sandbox_call_str.userdata = ud;
954
ev.e_sandbox_call_str.result = str;
955
ev.e_sandbox_call_str.len = len;
956
957
ret = pkg_emit_event(&ev);
958
return ret;
959
}
960
961
int
962
pkg_emit_sandbox_call(pkg_sandbox_cb call, int fd, void *ud)
963
{
964
struct pkg_event ev;
965
int ret;
966
967
ev.type = PKG_EVENT_SANDBOX_CALL;
968
ev.e_sandbox_call.call = call;
969
ev.e_sandbox_call.fd = fd;
970
ev.e_sandbox_call.userdata = ud;
971
972
ret = pkg_emit_event(&ev);
973
return ret;
974
}
975
976
void
977
pkg_debug(int level, const char *fmt, ...)
978
{
979
struct pkg_event ev;
980
va_list ap;
981
982
if (ctx.debug_level < level)
983
return;
984
985
ev.type = PKG_EVENT_DEBUG;
986
ev.e_debug.level = level;
987
va_start(ap, fmt);
988
vasprintf(&ev.e_debug.msg, fmt, ap);
989
va_end(ap);
990
991
pkg_emit_event(&ev);
992
free(ev.e_debug.msg);
993
}
994
995
void
996
pkg_dbg(uint64_t flags, int level, const char *fmt, ...)
997
{
998
struct pkg_event ev;
999
va_list ap;
1000
xstring *string_fmt;
1001
char *nfmt;
1002
1003
if (ctx.debug_level < level)
1004
return;
1005
1006
if ((ctx.debug_flags & (flags|PKG_DBG_ALL)) == 0)
1007
return;
1008
1009
string_fmt = xstring_new();
1010
ev.type = PKG_EVENT_DEBUG;
1011
ev.e_debug.level = level;
1012
for (size_t i = 0; i < NELEM(debug_flags); i++) {
1013
if (flags & debug_flags[i].flag) {
1014
if (string_fmt->size == 0) {
1015
fprintf(string_fmt->fp, "(%s", debug_flags[i].name);
1016
fflush(string_fmt->fp);
1017
} else {
1018
fprintf(string_fmt->fp, "|%s", debug_flags[i].name);
1019
}
1020
}
1021
}
1022
fprintf(string_fmt->fp, ") %s", fmt);
1023
nfmt = xstring_get(string_fmt);
1024
va_start(ap, fmt);
1025
vasprintf(&ev.e_debug.msg, nfmt, ap);
1026
va_end(ap);
1027
1028
pkg_emit_event(&ev);
1029
free(ev.e_debug.msg);
1030
free(nfmt);
1031
}
1032
1033
1034
void
1035
pkg_emit_backup(void)
1036
{
1037
struct pkg_event ev;
1038
1039
ev.type = PKG_EVENT_BACKUP;
1040
1041
pkg_emit_event(&ev);
1042
}
1043
1044
void
1045
pkg_emit_restore(void)
1046
{
1047
struct pkg_event ev;
1048
1049
ev.type = PKG_EVENT_RESTORE;
1050
1051
pkg_emit_event(&ev);
1052
}
1053
1054
void
1055
pkg_emit_progress_start(const char *fmt, ...)
1056
{
1057
struct pkg_event ev;
1058
va_list ap;
1059
1060
ev.type = PKG_EVENT_PROGRESS_START;
1061
if (fmt != NULL) {
1062
va_start(ap, fmt);
1063
vasprintf(&ev.e_progress_start.msg, fmt, ap);
1064
va_end(ap);
1065
} else {
1066
ev.e_progress_start.msg = NULL;
1067
}
1068
1069
pkg_emit_event(&ev);
1070
free(ev.e_progress_start.msg);
1071
}
1072
1073
int
1074
pkg_emit_progress_tick(int64_t current, int64_t total)
1075
{
1076
struct pkg_event ev;
1077
1078
ev.type = PKG_EVENT_PROGRESS_TICK;
1079
ev.e_progress_tick.current = current;
1080
ev.e_progress_tick.total = total;
1081
1082
return !!pkg_emit_event(&ev);
1083
}
1084
1085
void
1086
pkg_emit_new_action(size_t current, size_t total)
1087
{
1088
struct pkg_event ev;
1089
1090
ev.type = PKG_EVENT_NEW_ACTION;
1091
ev.e_action.total = total;
1092
ev.e_action.current = current;
1093
1094
pkg_emit_event(&ev);
1095
}
1096
1097
void
1098
pkg_emit_message(const char *message)
1099
{
1100
struct pkg_event ev;
1101
1102
ev.type = PKG_EVENT_MESSAGE;
1103
ev.e_pkg_message.msg = message;
1104
pkg_emit_event(&ev);
1105
}
1106
1107
void
1108
pkg_register_cleanup_callback(void (*cleanup_cb)(void *data), void *data)
1109
{
1110
struct pkg_event ev;
1111
1112
ev.type = PKG_EVENT_CLEANUP_CALLBACK_REGISTER;
1113
ev.e_cleanup_callback.cleanup_cb = cleanup_cb;
1114
ev.e_cleanup_callback.data = data;
1115
pkg_emit_event(&ev);
1116
}
1117
1118
void
1119
pkg_unregister_cleanup_callback(void (*cleanup_cb)(void *data), void *data)
1120
{
1121
struct pkg_event ev;
1122
1123
ev.type = PKG_EVENT_CLEANUP_CALLBACK_UNREGISTER;
1124
ev.e_cleanup_callback.cleanup_cb = cleanup_cb;
1125
ev.e_cleanup_callback.data = data;
1126
pkg_emit_event(&ev);
1127
}
1128
1129
void
1130
pkg_emit_conflicts(struct pkg *p1, struct pkg *p2, const char *path)
1131
{
1132
struct pkg_event ev;
1133
1134
ev.type = PKG_EVENT_CONFLICTS;
1135
ev.e_conflicts.p1 = p1;
1136
ev.e_conflicts.p2 = p2;
1137
ev.e_conflicts.path = path;
1138
pkg_emit_event(&ev);
1139
}
1140
1141
void
1142
pkg_emit_triggers_begin(void)
1143
{
1144
struct pkg_event ev;
1145
1146
ev.type = PKG_EVENT_TRIGGERS_BEGIN;
1147
1148
pkg_emit_event(&ev);
1149
}
1150
1151
void
1152
pkg_emit_triggers_finished(void)
1153
{
1154
struct pkg_event ev;
1155
1156
ev.type = PKG_EVENT_TRIGGERS_FINISHED;
1157
1158
pkg_emit_event(&ev);
1159
}
1160
1161
void
1162
pkg_emit_trigger(const char *name, bool cleanup)
1163
{
1164
struct pkg_event ev;
1165
1166
ev.type = PKG_EVENT_TRIGGER;
1167
ev.e_trigger.name = name;
1168
ev.e_trigger.cleanup = cleanup;
1169
1170
pkg_emit_event(&ev);
1171
}
1172
1173