aboutsummaryrefslogtreecommitdiffstats
path: root/devel/rubygem-azure_cognitiveservices_localsearch
diff options
context:
space:
mode:
authorLexi Winter <ivy@FreeBSD.org>2025-09-30 01:22:12 +0100
committerLexi Winter <ivy@FreeBSD.org>2025-09-30 01:22:51 +0100
commitc19ed516b940bf82e28ad42a6966053b87a12664 (patch)
tree4746570282623b603992630108e662dad4905543 /devel/rubygem-azure_cognitiveservices_localsearch
parentb64b73fd938d5b2788547d16ed6a76493acc9142 (diff)
databases/prometheus-postgres-exporter: Update to 0.18.1lf/dev/postgres-exporter-0.18.1
Release notes: https://github.com/prometheus-community/postgres_exporter/releases/tag/v0.18.1
Diffstat (limited to 'devel/rubygem-azure_cognitiveservices_localsearch')
0 files changed, 0 insertions, 0 deletions
03' href='#n103'>103 104 105 106 107 108 109 110 111 112 113
#include "pthread.h"
#include <netdb.h>
#include <string.h>

static pthread_mutex_t getservby_mutex = PTHREAD_MUTEX_INITIALIZER;

static int
convert (struct servent *ret, struct servent *result,
       char *buf, int buflen)
{
  int len, i;

  if (!buf) return -1;

  *result = *ret;
  /* This is the size. */
  len = strlen (ret->s_name) + 1;
  if (len > buflen) return -1;
  buflen -= len;
  result->s_name = (char *) buf;
  buf += len;
  strcpy (result->s_name, ret->s_name);

  /* How many aliases and how big the buffer should be? There
     is always a NULL pointer. */
  for (len = sizeof (char *), i = 0; ret->s_aliases [i]; i++)
  {
    /* It should be size of (char *) and the length of string
       plus 1. */
    len += strlen (ret->s_aliases [i]) + 1 + sizeof (char *);
  }
  if (len > buflen) return -1;
  buflen -= len;

  /* This is an array of char * for s_aliases. */
  result->s_aliases = (char **) buf;
  buf += (i + 1) * sizeof (char *);

  /* We copy the aliases now. */
  for (i = 0; ret->s_aliases [i]; i++)
  {
    result->s_aliases [i] = (char *) buf;
    strcpy (result->s_aliases [i], ret->s_aliases [i]);
    buf += strlen (ret->s_aliases [i]) + 1;
  }
  /* This is the last one */
  result->s_aliases [i] = NULL;

  /* s_proto */
  len = strlen (ret->s_proto) + 1;
  if (len > buflen) return -1;
  buf += len;
  result->s_proto = (char *) buf;
  strcpy (result->s_proto, ret->s_proto);

  return 0;
}

struct servent *
getservbyport_r (int port, const char *proto,
       struct servent *result, char *buffer, int buflen)
{
  struct servent *ret;

  pthread_mutex_lock (&getservby_mutex);

  ret = getservbyport (port, proto);
  if (!ret ||
       convert (ret, result, buffer, buflen) != 0)
  {
    result = NULL;
  }

  pthread_mutex_unlock (&getservby_mutex);
  return result;
}

struct servent *
getservbyname_r (const char *name, const char *proto,
       struct servent *result, char *buffer, int buflen)
{
  struct servent *ret;

  pthread_mutex_lock (&getservby_mutex);

  ret = getservbyname (name, proto);
  if (!ret ||
       convert (ret, result, buffer, buflen) != 0)
  {
    result = NULL;
  }

  pthread_mutex_unlock (&getservby_mutex);
  return result;
}

struct servent *
getservent_r (struct servent *result, char *buffer, int buflen)
{
  struct servent *ret;

  pthread_mutex_lock (&getservby_mutex);

  ret = getservent ();
  if (!ret ||
       convert (ret, result, buffer, buflen) != 0)
  {
    result = NULL;
  }

  pthread_mutex_unlock (&getservby_mutex);
  return result;
}