LCOV - code coverage report
Current view: top level - libsystemd/sd-bus - bus-dump.c (source / functions) Hit Total Coverage
Test: systemd_full.info Lines: 261 344 75.9 %
Date: 2019-08-23 13:36:53 Functions: 4 6 66.7 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 203 326 62.3 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: LGPL-2.1+ */
       2                 :            : 
       3                 :            : #include <sys/time.h>
       4                 :            : 
       5                 :            : #include "alloc-util.h"
       6                 :            : #include "bus-dump.h"
       7                 :            : #include "bus-internal.h"
       8                 :            : #include "bus-message.h"
       9                 :            : #include "bus-type.h"
      10                 :            : #include "cap-list.h"
      11                 :            : #include "capability-util.h"
      12                 :            : #include "fileio.h"
      13                 :            : #include "format-util.h"
      14                 :            : #include "locale-util.h"
      15                 :            : #include "macro.h"
      16                 :            : #include "string-util.h"
      17                 :            : #include "strv.h"
      18                 :            : #include "terminal-util.h"
      19                 :            : #include "util.h"
      20                 :            : 
      21                 :       3304 : static char *indent(unsigned level, unsigned flags) {
      22                 :            :         char *p;
      23                 :       3304 :         unsigned n, i = 0;
      24                 :            : 
      25                 :       3304 :         n = 0;
      26                 :            : 
      27   [ -  +  #  # ]:       3304 :         if (flags & BUS_MESSAGE_DUMP_SUBTREE_ONLY && level > 0)
      28                 :          0 :                 level -= 1;
      29                 :            : 
      30         [ +  + ]:       3304 :         if (flags & BUS_MESSAGE_DUMP_WITH_HEADER)
      31                 :       2344 :                 n += 2;
      32                 :            : 
      33                 :       3304 :         p = new(char, n + level*8 + 1);
      34         [ -  + ]:       3304 :         if (!p)
      35                 :          0 :                 return NULL;
      36                 :            : 
      37         [ +  + ]:       3304 :         if (flags & BUS_MESSAGE_DUMP_WITH_HEADER) {
      38                 :       2344 :                 p[i++] = ' ';
      39                 :       2344 :                 p[i++] = ' ';
      40                 :            :         }
      41                 :            : 
      42                 :       3304 :         memset(p + i, ' ', level*8);
      43                 :       3304 :         p[i + level*8] = 0;
      44                 :            : 
      45                 :       3304 :         return p;
      46                 :            : }
      47                 :            : 
      48                 :         64 : int bus_message_dump(sd_bus_message *m, FILE *f, unsigned flags) {
      49                 :         64 :         unsigned level = 1;
      50                 :            :         int r;
      51                 :            : 
      52         [ -  + ]:         64 :         assert(m);
      53                 :            : 
      54         [ +  + ]:         64 :         if (!f)
      55                 :         12 :                 f = stdout;
      56                 :            : 
      57         [ +  + ]:         64 :         if (flags & BUS_MESSAGE_DUMP_WITH_HEADER) {
      58                 :        104 :                 fprintf(f,
      59                 :            :                         "%s%s%s Type=%s%s%s  Endian=%c  Flags=%u  Version=%u  Priority=%"PRIi64,
      60         [ -  + ]:         52 :                         m->header->type == SD_BUS_MESSAGE_METHOD_ERROR ? ansi_highlight_red() :
      61         [ +  + ]:         96 :                         m->header->type == SD_BUS_MESSAGE_METHOD_RETURN ? ansi_highlight_green() :
      62         [ +  + ]:         44 :                         m->header->type != SD_BUS_MESSAGE_SIGNAL ? ansi_highlight() : "",
      63                 :            :                         special_glyph(SPECIAL_GLYPH_TRIANGULAR_BULLET),
      64                 :            :                         ansi_normal(),
      65                 :            : 
      66                 :            :                         ansi_highlight(),
      67         [ +  - ]:         52 :                         bus_message_type_to_string(m->header->type) ?: "(unknown)",
      68                 :            :                         ansi_normal(),
      69                 :            : 
      70                 :         52 :                         m->header->endian,
      71                 :         52 :                         m->header->flags,
      72                 :         52 :                         m->header->version,
      73                 :            :                         m->priority);
      74                 :            : 
      75                 :            :                 /* Display synthetic message serial number in a more readable
      76                 :            :                  * format than (uint32_t) -1 */
      77         [ -  + ]:         52 :                 if (BUS_MESSAGE_COOKIE(m) == 0xFFFFFFFFULL)
      78                 :          0 :                         fprintf(f, " Cookie=-1");
      79                 :            :                 else
      80                 :         52 :                         fprintf(f, " Cookie=%" PRIu64, BUS_MESSAGE_COOKIE(m));
      81                 :            : 
      82         [ +  + ]:         52 :                 if (m->reply_cookie != 0)
      83                 :          8 :                         fprintf(f, "  ReplyCookie=%" PRIu64, m->reply_cookie);
      84                 :            : 
      85                 :         52 :                 fputs("\n", f);
      86                 :            : 
      87         [ -  + ]:         52 :                 if (m->sender)
      88                 :          0 :                         fprintf(f, "  Sender=%s%s%s", ansi_highlight(), m->sender, ansi_normal());
      89         [ +  + ]:         52 :                 if (m->destination)
      90                 :         20 :                         fprintf(f, "  Destination=%s%s%s", ansi_highlight(), m->destination, ansi_normal());
      91         [ +  + ]:         52 :                 if (m->path)
      92                 :         44 :                         fprintf(f, "  Path=%s%s%s", ansi_highlight(), m->path, ansi_normal());
      93         [ +  + ]:         52 :                 if (m->interface)
      94                 :         44 :                         fprintf(f, "  Interface=%s%s%s", ansi_highlight(), m->interface, ansi_normal());
      95         [ +  + ]:         52 :                 if (m->member)
      96                 :         44 :                         fprintf(f, "  Member=%s%s%s", ansi_highlight(), m->member, ansi_normal());
      97                 :            : 
      98   [ +  -  +  +  :         52 :                 if (m->sender || m->destination || m->path || m->interface || m->member)
          +  +  +  -  -  
                      + ]
      99                 :         44 :                         fputs("\n", f);
     100                 :            : 
     101         [ -  + ]:         52 :                 if (sd_bus_error_is_set(&m->error))
     102                 :          0 :                         fprintf(f,
     103                 :            :                                 "  ErrorName=%s%s%s"
     104                 :            :                                 "  ErrorMessage=%s\"%s\"%s\n",
     105                 :            :                                 ansi_highlight_red(), strna(m->error.name), ansi_normal(),
     106                 :            :                                 ansi_highlight_red(), strna(m->error.message), ansi_normal());
     107                 :            : 
     108         [ -  + ]:         52 :                 if (m->monotonic != 0)
     109                 :          0 :                         fprintf(f, "  Monotonic="USEC_FMT, m->monotonic);
     110         [ -  + ]:         52 :                 if (m->realtime != 0)
     111                 :          0 :                         fprintf(f, "  Realtime="USEC_FMT, m->realtime);
     112         [ -  + ]:         52 :                 if (m->seqnum != 0)
     113                 :          0 :                         fprintf(f, "  SequenceNumber=%"PRIu64, m->seqnum);
     114                 :            : 
     115   [ +  -  +  -  :         52 :                 if (m->monotonic != 0 || m->realtime != 0 || m->seqnum != 0)
                   -  + ]
     116                 :          0 :                         fputs("\n", f);
     117                 :            : 
     118                 :         52 :                 bus_creds_dump(&m->creds, f, true);
     119                 :            :         }
     120                 :            : 
     121                 :         64 :         r = sd_bus_message_rewind(m, !(flags & BUS_MESSAGE_DUMP_SUBTREE_ONLY));
     122         [ -  + ]:         64 :         if (r < 0)
     123         [ #  # ]:          0 :                 return log_error_errno(r, "Failed to rewind: %m");
     124                 :            : 
     125         [ +  - ]:         64 :         if (!(flags & BUS_MESSAGE_DUMP_SUBTREE_ONLY)) {
     126         [ +  - ]:         64 :                 _cleanup_free_ char *prefix = NULL;
     127                 :            : 
     128                 :         64 :                 prefix = indent(0, flags);
     129         [ -  + ]:         64 :                 if (!prefix)
     130                 :          0 :                         return log_oom();
     131                 :            : 
     132                 :         64 :                 fprintf(f, "%sMESSAGE \"%s\" {\n", prefix, strempty(m->root_container.signature));
     133                 :            :         }
     134                 :            : 
     135                 :       3176 :         for (;;) {
     136   [ +  -  +  + ]:       3240 :                 _cleanup_free_ char *prefix = NULL;
     137                 :       3240 :                 const char *contents = NULL;
     138                 :            :                 char type;
     139                 :            :                 union {
     140                 :            :                         uint8_t u8;
     141                 :            :                         uint16_t u16;
     142                 :            :                         int16_t s16;
     143                 :            :                         uint32_t u32;
     144                 :            :                         int32_t s32;
     145                 :            :                         uint64_t u64;
     146                 :            :                         int64_t s64;
     147                 :            :                         double d64;
     148                 :            :                         const char *string;
     149                 :            :                         int i;
     150                 :            :                 } basic;
     151                 :            : 
     152                 :       3240 :                 r = sd_bus_message_peek_type(m, &type, &contents);
     153         [ -  + ]:       3240 :                 if (r < 0)
     154         [ #  # ]:          0 :                         return log_error_errno(r, "Failed to peek type: %m");
     155                 :            : 
     156         [ +  + ]:       3240 :                 if (r == 0) {
     157         [ +  + ]:        988 :                         if (level <= 1)
     158                 :         64 :                                 break;
     159                 :            : 
     160                 :        924 :                         r = sd_bus_message_exit_container(m);
     161         [ -  + ]:        924 :                         if (r < 0)
     162         [ #  # ]:          0 :                                 return log_error_errno(r, "Failed to exit container: %m");
     163                 :            : 
     164                 :        924 :                         level--;
     165                 :            : 
     166                 :        924 :                         prefix = indent(level, flags);
     167         [ -  + ]:        924 :                         if (!prefix)
     168                 :          0 :                                 return log_oom();
     169                 :            : 
     170                 :        924 :                         fprintf(f, "%s};\n", prefix);
     171                 :        924 :                         continue;
     172                 :            :                 }
     173                 :            : 
     174                 :       2252 :                 prefix = indent(level, flags);
     175         [ -  + ]:       2252 :                 if (!prefix)
     176                 :          0 :                         return log_oom();
     177                 :            : 
     178         [ +  + ]:       2252 :                 if (bus_type_is_container(type) > 0) {
     179                 :        924 :                         r = sd_bus_message_enter_container(m, type, contents);
     180         [ -  + ]:        924 :                         if (r < 0)
     181         [ #  # ]:          0 :                                 return log_error_errno(r, "Failed to enter container: %m");
     182                 :            : 
     183         [ +  + ]:        924 :                         if (type == SD_BUS_TYPE_ARRAY)
     184                 :        316 :                                 fprintf(f, "%sARRAY \"%s\" {\n", prefix, contents);
     185         [ +  + ]:        608 :                         else if (type == SD_BUS_TYPE_VARIANT)
     186                 :        176 :                                 fprintf(f, "%sVARIANT \"%s\" {\n", prefix, contents);
     187         [ +  + ]:        432 :                         else if (type == SD_BUS_TYPE_STRUCT)
     188                 :        184 :                                 fprintf(f, "%sSTRUCT \"%s\" {\n", prefix, contents);
     189         [ +  - ]:        248 :                         else if (type == SD_BUS_TYPE_DICT_ENTRY)
     190                 :        248 :                                 fprintf(f, "%sDICT_ENTRY \"%s\" {\n", prefix, contents);
     191                 :            : 
     192                 :        924 :                         level++;
     193                 :            : 
     194                 :        924 :                         continue;
     195                 :            :                 }
     196                 :            : 
     197                 :       1328 :                 r = sd_bus_message_read_basic(m, type, &basic);
     198         [ -  + ]:       1328 :                 if (r < 0)
     199         [ #  # ]:          0 :                         return log_error_errno(r, "Failed to get basic: %m");
     200                 :            : 
     201         [ -  + ]:       1328 :                 assert(r > 0);
     202                 :            : 
     203   [ +  +  -  -  :       1328 :                 switch (type) {
          +  +  -  +  +  
             +  +  +  -  
                      - ]
     204                 :            : 
     205                 :        140 :                 case SD_BUS_TYPE_BYTE:
     206                 :        140 :                         fprintf(f, "%sBYTE %s%u%s;\n", prefix, ansi_highlight(), basic.u8, ansi_normal());
     207                 :        140 :                         break;
     208                 :            : 
     209                 :         20 :                 case SD_BUS_TYPE_BOOLEAN:
     210                 :         20 :                         fprintf(f, "%sBOOLEAN %s%s%s;\n", prefix, ansi_highlight(), true_false(basic.i), ansi_normal());
     211                 :         20 :                         break;
     212                 :            : 
     213                 :          0 :                 case SD_BUS_TYPE_INT16:
     214                 :          0 :                         fprintf(f, "%sINT16 %s%i%s;\n", prefix, ansi_highlight(), basic.s16, ansi_normal());
     215                 :          0 :                         break;
     216                 :            : 
     217                 :          0 :                 case SD_BUS_TYPE_UINT16:
     218                 :          0 :                         fprintf(f, "%sUINT16 %s%u%s;\n", prefix, ansi_highlight(), basic.u16, ansi_normal());
     219                 :          0 :                         break;
     220                 :            : 
     221                 :        116 :                 case SD_BUS_TYPE_INT32:
     222                 :        116 :                         fprintf(f, "%sINT32 %s%i%s;\n", prefix, ansi_highlight(), basic.s32, ansi_normal());
     223                 :        116 :                         break;
     224                 :            : 
     225                 :         48 :                 case SD_BUS_TYPE_UINT32:
     226                 :         48 :                         fprintf(f, "%sUINT32 %s%u%s;\n", prefix, ansi_highlight(), basic.u32, ansi_normal());
     227                 :         48 :                         break;
     228                 :            : 
     229                 :          0 :                 case SD_BUS_TYPE_INT64:
     230                 :          0 :                         fprintf(f, "%sINT64 %s%"PRIi64"%s;\n", prefix, ansi_highlight(), basic.s64, ansi_normal());
     231                 :          0 :                         break;
     232                 :            : 
     233                 :         68 :                 case SD_BUS_TYPE_UINT64:
     234                 :         68 :                         fprintf(f, "%sUINT64 %s%"PRIu64"%s;\n", prefix, ansi_highlight(), basic.u64, ansi_normal());
     235                 :         68 :                         break;
     236                 :            : 
     237                 :         20 :                 case SD_BUS_TYPE_DOUBLE:
     238                 :         20 :                         fprintf(f, "%sDOUBLE %s%g%s;\n", prefix, ansi_highlight(), basic.d64, ansi_normal());
     239                 :         20 :                         break;
     240                 :            : 
     241                 :        848 :                 case SD_BUS_TYPE_STRING:
     242                 :        848 :                         fprintf(f, "%sSTRING \"%s%s%s\";\n", prefix, ansi_highlight(), basic.string, ansi_normal());
     243                 :        848 :                         break;
     244                 :            : 
     245                 :         48 :                 case SD_BUS_TYPE_OBJECT_PATH:
     246                 :         48 :                         fprintf(f, "%sOBJECT_PATH \"%s%s%s\";\n", prefix, ansi_highlight(), basic.string, ansi_normal());
     247                 :         48 :                         break;
     248                 :            : 
     249                 :         20 :                 case SD_BUS_TYPE_SIGNATURE:
     250                 :         20 :                         fprintf(f, "%sSIGNATURE \"%s%s%s\";\n", prefix, ansi_highlight(), basic.string, ansi_normal());
     251                 :         20 :                         break;
     252                 :            : 
     253                 :          0 :                 case SD_BUS_TYPE_UNIX_FD:
     254                 :          0 :                         fprintf(f, "%sUNIX_FD %s%i%s;\n", prefix, ansi_highlight(), basic.i, ansi_normal());
     255                 :          0 :                         break;
     256                 :            : 
     257                 :          0 :                 default:
     258                 :          0 :                         assert_not_reached("Unknown basic type.");
     259                 :            :                 }
     260                 :            :         }
     261                 :            : 
     262         [ +  - ]:         64 :         if (!(flags & BUS_MESSAGE_DUMP_SUBTREE_ONLY)) {
     263         [ +  - ]:         64 :                 _cleanup_free_ char *prefix = NULL;
     264                 :            : 
     265                 :         64 :                 prefix = indent(0, flags);
     266         [ -  + ]:         64 :                 if (!prefix)
     267                 :          0 :                         return log_oom();
     268                 :            : 
     269                 :         64 :                 fprintf(f, "%s};\n\n", prefix);
     270                 :            :         }
     271                 :            : 
     272                 :         64 :         return 0;
     273                 :            : }
     274                 :            : 
     275                 :        240 : static void dump_capabilities(
     276                 :            :                 sd_bus_creds *c,
     277                 :            :                 FILE *f,
     278                 :            :                 const char *name,
     279                 :            :                 bool terse,
     280                 :            :                 int (*has)(sd_bus_creds *c, int capability)) {
     281                 :            : 
     282                 :            :         unsigned long i, last_cap;
     283                 :        240 :         unsigned n = 0;
     284                 :            :         int r;
     285                 :            : 
     286         [ -  + ]:        240 :         assert(c);
     287         [ -  + ]:        240 :         assert(f);
     288         [ -  + ]:        240 :         assert(name);
     289         [ -  + ]:        240 :         assert(has);
     290                 :            : 
     291                 :        240 :         i = 0;
     292                 :        240 :         r = has(c, i);
     293         [ +  + ]:        240 :         if (r < 0)
     294                 :        208 :                 return;
     295                 :            : 
     296   [ -  +  +  - ]:         32 :         fprintf(f, "%s%s=%s", terse ? "  " : "", name, terse ? "" : ansi_highlight());
     297                 :         32 :         last_cap = cap_last_cap();
     298                 :            : 
     299                 :            :         for (;;) {
     300         [ +  + ]:       1216 :                 if (r > 0) {
     301                 :            : 
     302         [ +  + ]:        608 :                         if (n > 0)
     303                 :        592 :                                 fputc(' ', f);
     304         [ +  + ]:        608 :                         if (n % 4 == 3)
     305         [ +  - ]:        144 :                                 fprintf(f, terse ? "\n          " : "\n        ");
     306                 :            : 
     307                 :        608 :                         fprintf(f, "%s", strna(capability_to_name(i)));
     308                 :        608 :                         n++;
     309                 :            :                 }
     310                 :            : 
     311                 :       1216 :                 i++;
     312                 :            : 
     313         [ +  + ]:       1216 :                 if (i > last_cap)
     314                 :         32 :                         break;
     315                 :            : 
     316                 :       1184 :                 r = has(c, i);
     317                 :            :         }
     318                 :            : 
     319                 :         32 :         fputs("\n", f);
     320                 :            : 
     321         [ -  + ]:         32 :         if (!terse)
     322                 :          0 :                 fputs(ansi_normal(), f);
     323                 :            : }
     324                 :            : 
     325                 :         60 : int bus_creds_dump(sd_bus_creds *c, FILE *f, bool terse) {
     326                 :            :         uid_t owner, audit_loginuid;
     327                 :            :         uint32_t audit_sessionid;
     328                 :         60 :         char **cmdline = NULL, **well_known = NULL;
     329                 :            :         const char *prefix, *color, *suffix, *s;
     330                 :            :         int r, q, v, w, z;
     331                 :            : 
     332         [ -  + ]:         60 :         assert(c);
     333                 :            : 
     334         [ +  + ]:         60 :         if (!f)
     335                 :          8 :                 f = stdout;
     336                 :            : 
     337         [ +  - ]:         60 :         if (terse) {
     338                 :         60 :                 prefix = "  ";
     339                 :         60 :                 suffix = "";
     340                 :         60 :                 color = "";
     341                 :            :         } else {
     342                 :            :                 const char *off;
     343                 :            : 
     344                 :          0 :                 prefix = "";
     345                 :          0 :                 color = ansi_highlight();
     346                 :            : 
     347                 :          0 :                 off = ansi_normal();
     348   [ #  #  #  #  :          0 :                 suffix = strjoina(off, "\n");
          #  #  #  #  #  
                #  #  # ]
     349                 :            :         }
     350                 :            : 
     351         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_PID)
     352                 :          8 :                 fprintf(f, "%sPID=%s"PID_FMT"%s", prefix, color, c->pid, suffix);
     353         [ -  + ]:         60 :         if (c->mask & SD_BUS_CREDS_TID)
     354                 :          0 :                 fprintf(f, "%sTID=%s"PID_FMT"%s", prefix, color, c->tid, suffix);
     355         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_PPID) {
     356         [ +  + ]:          8 :                 if (c->ppid == 0)
     357                 :          4 :                         fprintf(f, "%sPPID=%sn/a%s", prefix, color, suffix);
     358                 :            :                 else
     359                 :          4 :                         fprintf(f, "%sPPID=%s"PID_FMT"%s", prefix, color, c->ppid, suffix);
     360                 :            :         }
     361         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_TTY)
     362                 :          8 :                 fprintf(f, "%sTTY=%s%s%s", prefix, color, strna(c->tty), suffix);
     363                 :            : 
     364   [ +  -  +  + ]:         60 :         if (terse && ((c->mask & (SD_BUS_CREDS_PID|SD_BUS_CREDS_TID|SD_BUS_CREDS_PPID|SD_BUS_CREDS_TTY))))
     365                 :          8 :                 fputs("\n", f);
     366                 :            : 
     367         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_UID)
     368                 :          8 :                 fprintf(f, "%sUID=%s"UID_FMT"%s", prefix, color, c->uid, suffix);
     369         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_EUID)
     370                 :          8 :                 fprintf(f, "%sEUID=%s"UID_FMT"%s", prefix, color, c->euid, suffix);
     371         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_SUID)
     372                 :          8 :                 fprintf(f, "%sSUID=%s"UID_FMT"%s", prefix, color, c->suid, suffix);
     373         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_FSUID)
     374                 :          8 :                 fprintf(f, "%sFSUID=%s"UID_FMT"%s", prefix, color, c->fsuid, suffix);
     375                 :         60 :         r = sd_bus_creds_get_owner_uid(c, &owner);
     376         [ +  + ]:         60 :         if (r >= 0)
     377                 :          4 :                 fprintf(f, "%sOwnerUID=%s"UID_FMT"%s", prefix, color, owner, suffix);
     378         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_GID)
     379                 :          8 :                 fprintf(f, "%sGID=%s"GID_FMT"%s", prefix, color, c->gid, suffix);
     380         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_EGID)
     381                 :          8 :                 fprintf(f, "%sEGID=%s"GID_FMT"%s", prefix, color, c->egid, suffix);
     382         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_SGID)
     383                 :          8 :                 fprintf(f, "%sSGID=%s"GID_FMT"%s", prefix, color, c->sgid, suffix);
     384         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_FSGID)
     385                 :          8 :                 fprintf(f, "%sFSGID=%s"GID_FMT"%s", prefix, color, c->fsgid, suffix);
     386                 :            : 
     387         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS) {
     388                 :            :                 unsigned i;
     389                 :            : 
     390                 :          8 :                 fprintf(f, "%sSupplementaryGIDs=%s", prefix, color);
     391         [ +  + ]:         44 :                 for (i = 0; i < c->n_supplementary_gids; i++)
     392         [ +  + ]:         36 :                         fprintf(f, "%s" GID_FMT, i > 0 ? " " : "", c->supplementary_gids[i]);
     393                 :          8 :                 fprintf(f, "%s", suffix);
     394                 :            :         }
     395                 :            : 
     396   [ +  -  +  + ]:         60 :         if (terse && ((c->mask & (SD_BUS_CREDS_UID|SD_BUS_CREDS_EUID|SD_BUS_CREDS_SUID|SD_BUS_CREDS_FSUID|
     397                 :            :                                   SD_BUS_CREDS_GID|SD_BUS_CREDS_EGID|SD_BUS_CREDS_SGID|SD_BUS_CREDS_FSGID|
     398         [ -  + ]:         52 :                                   SD_BUS_CREDS_SUPPLEMENTARY_GIDS)) || r >= 0))
     399                 :          8 :                 fputs("\n", f);
     400                 :            : 
     401         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_COMM)
     402                 :          8 :                 fprintf(f, "%sComm=%s%s%s", prefix, color, c->comm, suffix);
     403         [ -  + ]:         60 :         if (c->mask & SD_BUS_CREDS_TID_COMM)
     404                 :          0 :                 fprintf(f, "%sTIDComm=%s%s%s", prefix, color, c->tid_comm, suffix);
     405         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_EXE)
     406                 :          4 :                 fprintf(f, "%sExe=%s%s%s", prefix, color, strna(c->exe), suffix);
     407                 :            : 
     408   [ +  -  +  + ]:         60 :         if (terse && (c->mask & (SD_BUS_CREDS_EXE|SD_BUS_CREDS_COMM|SD_BUS_CREDS_TID_COMM)))
     409                 :          8 :                 fputs("\n", f);
     410                 :            : 
     411                 :         60 :         r = sd_bus_creds_get_cmdline(c, &cmdline);
     412         [ +  + ]:         60 :         if (r >= 0) {
     413                 :            :                 char **i;
     414                 :            : 
     415                 :          8 :                 fprintf(f, "%sCommandLine=%s", prefix, color);
     416   [ +  -  +  + ]:         32 :                 STRV_FOREACH(i, cmdline) {
     417         [ +  + ]:         24 :                         if (i != cmdline)
     418                 :         16 :                                 fputc(' ', f);
     419                 :            : 
     420                 :         24 :                         fputs(*i, f);
     421                 :            :                 }
     422                 :            : 
     423                 :          8 :                 fprintf(f, "%s", suffix);
     424         [ -  + ]:         52 :         } else if (r != -ENODATA)
     425                 :          0 :                 fprintf(f, "%sCommandLine=%sn/a%s", prefix, color, suffix);
     426                 :            : 
     427         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_SELINUX_CONTEXT)
     428                 :          8 :                 fprintf(f, "%sLabel=%s%s%s", prefix, color, c->label, suffix);
     429         [ -  + ]:         60 :         if (c->mask & SD_BUS_CREDS_DESCRIPTION)
     430                 :          0 :                 fprintf(f, "%sDescription=%s%s%s", prefix, color, c->description, suffix);
     431                 :            : 
     432   [ +  -  +  + ]:         60 :         if (terse && (c->mask & (SD_BUS_CREDS_SELINUX_CONTEXT|SD_BUS_CREDS_DESCRIPTION)))
     433                 :          8 :                 fputs("\n", f);
     434                 :            : 
     435         [ +  + ]:         60 :         if (c->mask & SD_BUS_CREDS_CGROUP)
     436                 :          8 :                 fprintf(f, "%sCGroup=%s%s%s", prefix, color, c->cgroup, suffix);
     437                 :         60 :         s = NULL;
     438                 :         60 :         r = sd_bus_creds_get_unit(c, &s);
     439         [ +  + ]:         60 :         if (r != -ENODATA)
     440                 :          8 :                 fprintf(f, "%sUnit=%s%s%s", prefix, color, strna(s), suffix);
     441                 :         60 :         s = NULL;
     442                 :         60 :         v = sd_bus_creds_get_slice(c, &s);
     443         [ +  + ]:         60 :         if (v != -ENODATA)
     444                 :          8 :                 fprintf(f, "%sSlice=%s%s%s", prefix, color, strna(s), suffix);
     445                 :         60 :         s = NULL;
     446                 :         60 :         q = sd_bus_creds_get_user_unit(c, &s);
     447         [ +  + ]:         60 :         if (q != -ENODATA)
     448                 :          8 :                 fprintf(f, "%sUserUnit=%s%s%s", prefix, color, strna(s), suffix);
     449                 :         60 :         s = NULL;
     450                 :         60 :         w = sd_bus_creds_get_user_slice(c, &s);
     451         [ +  + ]:         60 :         if (w != -ENODATA)
     452                 :          8 :                 fprintf(f, "%sUserSlice=%s%s%s", prefix, color, strna(s), suffix);
     453                 :         60 :         s = NULL;
     454                 :         60 :         z = sd_bus_creds_get_session(c, &s);
     455         [ +  + ]:         60 :         if (z != -ENODATA)
     456                 :          8 :                 fprintf(f, "%sSession=%s%s%s", prefix, color, strna(s), suffix);
     457                 :            : 
     458   [ +  -  +  +  :         60 :         if (terse && ((c->mask & SD_BUS_CREDS_CGROUP) || r != -ENODATA || q != -ENODATA || v != -ENODATA || w != -ENODATA || z != -ENODATA))
          +  -  +  -  +  
             -  +  -  -  
                      + ]
     459                 :          8 :                 fputs("\n", f);
     460                 :            : 
     461                 :         60 :         r = sd_bus_creds_get_audit_login_uid(c, &audit_loginuid);
     462         [ +  + ]:         60 :         if (r >= 0)
     463                 :          4 :                 fprintf(f, "%sAuditLoginUID=%s"UID_FMT"%s", prefix, color, audit_loginuid, suffix);
     464         [ +  + ]:         56 :         else if (r != -ENODATA)
     465                 :          4 :                 fprintf(f, "%sAuditLoginUID=%sn/a%s", prefix, color, suffix);
     466                 :         60 :         q = sd_bus_creds_get_audit_session_id(c, &audit_sessionid);
     467         [ +  + ]:         60 :         if (q >= 0)
     468                 :          4 :                 fprintf(f, "%sAuditSessionID=%s%"PRIu32"%s", prefix, color, audit_sessionid, suffix);
     469         [ +  + ]:         56 :         else if (q != -ENODATA)
     470                 :          4 :                 fprintf(f, "%sAuditSessionID=%sn/a%s", prefix, color, suffix);
     471                 :            : 
     472   [ +  -  +  +  :         60 :         if (terse && (r != -ENODATA || q != -ENODATA))
                   -  + ]
     473                 :          8 :                 fputs("\n", f);
     474                 :            : 
     475         [ -  + ]:         60 :         if (c->mask & SD_BUS_CREDS_UNIQUE_NAME)
     476                 :          0 :                 fprintf(f, "%sUniqueName=%s%s%s", prefix, color, c->unique_name, suffix);
     477                 :            : 
     478         [ -  + ]:         60 :         if (sd_bus_creds_get_well_known_names(c, &well_known) >= 0) {
     479                 :            :                 char **i;
     480                 :            : 
     481                 :          0 :                 fprintf(f, "%sWellKnownNames=%s", prefix, color);
     482   [ #  #  #  # ]:          0 :                 STRV_FOREACH(i, well_known) {
     483         [ #  # ]:          0 :                         if (i != well_known)
     484                 :          0 :                                 fputc(' ', f);
     485                 :            : 
     486                 :          0 :                         fputs(*i, f);
     487                 :            :                 }
     488                 :            : 
     489                 :          0 :                 fprintf(f, "%s", suffix);
     490                 :            :         }
     491                 :            : 
     492   [ +  -  +  -  :         60 :         if (terse && (c->mask & SD_BUS_CREDS_UNIQUE_NAME || well_known))
                   -  + ]
     493                 :          0 :                 fputc('\n', f);
     494                 :            : 
     495                 :         60 :         dump_capabilities(c, f, "EffectiveCapabilities", terse, sd_bus_creds_has_effective_cap);
     496                 :         60 :         dump_capabilities(c, f, "PermittedCapabilities", terse, sd_bus_creds_has_permitted_cap);
     497                 :         60 :         dump_capabilities(c, f, "InheritableCapabilities", terse, sd_bus_creds_has_inheritable_cap);
     498                 :         60 :         dump_capabilities(c, f, "BoundingCapabilities", terse, sd_bus_creds_has_bounding_cap);
     499                 :            : 
     500                 :         60 :         return 0;
     501                 :            : }
     502                 :            : 
     503                 :            : /*
     504                 :            :  * For details about the file format, see:
     505                 :            :  *
     506                 :            :  * http://wiki.wireshark.org/Development/LibpcapFileFormat
     507                 :            :  */
     508                 :            : 
     509                 :            : typedef struct _packed_ pcap_hdr_s {
     510                 :            :         uint32_t magic_number;   /* magic number */
     511                 :            :         uint16_t version_major;  /* major version number */
     512                 :            :         uint16_t version_minor;  /* minor version number */
     513                 :            :         int32_t  thiszone;       /* GMT to local correction */
     514                 :            :         uint32_t sigfigs;        /* accuracy of timestamps */
     515                 :            :         uint32_t snaplen;        /* max length of captured packets, in octets */
     516                 :            :         uint32_t network;        /* data link type */
     517                 :            : } pcap_hdr_t ;
     518                 :            : 
     519                 :            : typedef struct  _packed_ pcaprec_hdr_s {
     520                 :            :         uint32_t ts_sec;         /* timestamp seconds */
     521                 :            :         uint32_t ts_usec;        /* timestamp microseconds */
     522                 :            :         uint32_t incl_len;       /* number of octets of packet saved in file */
     523                 :            :         uint32_t orig_len;       /* actual length of packet */
     524                 :            : } pcaprec_hdr_t;
     525                 :            : 
     526                 :          0 : int bus_pcap_header(size_t snaplen, FILE *f) {
     527                 :            : 
     528                 :          0 :         pcap_hdr_t hdr = {
     529                 :            :                 .magic_number = 0xa1b2c3d4U,
     530                 :            :                 .version_major = 2,
     531                 :            :                 .version_minor = 4,
     532                 :            :                 .thiszone = 0, /* UTC */
     533                 :            :                 .sigfigs = 0,
     534                 :            :                 .network = 231, /* D-Bus */
     535                 :            :         };
     536                 :            : 
     537         [ #  # ]:          0 :         if (!f)
     538                 :          0 :                 f = stdout;
     539                 :            : 
     540         [ #  # ]:          0 :         assert(snaplen > 0);
     541         [ #  # ]:          0 :         assert((size_t) (uint32_t) snaplen == snaplen);
     542                 :            : 
     543                 :          0 :         hdr.snaplen = (uint32_t) snaplen;
     544                 :            : 
     545                 :          0 :         fwrite(&hdr, 1, sizeof(hdr), f);
     546                 :            : 
     547                 :          0 :         return fflush_and_check(f);
     548                 :            : }
     549                 :            : 
     550                 :          0 : int bus_message_pcap_frame(sd_bus_message *m, size_t snaplen, FILE *f) {
     551                 :            :         struct bus_body_part *part;
     552                 :          0 :         pcaprec_hdr_t hdr = {};
     553                 :            :         struct timeval tv;
     554                 :            :         unsigned i;
     555                 :            :         size_t w;
     556                 :            : 
     557         [ #  # ]:          0 :         if (!f)
     558                 :          0 :                 f = stdout;
     559                 :            : 
     560         [ #  # ]:          0 :         assert(m);
     561         [ #  # ]:          0 :         assert(snaplen > 0);
     562         [ #  # ]:          0 :         assert((size_t) (uint32_t) snaplen == snaplen);
     563                 :            : 
     564         [ #  # ]:          0 :         if (m->realtime != 0)
     565                 :          0 :                 timeval_store(&tv, m->realtime);
     566                 :            :         else
     567         [ #  # ]:          0 :                 assert_se(gettimeofday(&tv, NULL) >= 0);
     568                 :            : 
     569                 :          0 :         hdr.ts_sec = tv.tv_sec;
     570                 :          0 :         hdr.ts_usec = tv.tv_usec;
     571                 :          0 :         hdr.orig_len = BUS_MESSAGE_SIZE(m);
     572                 :          0 :         hdr.incl_len = MIN(hdr.orig_len, snaplen);
     573                 :            : 
     574                 :            :         /* write the pcap header */
     575                 :          0 :         fwrite(&hdr, 1, sizeof(hdr), f);
     576                 :            : 
     577                 :            :         /* write the dbus header */
     578                 :          0 :         w = MIN(BUS_MESSAGE_BODY_BEGIN(m), snaplen);
     579                 :          0 :         fwrite(m->header, 1, w, f);
     580                 :          0 :         snaplen -= w;
     581                 :            : 
     582                 :            :         /* write the dbus body */
     583         [ #  # ]:          0 :         MESSAGE_FOREACH_PART(part, i, m) {
     584         [ #  # ]:          0 :                 if (snaplen <= 0)
     585                 :          0 :                         break;
     586                 :            : 
     587                 :          0 :                 w = MIN(part->size, snaplen);
     588                 :          0 :                 fwrite(part->data, 1, w, f);
     589                 :          0 :                 snaplen -= w;
     590                 :            :         }
     591                 :            : 
     592                 :          0 :         return fflush_and_check(f);
     593                 :            : }

Generated by: LCOV version 1.14