LCOV - code coverage report
Current view: top level - timesync - timesyncd-server.c (source / functions) Hit Total Coverage
Test: systemd_full.info Lines: 38 76 50.0 %
Date: 2019-08-23 13:36:53 Functions: 3 5 60.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 50 142 35.2 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: LGPL-2.1+ */
       2                 :            : 
       3                 :            : #include "alloc-util.h"
       4                 :            : #include "timesyncd-server.h"
       5                 :            : 
       6                 :          0 : int server_address_new(
       7                 :            :                 ServerName *n,
       8                 :            :                 ServerAddress **ret,
       9                 :            :                 const union sockaddr_union *sockaddr,
      10                 :            :                 socklen_t socklen) {
      11                 :            : 
      12                 :            :         ServerAddress *a, *tail;
      13                 :            : 
      14         [ #  # ]:          0 :         assert(n);
      15         [ #  # ]:          0 :         assert(sockaddr);
      16         [ #  # ]:          0 :         assert(socklen >= offsetof(struct sockaddr, sa_data));
      17         [ #  # ]:          0 :         assert(socklen <= sizeof(union sockaddr_union));
      18                 :            : 
      19                 :          0 :         a = new0(ServerAddress, 1);
      20         [ #  # ]:          0 :         if (!a)
      21                 :          0 :                 return -ENOMEM;
      22                 :            : 
      23                 :          0 :         memcpy(&a->sockaddr, sockaddr, socklen);
      24                 :          0 :         a->socklen = socklen;
      25                 :            : 
      26   [ #  #  #  # ]:          0 :         LIST_FIND_TAIL(addresses, n->addresses, tail);
      27   [ #  #  #  #  :          0 :         LIST_INSERT_AFTER(addresses, n->addresses, tail, a);
             #  #  #  # ]
      28                 :          0 :         a->name = n;
      29                 :            : 
      30         [ #  # ]:          0 :         if (ret)
      31                 :          0 :                 *ret = a;
      32                 :            : 
      33                 :          0 :         return 0;
      34                 :            : }
      35                 :            : 
      36                 :          0 : ServerAddress* server_address_free(ServerAddress *a) {
      37         [ #  # ]:          0 :         if (!a)
      38                 :          0 :                 return NULL;
      39                 :            : 
      40         [ #  # ]:          0 :         if (a->name) {
      41   [ #  #  #  #  :          0 :                 LIST_REMOVE(addresses, a->name->addresses, a);
             #  #  #  # ]
      42                 :            : 
      43   [ #  #  #  # ]:          0 :                 if (a->name->manager && a->name->manager->current_server_address == a)
      44                 :          0 :                         manager_set_server_address(a->name->manager, NULL);
      45                 :            :         }
      46                 :            : 
      47                 :          0 :         return mfree(a);
      48                 :            : }
      49                 :            : 
      50                 :         32 : int server_name_new(
      51                 :            :                 Manager *m,
      52                 :            :                 ServerName **ret,
      53                 :            :                 ServerType type,
      54                 :            :                 const char *string) {
      55                 :            : 
      56                 :            :         ServerName *n, *tail;
      57                 :            : 
      58         [ -  + ]:         32 :         assert(m);
      59         [ -  + ]:         32 :         assert(string);
      60                 :            : 
      61                 :         32 :         n = new0(ServerName, 1);
      62         [ -  + ]:         32 :         if (!n)
      63                 :          0 :                 return -ENOMEM;
      64                 :            : 
      65                 :         32 :         n->type = type;
      66                 :         32 :         n->string = strdup(string);
      67         [ -  + ]:         32 :         if (!n->string) {
      68                 :          0 :                 free(n);
      69                 :          0 :                 return -ENOMEM;
      70                 :            :         }
      71                 :            : 
      72         [ +  + ]:         32 :         if (type == SERVER_SYSTEM) {
      73   [ +  +  -  + ]:          8 :                 LIST_FIND_TAIL(names, m->system_servers, tail);
      74   [ -  +  +  +  :          8 :                 LIST_INSERT_AFTER(names, m->system_servers, tail, n);
             -  +  -  + ]
      75         [ -  + ]:         24 :         } else if (type == SERVER_LINK) {
      76   [ #  #  #  # ]:          0 :                 LIST_FIND_TAIL(names, m->link_servers, tail);
      77   [ #  #  #  #  :          0 :                 LIST_INSERT_AFTER(names, m->link_servers, tail, n);
             #  #  #  # ]
      78         [ +  - ]:         24 :         } else if (type == SERVER_FALLBACK) {
      79   [ +  +  +  + ]:         64 :                 LIST_FIND_TAIL(names, m->fallback_servers, tail);
      80   [ -  +  +  +  :         24 :                 LIST_INSERT_AFTER(names, m->fallback_servers, tail, n);
             -  +  -  + ]
      81                 :            :         } else
      82                 :          0 :                 assert_not_reached("Unknown server type");
      83                 :            : 
      84                 :         32 :         n->manager = m;
      85                 :            : 
      86         [ +  + ]:         32 :         if (type != SERVER_FALLBACK &&
      87         [ -  + ]:          8 :             m->current_server_name &&
      88         [ #  # ]:          0 :             m->current_server_name->type == SERVER_FALLBACK)
      89                 :          0 :                 manager_set_server_name(m, NULL);
      90                 :            : 
      91         [ +  - ]:         32 :         log_debug("Added new server %s.", string);
      92                 :            : 
      93         [ -  + ]:         32 :         if (ret)
      94                 :          0 :                 *ret = n;
      95                 :            : 
      96                 :         32 :         return 0;
      97                 :            : }
      98                 :            : 
      99                 :         32 : ServerName *server_name_free(ServerName *n) {
     100         [ -  + ]:         32 :         if (!n)
     101                 :          0 :                 return NULL;
     102                 :            : 
     103                 :         32 :         server_name_flush_addresses(n);
     104                 :            : 
     105         [ +  - ]:         32 :         if (n->manager) {
     106         [ +  + ]:         32 :                 if (n->type == SERVER_SYSTEM)
     107   [ -  +  +  +  :          8 :                         LIST_REMOVE(names, n->manager->system_servers, n);
             -  +  -  + ]
     108         [ -  + ]:         24 :                 else if (n->type == SERVER_LINK)
     109   [ #  #  #  #  :          0 :                         LIST_REMOVE(names, n->manager->link_servers, n);
             #  #  #  # ]
     110         [ +  - ]:         24 :                 else if (n->type == SERVER_FALLBACK)
     111   [ -  +  +  +  :         24 :                         LIST_REMOVE(names, n->manager->fallback_servers, n);
             -  +  -  + ]
     112                 :            :                 else
     113                 :          0 :                         assert_not_reached("Unknown server type");
     114                 :            : 
     115         [ -  + ]:         32 :                 if (n->manager->current_server_name == n)
     116                 :          0 :                         manager_set_server_name(n->manager, NULL);
     117                 :            :         }
     118                 :            : 
     119         [ +  - ]:         32 :         log_debug("Removed server %s.", n->string);
     120                 :            : 
     121                 :         32 :         free(n->string);
     122                 :         32 :         return mfree(n);
     123                 :            : }
     124                 :            : 
     125                 :         32 : void server_name_flush_addresses(ServerName *n) {
     126         [ -  + ]:         32 :         assert(n);
     127                 :            : 
     128         [ -  + ]:         32 :         while (n->addresses)
     129                 :          0 :                 server_address_free(n->addresses);
     130                 :         32 : }

Generated by: LCOV version 1.14