aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs6rc/s6rc_service_resolve.c
blob: 0bdf6706221b3215ebb80aa55ddbf405c7fff606 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/* ISC license. */

#include <string.h>

#include <skalibs/uint32.h>
#include <skalibs/bytestr.h>
#include <skalibs/cdb.h>

#include <s6-rc/db.h>

int s6rc_service_resolve (s6rc_db_t const *db, char const *s, uint32_t *id, char const **param)
{
  size_t len = strlen(s) ;
  char const *p = 0 ;
  cdb_data data ;
  int r = cdb_find(c, &data, s, len) ;
  if (r < 0) return r ;
  else if (!r)
  {
    size_t at = byte_chr(s, len, '@') ;
    if (at == len) return 0 ;
    if (at == len - 1) return -1 ;
    r = cdb_find(c, &data, s, at + 1) ;
    if (r <= 0) return r ;
    p = s + at + 1 ;
  }
  if (data.len != 4) return -1 ;
  uint32_unpack_big(data.s, id) ;
  *param = p ;
  return 1 ;
}