LCOV - code coverage report
Current view: top level - libpkg - pkg_event.c (source / functions) Hit Total Coverage
Test: cov.info Lines: 146 423 34.5 %
Date: 2015-08-15 Functions: 25 49 51.0 %

          Line data    Source code
       1             : /*-
       2             :  * Copyright (c) 2011-2013 Baptiste Daroussin <bapt@FreeBSD.org>
       3             :  * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
       4             :  * Copyright (c) 2015 Matthew Seaman <matthew@FreeBSD.org>
       5             :  * All rights reserved.
       6             :  *
       7             :  * Redistribution and use in source and binary forms, with or without
       8             :  * modification, are permitted provided that the following conditions
       9             :  * are met:
      10             :  * 1. Redistributions of source code must retain the above copyright
      11             :  *    notice, this list of conditions and the following disclaimer
      12             :  *    in this position and unchanged.
      13             :  * 2. Redistributions in binary form must reproduce the above copyright
      14             :  *    notice, this list of conditions and the following disclaimer in the
      15             :  *    documentation and/or other materials provided with the distribution.
      16             :  *
      17             :  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
      18             :  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
      19             :  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
      20             :  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
      21             :  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      22             :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
      23             :  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
      24             :  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
      25             :  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
      26             :  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      27             :  */
      28             : 
      29             : #include <errno.h>
      30             : #include <string.h>
      31             : #include <syslog.h>
      32             : 
      33             : #define _WITH_DPRINTF
      34             : #include "pkg.h"
      35             : #include "private/pkg.h"
      36             : #include "private/event.h"
      37             : 
      38             : static pkg_event_cb _cb = NULL;
      39             : static void *_data = NULL;
      40             : 
      41             : static char *
      42           0 : sbuf_json_escape(struct sbuf *buf, const char *str)
      43             : {
      44           0 :         sbuf_clear(buf);
      45           0 :         while (str != NULL && *str != '\0') {
      46           0 :                 if (*str == '"' || *str == '\\')
      47           0 :                         sbuf_putc(buf, '\\');
      48           0 :                 sbuf_putc(buf, *str);
      49           0 :                 str++;
      50             :         }
      51           0 :         sbuf_finish(buf);
      52             : 
      53           0 :         return (sbuf_data(buf));
      54             : }
      55             : 
      56             : static void
      57         938 : pipeevent(struct pkg_event *ev)
      58             : {
      59             :         int i;
      60         938 :         struct pkg_dep *dep = NULL;
      61             :         struct sbuf *msg, *buf;
      62             :         struct pkg_event_conflict *cur_conflict;
      63         938 :         if (eventpipe < 0)
      64        1876 :                 return;
      65             : 
      66           0 :         msg = sbuf_new_auto();
      67           0 :         buf = sbuf_new_auto();
      68             : 
      69           0 :         switch(ev->type) {
      70             :         case PKG_EVENT_ERRNO:
      71           0 :                 sbuf_printf(msg, "{ \"type\": \"ERROR\", "
      72             :                     "\"data\": {"
      73             :                     "\"msg\": \"%s(%s): %s\","
      74             :                     "\"errno\": %d}}",
      75             :                     sbuf_json_escape(buf, ev->e_errno.func),
      76             :                     sbuf_json_escape(buf, ev->e_errno.arg),
      77           0 :                     sbuf_json_escape(buf, strerror(ev->e_errno.no)),
      78             :                     ev->e_errno.no);
      79           0 :                 break;
      80             :         case PKG_EVENT_ERROR:
      81           0 :                 sbuf_printf(msg, "{ \"type\": \"ERROR\", "
      82             :                     "\"data\": {\"msg\": \"%s\"}}",
      83           0 :                     sbuf_json_escape(buf, ev->e_pkg_error.msg));
      84           0 :                 break;
      85             :         case PKG_EVENT_NOTICE:
      86           0 :                 sbuf_printf(msg, "{ \"type\": \"NOTICE\", "
      87             :                     "\"data\": {\"msg\": \"%s\"}}",
      88           0 :                     sbuf_json_escape(buf, ev->e_pkg_notice.msg));
      89           0 :                 break;
      90             :         case PKG_EVENT_DEVELOPER_MODE:
      91           0 :                 sbuf_printf(msg, "{ \"type\": \"ERROR\", "
      92             :                     "\"data\": {\"msg\": \"DEVELOPER_MODE: %s\"}}",
      93           0 :                     sbuf_json_escape(buf, ev->e_pkg_error.msg));
      94           0 :                 break;
      95             :         case PKG_EVENT_UPDATE_ADD:
      96           0 :                 sbuf_printf(msg, "{ \"type\": \"INFO_UPDATE_ADD\", "
      97             :                     "\"data\": { "
      98             :                     "\"fetched\": %d, "
      99             :                     "\"total\": %d"
     100             :                     "}}",
     101             :                     ev->e_upd_add.done,
     102             :                     ev->e_upd_add.total
     103             :                     );
     104           0 :                 break;
     105             :         case PKG_EVENT_UPDATE_REMOVE:
     106           0 :                 sbuf_printf(msg, "{ \"type\": \"INFO_UPDATE_REMOVE\", "
     107             :                     "\"data\": { "
     108             :                     "\"fetched\": %d, "
     109             :                     "\"total\": %d"
     110             :                     "}}",
     111             :                     ev->e_upd_remove.done,
     112             :                     ev->e_upd_remove.total
     113             :                     );
     114           0 :                 break;
     115             :         case PKG_EVENT_FETCH_BEGIN:
     116           0 :                 sbuf_printf(msg, "{ \"type\": \"INFO_FETCH_BEGIN\", "
     117             :                     "\"data\": { "
     118             :                     "\"url\": \"%s\" "
     119             :                     "}}",
     120             :                     sbuf_json_escape(buf, ev->e_fetching.url)
     121             :                     );
     122           0 :                 break;
     123             :         case PKG_EVENT_FETCH_FINISHED:
     124           0 :                 sbuf_printf(msg, "{ \"type\": \"INFO_FETCH_FINISHED\", "
     125             :                     "\"data\": { "
     126             :                     "\"url\": \"%s\" "
     127             :                     "}}",
     128             :                     sbuf_json_escape(buf, ev->e_fetching.url)
     129             :                     );
     130           0 :                 break;
     131             :         case PKG_EVENT_INSTALL_BEGIN:
     132           0 :                 pkg_sbuf_printf(msg, "{ \"type\": \"INFO_INSTALL_BEGIN\", "
     133             :                     "\"data\": { "
     134             :                     "\"pkgname\": \"%n\", "
     135             :                     "\"pkgversion\": \"%v\""
     136             :                     "}}", ev->e_install_begin.pkg, ev->e_install_begin.pkg);
     137           0 :                 break;
     138             :         case PKG_EVENT_EXTRACT_BEGIN:
     139           0 :                 pkg_sbuf_printf(msg, "{ \"type\": \"INFO_EXTRACT_BEGIN\", "
     140             :                     "\"data\": { "
     141             :                     "\"pkgname\": \"%n\", "
     142             :                     "\"pkgversion\": \"%v\""
     143             :                     "}}", ev->e_extract_begin.pkg, ev->e_extract_begin.pkg);
     144           0 :                 break;
     145             :         case PKG_EVENT_EXTRACT_FINISHED:
     146           0 :                 pkg_sbuf_printf(msg, "{ \"type\": \"INFO_EXTRACT_FINISHED\", "
     147             :                     "\"data\": { "
     148             :                     "\"pkgname\": \"%n\", "
     149             :                     "\"pkgversion\": \"%v\""
     150             :                     "}}", ev->e_extract_finished.pkg, ev->e_extract_finished.pkg);
     151           0 :                 break;
     152             :         case PKG_EVENT_INSTALL_FINISHED:
     153           0 :                 pkg_sbuf_printf(msg, "{ \"type\": \"INFO_INSTALL_FINISHED\", "
     154             :                     "\"data\": { "
     155             :                     "\"pkgname\": \"%n\", "
     156             :                     "\"pkgversion\": \"%v\", "
     157             :                     "\"message\": \"%S\""
     158             :                     "}}",
     159             :                     ev->e_install_finished.pkg,
     160             :                     ev->e_install_finished.pkg,
     161           0 :                     sbuf_json_escape(buf, ev->e_install_finished.pkg->message));
     162           0 :                 break;
     163             :         case PKG_EVENT_INTEGRITYCHECK_BEGIN:
     164           0 :                 sbuf_printf(msg, "{ \"type\": \"INFO_INTEGRITYCHECK_BEGIN\", "
     165             :                     "\"data\": {}}");
     166           0 :                 break;
     167             :         case PKG_EVENT_INTEGRITYCHECK_CONFLICT:
     168           0 :                 sbuf_printf(msg, "{ \"type\": \"INFO_INTEGRITYCHECK_CONFLICT\","
     169             :                         "\"data\": { "
     170             :                         "\"pkguid\": \"%s\", "
     171             :                         "\"pkgpath\": \"%s\", "
     172             :                         "\"conflicts\": [",
     173             :                         ev->e_integrity_conflict.pkg_uid,
     174             :                         ev->e_integrity_conflict.pkg_path);
     175           0 :                 cur_conflict = ev->e_integrity_conflict.conflicts;
     176           0 :                 while (cur_conflict != NULL) {
     177           0 :                         if (cur_conflict->next != NULL) {
     178           0 :                                 sbuf_printf(msg, "{\"uid\":\"%s\"},",
     179             :                                                 cur_conflict->uid);
     180             :                         }
     181             :                         else {
     182           0 :                                 sbuf_printf(msg, "{\"uid\":\"%s\"}",
     183             :                                                 cur_conflict->uid);
     184           0 :                                 break;
     185             :                         }
     186           0 :                         cur_conflict = cur_conflict->next;
     187             :                 }
     188           0 :                 sbuf_cat(msg, "]}}");
     189           0 :                 break;
     190             :         case PKG_EVENT_INTEGRITYCHECK_FINISHED:
     191           0 :                 sbuf_printf(msg, "{ \"type\": \"INFO_INTEGRITYCHECK_FINISHED\", "
     192             :                     "\"data\": {\"conflicting\": %d}}",
     193             :                     ev->e_integrity_finished.conflicting);
     194           0 :                 break;
     195             :         case PKG_EVENT_DEINSTALL_BEGIN:
     196           0 :                 pkg_sbuf_printf(msg, "{ \"type\": \"INFO_DEINSTALL_BEGIN\", "
     197             :                     "\"data\": { "
     198             :                     "\"pkgname\": \"%n\", "
     199             :                     "\"pkgversion\": \"%v\""
     200             :                     "}}",
     201             :                     ev->e_deinstall_begin.pkg,
     202             :                     ev->e_deinstall_begin.pkg);
     203           0 :                 break;
     204             :         case PKG_EVENT_DEINSTALL_FINISHED:
     205           0 :                 pkg_sbuf_printf(msg, "{ \"type\": \"INFO_DEINSTALL_FINISHED\", "
     206             :                     "\"data\": { "
     207             :                     "\"pkgname\": \"%n\", "
     208             :                     "\"pkgversion\": \"%v\""
     209             :                     "}}",
     210             :                     ev->e_deinstall_finished.pkg,
     211             :                     ev->e_deinstall_finished.pkg);
     212           0 :                 break;
     213             :         case PKG_EVENT_UPGRADE_BEGIN:
     214           0 :                 pkg_sbuf_printf(msg, "{ \"type\": \"INFO_UPGRADE_BEGIN\", "
     215             :                     "\"data\": { "
     216             :                     "\"pkgname\": \"%n\", "
     217             :                     "\"pkgversion\": \"%v\" ,"
     218             :                     "\"pkgnewversion\": \"%v\""
     219             :                     "}}",
     220             :                     ev->e_upgrade_begin.o,
     221             :                     ev->e_upgrade_begin.o,
     222             :                     ev->e_upgrade_begin.n);
     223           0 :                 break;
     224             :         case PKG_EVENT_UPGRADE_FINISHED:
     225           0 :                 pkg_sbuf_printf(msg, "{ \"type\": \"INFO_UPGRADE_FINISHED\", "
     226             :                     "\"data\": { "
     227             :                     "\"pkgname\": \"%n\", "
     228             :                     "\"pkgversion\": \"%v\" ,"
     229             :                     "\"pkgnewversion\": \"%v\""
     230             :                     "}}",
     231             :                     ev->e_upgrade_finished.o,
     232             :                     ev->e_upgrade_finished.o,
     233             :                     ev->e_upgrade_finished.n);
     234           0 :                 break;
     235             :         case PKG_EVENT_LOCKED:
     236           0 :                 pkg_sbuf_printf(msg, "{ \"type\": \"ERROR_LOCKED\", "
     237             :                     "\"data\": { "
     238             :                     "\"pkgname\": \"%n\", "
     239             :                     "\"pkgversion\": \"%n\""
     240             :                     "}}",
     241             :                     ev->e_locked.pkg,
     242             :                     ev->e_locked.pkg);
     243           0 :                 break;
     244             :         case PKG_EVENT_REQUIRED:
     245           0 :                 pkg_sbuf_printf(msg, "{ \"type\": \"ERROR_REQUIRED\", "
     246             :                     "\"data\": { "
     247             :                     "\"pkgname\": \"%n\", "
     248             :                     "\"pkgversion\": \"%v\", "
     249             :                     "\"force\": %S, "
     250             :                     "\"required_by\": [",
     251             :                     ev->e_required.pkg,
     252             :                     ev->e_required.pkg,
     253           0 :                     ev->e_required.force == 1 ? "true": "false");
     254           0 :                 while (pkg_rdeps(ev->e_required.pkg, &dep) == EPKG_OK)
     255           0 :                         sbuf_printf(msg, "{ \"pkgname\": \"%s\", "
     256             :                             "\"pkgversion\": \"%s\" }, ",
     257           0 :                             dep->name, dep->version);
     258           0 :                 sbuf_setpos(msg, sbuf_len(msg) - 2);
     259           0 :                 sbuf_cat(msg, "]}}");
     260           0 :                 break;
     261             :         case PKG_EVENT_ALREADY_INSTALLED:
     262           0 :                 pkg_sbuf_printf(msg, "{ \"type\": \"ERROR_ALREADY_INSTALLED\", "
     263             :                     "\"data\": { "
     264             :                     "\"pkgname\": \"%n\", "
     265             :                     "\"pkgversion\": \"%v\""
     266             :                     "}}",
     267             :                     ev->e_already_installed.pkg,
     268             :                     ev->e_already_installed.pkg);
     269           0 :                 break;
     270             :         case PKG_EVENT_MISSING_DEP:
     271           0 :                 sbuf_printf(msg, "{ \"type\": \"ERROR_MISSING_DEP\", "
     272             :                     "\"data\": { "
     273             :                     "\"depname\": \"%s\", "
     274             :                     "\"depversion\": \"%s\""
     275             :                     "}}" ,
     276           0 :                     ev->e_missing_dep.dep->name,
     277           0 :                     ev->e_missing_dep.dep->version);
     278           0 :                 break;
     279             :         case PKG_EVENT_NOREMOTEDB:
     280           0 :                 sbuf_printf(msg, "{ \"type\": \"ERROR_NOREMOTEDB\", "
     281             :                     "\"data\": { "
     282             :                     "\"url\": \"%s\" "
     283             :                     "}}" ,
     284             :                     ev->e_remotedb.repo);
     285           0 :                 break;
     286             :         case PKG_EVENT_NOLOCALDB:
     287           0 :                 sbuf_printf(msg, "{ \"type\": \"ERROR_NOLOCALDB\", "
     288             :                     "\"data\": {} ");
     289           0 :                 break;
     290             :         case PKG_EVENT_NEWPKGVERSION:
     291           0 :                 sbuf_printf(msg, "{ \"type\": \"INFO_NEWPKGVERSION\", "
     292             :                     "\"data\": {} ");
     293           0 :                 break;
     294             :         case PKG_EVENT_FILE_MISMATCH:
     295           0 :                 pkg_sbuf_printf(msg, "{ \"type\": \"ERROR_FILE_MISMATCH\", "
     296             :                     "\"data\": { "
     297             :                     "\"pkgname\": \"%n\", "
     298             :                     "\"pkgversion\": \"%v\", "
     299             :                     "\"path\": \"%S\""
     300             :                     "}}",
     301             :                     ev->e_file_mismatch.pkg,
     302             :                     ev->e_file_mismatch.pkg,
     303           0 :                     sbuf_json_escape(buf, ev->e_file_mismatch.file->path));
     304           0 :                 break;
     305             :         case PKG_EVENT_PLUGIN_ERRNO:
     306           0 :                 sbuf_printf(msg, "{ \"type\": \"ERROR_PLUGIN\", "
     307             :                     "\"data\": {"
     308             :                     "\"plugin\": \"%s\", "
     309             :                     "\"msg\": \"%s(%s): %s\","
     310             :                     "\"errno\": %d"
     311             :                     "}}",
     312             :                     pkg_plugin_get(ev->e_plugin_errno.plugin, PKG_PLUGIN_NAME),
     313             :                     sbuf_json_escape(buf, ev->e_plugin_errno.func),
     314             :                     sbuf_json_escape(buf, ev->e_plugin_errno.arg),
     315           0 :                     sbuf_json_escape(buf, strerror(ev->e_plugin_errno.no)),
     316             :                     ev->e_plugin_errno.no);
     317           0 :                 break;
     318             :         case PKG_EVENT_PLUGIN_ERROR:
     319           0 :                 sbuf_printf(msg, "{ \"type\": \"ERROR_PLUGIN\", "
     320             :                     "\"data\": {"
     321             :                     "\"plugin\": \"%s\", "
     322             :                     "\"msg\": \"%s\""
     323             :                     "}}",
     324             :                     pkg_plugin_get(ev->e_plugin_error.plugin, PKG_PLUGIN_NAME),
     325           0 :                     sbuf_json_escape(buf, ev->e_plugin_error.msg));
     326           0 :                 break;
     327             :         case PKG_EVENT_PLUGIN_INFO:
     328           0 :                 sbuf_printf(msg, "{ \"type\": \"INFO_PLUGIN\", "
     329             :                     "\"data\": {"
     330             :                     "\"plugin\": \"%s\", "
     331             :                     "\"msg\": \"%s\""
     332             :                     "}}",
     333             :                     pkg_plugin_get(ev->e_plugin_info.plugin, PKG_PLUGIN_NAME),
     334           0 :                     sbuf_json_escape(buf, ev->e_plugin_info.msg));
     335           0 :                 break;
     336             :         case PKG_EVENT_INCREMENTAL_UPDATE:
     337           0 :                 sbuf_printf(msg, "{ \"type\": \"INFO_INCREMENTAL_UPDATE\", "
     338             :                     "\"data\": {"
     339             :                         "\"name\": \"%s\", "
     340             :                         "\"processed\": %d"
     341             :                         "}}", ev->e_incremental_update.reponame,
     342             :                         ev->e_incremental_update.processed);
     343           0 :                 break;
     344             :         case PKG_EVENT_QUERY_YESNO:
     345           0 :                 sbuf_printf(msg, "{ \"type\": \"QUERY_YESNO\", "
     346             :                     "\"data\": {"
     347             :                         "\"msg\": \"%s\","
     348             :                         "\"default\": \"%d\""
     349             :                         "}}", ev->e_query_yesno.msg,
     350             :                         ev->e_query_yesno.deft);
     351           0 :                 break;
     352             :         case PKG_EVENT_QUERY_SELECT:
     353           0 :                 sbuf_printf(msg, "{ \"type\": \"QUERY_SELECT\", "
     354             :                     "\"data\": {"
     355             :                         "\"msg\": \"%s\","
     356             :                         "\"ncnt\": \"%d\","
     357             :                         "\"default\": \"%d\","
     358             :                         "\"items\": ["
     359             :                         , ev->e_query_select.msg,
     360             :                         ev->e_query_select.ncnt,
     361             :                         ev->e_query_select.deft);
     362           0 :                 for (i = 0; i < ev->e_query_select.ncnt - 1; i++)
     363             :                 {
     364           0 :                         sbuf_printf(msg, "{ \"text\": \"%s\" },",
     365           0 :                                 ev->e_query_select.items[i]);
     366             :                 }
     367           0 :                 sbuf_printf(msg, "{ \"text\": \"%s\" } ] }}",
     368           0 :                         ev->e_query_select.items[i]);
     369           0 :                 break;
     370             :         case PKG_EVENT_PROGRESS_START:
     371           0 :                 sbuf_printf(msg, "{ \"type\": \"INFO_PROGRESS_START\", "
     372             :                   "\"data\": {}}");
     373           0 :                 break;
     374             :         case PKG_EVENT_PROGRESS_TICK:
     375           0 :                 sbuf_printf(msg, "{ \"type\": \"INFO_PROGRESS_TICK\", "
     376             :                   "\"data\": { \"current\": %ld, \"total\" : %ld}}",
     377             :                   ev->e_progress_tick.current, ev->e_progress_tick.total);
     378           0 :                 break;
     379             :         case PKG_EVENT_BACKUP:
     380             :         case PKG_EVENT_RESTORE:
     381           0 :                 break;
     382             :         default:
     383           0 :                 break;
     384             :         }
     385           0 :         sbuf_finish(msg);
     386           0 :         dprintf(eventpipe, "%s\n", sbuf_data(msg));
     387           0 :         sbuf_delete(msg);
     388           0 :         sbuf_delete(buf);
     389             : }
     390             : 
     391             : void
     392         384 : pkg_event_register(pkg_event_cb cb, void *data)
     393             : {
     394         384 :         _cb = cb;
     395         384 :         _data = data;
     396         384 : }
     397             : 
     398             : static int
     399         938 : pkg_emit_event(struct pkg_event *ev)
     400             : {
     401         938 :         int ret = 0;
     402         938 :         pkg_plugins_hook_run(PKG_PLUGIN_HOOK_EVENT, ev, NULL);
     403         938 :         if (_cb != NULL)
     404         934 :                 ret = _cb(_data, ev);
     405         938 :         pipeevent(ev);
     406         938 :         return (ret);
     407             : }
     408             : 
     409             : void
     410          41 : pkg_emit_error(const char *fmt, ...)
     411             : {
     412             :         struct pkg_event ev;
     413             :         va_list ap;
     414             : 
     415          41 :         ev.type = PKG_EVENT_ERROR;
     416             : 
     417          41 :         va_start(ap, fmt);
     418          41 :         vasprintf(&ev.e_pkg_error.msg, fmt, ap);
     419          41 :         va_end(ap);
     420             : 
     421          41 :         pkg_emit_event(&ev);
     422          41 :         free(ev.e_pkg_error.msg);
     423          41 : }
     424             : 
     425             : void
     426           0 : pkg_emit_notice(const char *fmt, ...)
     427             : {
     428             :         struct pkg_event ev;
     429             :         va_list ap;
     430             : 
     431           0 :         ev.type = PKG_EVENT_NOTICE;
     432             : 
     433           0 :         va_start(ap, fmt);
     434           0 :         vasprintf(&ev.e_pkg_notice.msg, fmt, ap);
     435           0 :         va_end(ap);
     436             : 
     437           0 :         pkg_emit_event(&ev);
     438           0 :         free(ev.e_pkg_error.msg);
     439           0 : }
     440             : 
     441             : void
     442           0 : pkg_emit_developer_mode(const char *fmt, ...)
     443             : {
     444             :         struct pkg_event ev;
     445             :         va_list ap;
     446             : 
     447           0 :         ev.type = PKG_EVENT_DEVELOPER_MODE;
     448             : 
     449           0 :         va_start(ap, fmt);
     450           0 :         vasprintf(&ev.e_pkg_error.msg, fmt, ap);
     451           0 :         va_end(ap);
     452             : 
     453           0 :         pkg_emit_event(&ev);
     454           0 :         free(ev.e_pkg_error.msg);
     455           0 : }
     456             : 
     457             : void
     458           1 : pkg_emit_errno(const char *func, const char *arg)
     459             : {
     460             :         struct pkg_event ev;
     461             : 
     462           1 :         ev.type = PKG_EVENT_ERRNO;
     463           1 :         ev.e_errno.func = func;
     464           1 :         ev.e_errno.arg = arg;
     465           1 :         ev.e_errno.no = errno;
     466             : 
     467           1 :         pkg_emit_event(&ev);
     468           1 : }
     469             : 
     470             : void
     471           0 : pkg_emit_already_installed(struct pkg *p)
     472             : {
     473             :         struct pkg_event ev;
     474             : 
     475           0 :         ev.type = PKG_EVENT_ALREADY_INSTALLED;
     476           0 :         ev.e_already_installed.pkg = p;
     477             : 
     478           0 :         pkg_emit_event(&ev);
     479           0 : }
     480             : 
     481             : void
     482          14 : pkg_emit_fetch_begin(const char *url)
     483             : {
     484             :         struct pkg_event ev;
     485             : 
     486          14 :         ev.type = PKG_EVENT_FETCH_BEGIN;
     487          14 :         ev.e_fetching.url = url;
     488             : 
     489          14 :         pkg_emit_event(&ev);
     490          14 : }
     491             : 
     492             : void
     493          14 : pkg_emit_fetch_finished(const char *url)
     494             : {
     495             :         struct pkg_event ev;
     496             : 
     497          14 :         ev.type = PKG_EVENT_FETCH_FINISHED;
     498          14 :         ev.e_fetching.url = url;
     499             : 
     500          14 :         pkg_emit_event(&ev);
     501          14 : }
     502             : 
     503             : void
     504           0 : pkg_emit_update_remove(int total, int done)
     505             : {
     506             :         struct pkg_event ev;
     507             : 
     508           0 :         ev.type = PKG_EVENT_UPDATE_REMOVE;
     509           0 :         ev.e_upd_remove.total = total;
     510           0 :         ev.e_upd_remove.done = done;
     511             : 
     512           0 :         pkg_emit_event(&ev);
     513           0 : }
     514             : 
     515             : 
     516             : void
     517           0 : pkg_emit_update_add(int total, int done)
     518             : {
     519             :         struct pkg_event ev;
     520             : 
     521           0 :         ev.type = PKG_EVENT_UPDATE_ADD;
     522           0 :         ev.e_upd_add.total = total;
     523           0 :         ev.e_upd_add.done = done;
     524             : 
     525           0 :         pkg_emit_event(&ev);
     526           0 : }
     527             : 
     528             : void
     529          42 : pkg_emit_install_begin(struct pkg *p)
     530             : {
     531             :         struct pkg_event ev;
     532             : 
     533          42 :         ev.type = PKG_EVENT_INSTALL_BEGIN;
     534          42 :         ev.e_install_begin.pkg = p;
     535             : 
     536          42 :         pkg_emit_event(&ev);
     537          42 : }
     538             : 
     539             : void
     540          39 : pkg_emit_install_finished(struct pkg *p)
     541             : {
     542             :         struct pkg_event ev;
     543          39 :         bool syslog_enabled = false;
     544             : 
     545          39 :         ev.type = PKG_EVENT_INSTALL_FINISHED;
     546          39 :         ev.e_install_finished.pkg = p;
     547             : 
     548          39 :         syslog_enabled = pkg_object_bool(pkg_config_get("SYSLOG"));
     549          39 :         if (syslog_enabled) {
     550          39 :                 syslog(LOG_NOTICE, "%s-%s installed",
     551             :                     p->name, p->version);
     552             :         }
     553             : 
     554          39 :         pkg_emit_event(&ev);
     555          39 : }
     556             : 
     557             : void
     558          11 : pkg_emit_add_deps_begin(struct pkg *p)
     559             : {
     560             :         struct pkg_event ev;
     561             : 
     562          11 :         ev.type = PKG_EVENT_ADD_DEPS_BEGIN;
     563          11 :         ev.e_add_deps_begin.pkg = p;
     564             : 
     565          11 :         pkg_emit_event(&ev);
     566          11 : }
     567             : 
     568             : void
     569          11 : pkg_emit_add_deps_finished(struct pkg *p)
     570             : {
     571             :         struct pkg_event ev;
     572             : 
     573          11 :         ev.type = PKG_EVENT_ADD_DEPS_FINISHED;
     574          11 :         ev.e_add_deps_finished.pkg = p;
     575             : 
     576          11 :         pkg_emit_event(&ev);
     577          11 : }
     578             : 
     579             : void
     580          18 : pkg_emit_extract_begin(struct pkg *p)
     581             : {
     582             :         struct pkg_event ev;
     583             : 
     584          18 :         ev.type = PKG_EVENT_EXTRACT_BEGIN;
     585          18 :         ev.e_extract_begin.pkg = p;
     586             : 
     587          18 :         pkg_emit_event(&ev);
     588          18 : }
     589             : 
     590             : void
     591          18 : pkg_emit_extract_finished(struct pkg *p)
     592             : {
     593             :         struct pkg_event ev;
     594             : 
     595          18 :         ev.type = PKG_EVENT_EXTRACT_FINISHED;
     596          18 :         ev.e_extract_finished.pkg = p;
     597             : 
     598          18 :         pkg_emit_event(&ev);
     599          18 : }
     600             : 
     601             : void
     602           5 : pkg_emit_delete_files_begin(struct pkg *p)
     603             : {
     604             :         struct pkg_event ev;
     605             : 
     606           5 :         ev.type = PKG_EVENT_DELETE_FILES_BEGIN;
     607           5 :         ev.e_delete_files_begin.pkg = p;
     608             : 
     609           5 :         pkg_emit_event(&ev);
     610           5 : }
     611             : 
     612             : void
     613           5 : pkg_emit_delete_files_finished(struct pkg *p)
     614             : {
     615             :         struct pkg_event ev;
     616             : 
     617           5 :         ev.type = PKG_EVENT_DELETE_FILES_FINISHED;
     618           5 :         ev.e_delete_files_finished.pkg = p;
     619             : 
     620           5 :         pkg_emit_event(&ev);
     621           5 : }
     622             : 
     623             : void
     624          15 : pkg_emit_integritycheck_begin(void)
     625             : {
     626             :         struct pkg_event ev;
     627          15 :         ev.type = PKG_EVENT_INTEGRITYCHECK_BEGIN;
     628             : 
     629          15 :         pkg_emit_event(&ev);
     630          15 : }
     631             : 
     632             : void
     633          15 : pkg_emit_integritycheck_finished(int conflicting)
     634             : {
     635             :         struct pkg_event ev;
     636          15 :         ev.type = PKG_EVENT_INTEGRITYCHECK_FINISHED;
     637          15 :         ev.e_integrity_finished.conflicting = conflicting;
     638             : 
     639          15 :         pkg_emit_event(&ev);
     640          15 : }
     641             : 
     642             : void
     643           0 : pkg_emit_integritycheck_conflict(const char *uid,
     644             :         const char *path, struct pkg_event_conflict *conflicts)
     645             : {
     646             :         struct pkg_event ev;
     647           0 :         ev.type = PKG_EVENT_INTEGRITYCHECK_CONFLICT;
     648           0 :         ev.e_integrity_conflict.pkg_uid = uid;
     649           0 :         ev.e_integrity_conflict.pkg_path = path;
     650           0 :         ev.e_integrity_conflict.conflicts = conflicts;
     651             : 
     652           0 :         pkg_emit_event(&ev);
     653           0 : }
     654             : 
     655             : void
     656           6 : pkg_emit_deinstall_begin(struct pkg *p)
     657             : {
     658             :         struct pkg_event ev;
     659             : 
     660           6 :         ev.type = PKG_EVENT_DEINSTALL_BEGIN;
     661           6 :         ev.e_deinstall_begin.pkg = p;
     662             : 
     663           6 :         pkg_emit_event(&ev);
     664           6 : }
     665             : 
     666             : void
     667           6 : pkg_emit_deinstall_finished(struct pkg *p)
     668             : {
     669             :         struct pkg_event ev;
     670           6 :         bool syslog_enabled = false;
     671             : 
     672           6 :         ev.type = PKG_EVENT_DEINSTALL_FINISHED;
     673           6 :         ev.e_deinstall_finished.pkg = p;
     674             : 
     675           6 :         syslog_enabled = pkg_object_bool(pkg_config_get("SYSLOG"));
     676           6 :         if (syslog_enabled) {
     677           6 :                 syslog(LOG_NOTICE, "%s-%s deinstalled",
     678             :                     p->name, p->version);
     679             :         }
     680             : 
     681           6 :         pkg_emit_event(&ev);
     682           6 : }
     683             : 
     684             : void
     685           0 : pkg_emit_upgrade_begin(struct pkg *new, struct pkg *old)
     686             : {
     687             :         struct pkg_event ev;
     688             : 
     689           0 :         ev.type = PKG_EVENT_UPGRADE_BEGIN;
     690           0 :         ev.e_upgrade_begin.n = new;
     691           0 :         ev.e_upgrade_begin.o = old;
     692             : 
     693           0 :         pkg_emit_event(&ev);
     694           0 : }
     695             : 
     696             : void
     697           0 : pkg_emit_upgrade_finished(struct pkg *new, struct pkg *old)
     698             : {
     699             :         struct pkg_event ev;
     700           0 :         bool syslog_enabled = false;
     701             : 
     702           0 :         ev.type = PKG_EVENT_UPGRADE_FINISHED;
     703           0 :         ev.e_upgrade_finished.n = new;
     704           0 :         ev.e_upgrade_finished.o = old;
     705             : 
     706           0 :         syslog_enabled = pkg_object_bool(pkg_config_get("SYSLOG"));
     707           0 :         if (syslog_enabled) {
     708           0 :                 const char *actions[] = {
     709             :                         [PKG_DOWNGRADE] = "downgraded",
     710             :                         [PKG_REINSTALL] = "reinstalled",
     711             :                         [PKG_UPGRADE]   = "upgraded",
     712             :                 };
     713             :                 pkg_change_t action;
     714             : 
     715           0 :                 action = pkg_version_change_between(new, old);
     716           0 :                 syslog(LOG_NOTICE, "%s %s: %s %s %s ",
     717             :                     new->name, actions[action],
     718           0 :                     old->version != NULL ? old->version : new->version,
     719           0 :                     old->version != NULL ? "->" : "",
     720           0 :                     old->version != NULL ? new->version : "");
     721             :         }
     722             : 
     723           0 :         pkg_emit_event(&ev);
     724           0 : }
     725             : 
     726             : void
     727           4 : pkg_emit_missing_dep(struct pkg *p, struct pkg_dep *d)
     728             : {
     729             :         struct pkg_event ev;
     730             : 
     731           4 :         ev.type = PKG_EVENT_MISSING_DEP;
     732           4 :         ev.e_missing_dep.pkg = p;
     733           4 :         ev.e_missing_dep.dep = d;
     734             : 
     735           4 :         pkg_emit_event(&ev);
     736           4 : }
     737             : 
     738             : void
     739           0 : pkg_emit_locked(struct pkg *p)
     740             : {
     741             :         struct pkg_event ev;
     742             : 
     743           0 :         ev.type = PKG_EVENT_LOCKED;
     744           0 :         ev.e_locked.pkg = p;
     745             : 
     746           0 :         pkg_emit_event(&ev);
     747           0 : }
     748             : 
     749             : void
     750           0 : pkg_emit_required(struct pkg *p, int force)
     751             : {
     752             :         struct pkg_event ev;
     753             : 
     754           0 :         ev.type = PKG_EVENT_REQUIRED;
     755           0 :         ev.e_required.pkg = p;
     756           0 :         ev.e_required.force = force;
     757             : 
     758           0 :         pkg_emit_event(&ev);
     759           0 : }
     760             : 
     761             : void
     762           0 : pkg_emit_nolocaldb(void)
     763             : {
     764             :         struct pkg_event ev;
     765           0 :         ev.type = PKG_EVENT_NOLOCALDB;
     766             : 
     767           0 :         pkg_emit_event(&ev);
     768           0 : }
     769             : 
     770             : void
     771           0 : pkg_emit_noremotedb(const char *repo)
     772             : {
     773             :         struct pkg_event ev;
     774           0 :         ev.type = PKG_EVENT_NOREMOTEDB;
     775             : 
     776           0 :         ev.e_remotedb.repo = repo;
     777             : 
     778           0 :         pkg_emit_event(&ev);
     779           0 : }
     780             : 
     781             : void
     782           0 : pkg_emit_newpkgversion(void)
     783             : {
     784             :         struct pkg_event ev;
     785           0 :         ev.type = PKG_EVENT_NEWPKGVERSION;
     786             : 
     787           0 :         pkg_emit_event(&ev);
     788           0 : }
     789             : 
     790             : void
     791           0 : pkg_emit_file_mismatch(struct pkg *pkg, struct pkg_file *f, const char *newsum) {
     792             :         struct pkg_event ev;
     793           0 :         ev.type = PKG_EVENT_FILE_MISMATCH;
     794             : 
     795           0 :         ev.e_file_mismatch.pkg = pkg;
     796           0 :         ev.e_file_mismatch.file = f;
     797           0 :         ev.e_file_mismatch.newsum = newsum;
     798             : 
     799           0 :         pkg_emit_event(&ev);
     800           0 : }
     801             : 
     802             : void
     803           0 : pkg_plugin_errno(struct pkg_plugin *p, const char *func, const char *arg)
     804             : {
     805             :         struct pkg_event ev;
     806             : 
     807           0 :         ev.type = PKG_EVENT_PLUGIN_ERRNO;
     808           0 :         ev.e_plugin_errno.plugin = p;
     809           0 :         ev.e_plugin_errno.func = func;
     810           0 :         ev.e_plugin_errno.arg = arg;
     811           0 :         ev.e_plugin_errno.no = errno;
     812             : 
     813           0 :         pkg_emit_event(&ev);
     814           0 : }
     815             : 
     816             : void
     817           0 : pkg_plugin_error(struct pkg_plugin *p, const char *fmt, ...)
     818             : {
     819             :         struct pkg_event ev;
     820             :         va_list ap;
     821             : 
     822           0 :         ev.type = PKG_EVENT_PLUGIN_ERROR;
     823           0 :         ev.e_plugin_error.plugin = p;
     824             : 
     825           0 :         va_start(ap, fmt);
     826           0 :         vasprintf(&ev.e_plugin_error.msg, fmt, ap);
     827           0 :         va_end(ap);
     828             : 
     829           0 :         pkg_emit_event(&ev);
     830           0 :         free(ev.e_plugin_error.msg);
     831           0 : }
     832             : 
     833             : void
     834           0 : pkg_plugin_info(struct pkg_plugin *p, const char *fmt, ...)
     835             : {
     836             :         struct pkg_event ev;
     837             :         va_list ap;
     838             : 
     839           0 :         ev.type = PKG_EVENT_PLUGIN_INFO;
     840           0 :         ev.e_plugin_info.plugin = p;
     841             : 
     842           0 :         va_start(ap, fmt);
     843           0 :         vasprintf(&ev.e_plugin_info.msg, fmt, ap);
     844           0 :         va_end(ap);
     845             : 
     846           0 :         pkg_emit_event(&ev);
     847           0 :         free(ev.e_plugin_info.msg);
     848           0 : }
     849             : 
     850             : void
     851           0 : pkg_emit_package_not_found(const char *p)
     852             : {
     853             :         struct pkg_event ev;
     854             : 
     855           0 :         ev.type = PKG_EVENT_NOT_FOUND;
     856           0 :         ev.e_not_found.pkg_name = p;
     857             : 
     858           0 :         pkg_emit_event(&ev);
     859           0 : }
     860             : 
     861             : void
     862           7 : pkg_emit_incremental_update(const char *reponame, int processed)
     863             : {
     864             :         struct pkg_event ev;
     865             : 
     866           7 :         ev.type = PKG_EVENT_INCREMENTAL_UPDATE;
     867           7 :         ev.e_incremental_update.reponame = reponame;
     868           7 :         ev.e_incremental_update.processed = processed;
     869             : 
     870           7 :         pkg_emit_event(&ev);
     871           7 : }
     872             : 
     873             : bool
     874           0 : pkg_emit_query_yesno(bool deft, const char *msg)
     875             : {
     876             :         struct pkg_event ev;
     877             :         int ret;
     878             : 
     879           0 :         ev.type = PKG_EVENT_QUERY_YESNO;
     880           0 :         ev.e_query_yesno.msg = msg;
     881           0 :         ev.e_query_yesno.deft = deft;
     882             : 
     883           0 :         ret = pkg_emit_event(&ev);
     884           0 :         return (ret ? true : false);
     885             : }
     886             : 
     887             : int
     888           0 : pkg_emit_query_select(const char *msg, const char **items, int ncnt, int deft)
     889             : {
     890             :         struct pkg_event ev;
     891             :         int ret;
     892             : 
     893           0 :         ev.type = PKG_EVENT_QUERY_SELECT;
     894           0 :         ev.e_query_select.msg = msg;
     895           0 :         ev.e_query_select.items = items;
     896           0 :         ev.e_query_select.ncnt = ncnt;
     897           0 :         ev.e_query_select.deft = deft;
     898             : 
     899           0 :         ret = pkg_emit_event(&ev);
     900           0 :         return ret;
     901             : }
     902             : 
     903             : int
     904          14 : pkg_emit_sandbox_get_string(pkg_sandbox_cb call, void *ud, char **str, int64_t *len)
     905             : {
     906             :         struct pkg_event ev;
     907             :         int ret;
     908             : 
     909          14 :         ev.type = PKG_EVENT_SANDBOX_GET_STRING;
     910          14 :         ev.e_sandbox_call_str.call = call;
     911          14 :         ev.e_sandbox_call_str.userdata = ud;
     912          14 :         ev.e_sandbox_call_str.result = str;
     913          14 :         ev.e_sandbox_call_str.len = len;
     914             : 
     915          14 :         ret = pkg_emit_event(&ev);
     916          14 :         return ret;
     917             : }
     918             : 
     919             : int
     920           0 : pkg_emit_sandbox_call(pkg_sandbox_cb call, int fd, void *ud)
     921             : {
     922             :         struct pkg_event ev;
     923             :         int ret;
     924             : 
     925           0 :         ev.type = PKG_EVENT_SANDBOX_CALL;
     926           0 :         ev.e_sandbox_call.call = call;
     927           0 :         ev.e_sandbox_call.fd = fd;
     928           0 :         ev.e_sandbox_call.userdata = ud;
     929             : 
     930           0 :         ret = pkg_emit_event(&ev);
     931           0 :         return ret;
     932             : }
     933             : 
     934             : void
     935       15385 : pkg_debug(int level, const char *fmt, ...)
     936             : {
     937             :         struct pkg_event ev;
     938             :         va_list ap;
     939             : 
     940       15385 :         if (debug_level < level)
     941       30770 :                 return;
     942             : 
     943           0 :         ev.type = PKG_EVENT_DEBUG;
     944           0 :         ev.e_debug.level = level;
     945           0 :         va_start(ap, fmt);
     946           0 :         vasprintf(&ev.e_debug.msg, fmt, ap);
     947           0 :         va_end(ap);
     948             : 
     949           0 :         pkg_emit_event(&ev);
     950           0 :         free(ev.e_debug.msg);
     951             : }
     952             : 
     953             : void
     954           0 : pkg_emit_backup(void)
     955             : {
     956             :         struct pkg_event ev;
     957             : 
     958           0 :         ev.type = PKG_EVENT_BACKUP;
     959             : 
     960           0 :         pkg_emit_event(&ev);
     961           0 : }
     962             : 
     963             : void
     964           0 : pkg_emit_restore(void)
     965             : {
     966             :         struct pkg_event ev;
     967             : 
     968           0 :         ev.type = PKG_EVENT_RESTORE;
     969             : 
     970           0 :         pkg_emit_event(&ev);
     971           0 : }
     972             : 
     973             : void
     974         274 : pkg_emit_progress_start(const char *fmt, ...)
     975             : {
     976             :         struct pkg_event ev;
     977             :         va_list ap;
     978             : 
     979         274 :         ev.type = PKG_EVENT_PROGRESS_START;
     980         274 :         if (fmt != NULL) {
     981         237 :                 va_start(ap, fmt);
     982         237 :                 vasprintf(&ev.e_progress_start.msg, fmt, ap);
     983         237 :                 va_end(ap);
     984             :         } else {
     985          37 :                 ev.e_progress_start.msg = NULL;
     986             :         }
     987             : 
     988         274 :         pkg_emit_event(&ev);
     989         274 :         free(ev.e_progress_start.msg);
     990         274 : }
     991             : 
     992             : void
     993         378 : pkg_emit_progress_tick(int64_t current, int64_t total)
     994             : {
     995             :         struct pkg_event ev;
     996             : 
     997         378 :         ev.type = PKG_EVENT_PROGRESS_TICK;
     998         378 :         ev.e_progress_tick.current = current;
     999         378 :         ev.e_progress_tick.total = total;
    1000             : 
    1001         378 :         pkg_emit_event(&ev);
    1002             : 
    1003         378 : }

Generated by: LCOV version 1.10