Пример #1
0
/* write a single network entry to the stream */
static int write_network(TFILE *fp,MYLDAP_ENTRY *entry)
{
  int32_t tmpint32,tmp2int32,tmp3int32;
  int numaddr,i;
  const char *networkname;
  const char **networknames;
  const char **addresses;
  /* get the most canonical name */
  networkname=myldap_get_rdn_value(entry,attmap_network_cn);
  /* get the other names for the network */
  networknames=myldap_get_values(entry,attmap_network_cn);
  if ((networknames==NULL)||(networknames[0]==NULL))
  {
    log_log(LOG_WARNING,"network entry %s does not contain %s value",
                        myldap_get_dn(entry),attmap_network_cn);
    return 0;
  }
  /* if the networkname is not yet found, get the first entry from networknames */
  if (networkname==NULL)
    networkname=networknames[0];
  /* get the addresses */
  addresses=myldap_get_values(entry,attmap_network_ipNetworkNumber);
  if ((addresses==NULL)||(addresses[0]==NULL))
  {
    log_log(LOG_WARNING,"network entry %s does not contain %s value",
                        myldap_get_dn(entry),attmap_network_ipNetworkNumber);
    return 0;
  }
  /* write the entry */
  WRITE_INT32(fp,NSLCD_RESULT_BEGIN);
  WRITE_STRING(fp,networkname);
  WRITE_STRINGLIST_EXCEPT(fp,networknames,networkname);
  for (numaddr=0;addresses[numaddr]!=NULL;numaddr++)
    /*noting*/ ;
  WRITE_INT32(fp,numaddr);
  for (i=0;i<numaddr;i++)
  {
    WRITE_ADDRESS(fp,addresses[i]);
  }
  return 0;
}
Пример #2
0
static int write_protocol(TFILE *fp, MYLDAP_ENTRY *entry, const char *reqname)
{
  int32_t tmpint32, tmp2int32, tmp3int32;
  const char *name;
  const char **aliases;
  const char **protos;
  char *tmp;
  long proto;
  int i;
  /* get the most canonical name */
  name = myldap_get_rdn_value(entry, attmap_protocol_cn);
  /* get the other names for the protocol */
  aliases = myldap_get_values(entry, attmap_protocol_cn);
  if ((aliases == NULL) || (aliases[0] == NULL))
  {
    log_log(LOG_WARNING, "%s: %s: missing",
            myldap_get_dn(entry), attmap_protocol_cn);
    return 0;
  }
  /* if the protocol name is not yet found, get the first entry */
  if (name == NULL)
    name = aliases[0];
  /* check case of returned protocol entry */
  if ((reqname != NULL) && (STR_CMP(reqname, name) != 0))
  {
    for (i = 0; (aliases[i] != NULL) && (STR_CMP(reqname, aliases[i]) != 0); i++)
      /* nothing */ ;
    if (aliases[i] == NULL)
      return 0; /* neither the name nor any of the aliases matched */
  }
  /* get the protocol number */
  protos = myldap_get_values(entry, attmap_protocol_ipProtocolNumber);
  if ((protos == NULL) || (protos[0] == NULL))
  {
    log_log(LOG_WARNING, "%s: %s: missing",
            myldap_get_dn(entry), attmap_protocol_ipProtocolNumber);
    return 0;
  }
  else if (protos[1] != NULL)
  {
    log_log(LOG_WARNING, "%s: %s: multiple values",
            myldap_get_dn(entry), attmap_protocol_ipProtocolNumber);
  }
  errno = 0;
  proto = strtol(protos[0], &tmp, 10);
  if ((*(protos[0]) == '\0') || (*tmp != '\0'))
  {
    log_log(LOG_WARNING, "%s: %s: non-numeric",
            myldap_get_dn(entry), attmap_protocol_ipProtocolNumber);
    return 0;
  }
  else if ((errno != 0) || (proto < 0) || (proto > (long)UINT8_MAX))
  {
    log_log(LOG_WARNING, "%s: %s: out of range",
            myldap_get_dn(entry), attmap_protocol_ipProtocolNumber);
    return 0;
  }
  /* write entry */
  WRITE_INT32(fp, NSLCD_RESULT_BEGIN);
  WRITE_STRING(fp, name);
  WRITE_STRINGLIST_EXCEPT(fp, aliases, name);
  /* proto number is actually an 8-bit value but we write 32 bits anyway */
  WRITE_INT32(fp, proto);
  return 0;
}
Пример #3
0
/* write a single rpc entry to the stream */
static int write_rpc(TFILE *fp, MYLDAP_ENTRY *entry, const char *reqname)
{
  int32_t tmpint32, tmp2int32, tmp3int32;
  const char *name;
  const char **aliases;
  const char **numbers;
  char *tmp;
  unsigned long number;
  int i;
  /* get the most canonical name */
  name = myldap_get_rdn_value(entry, attmap_rpc_cn);
  /* get the other names for the rpc entries */
  aliases = myldap_get_values(entry, attmap_rpc_cn);
  if ((aliases == NULL) || (aliases[0] == NULL))
  {
    log_log(LOG_WARNING, "%s: %s: missing",
            myldap_get_dn(entry), attmap_rpc_cn);
    return 0;
  }
  /* if the rpc name is not yet found, get the first entry */
  if (name == NULL)
    name = aliases[0];
  /* check case of returned rpc entry */
  if ((reqname != NULL) && (STR_CMP(reqname, name) != 0))
  {
    for (i = 0; (aliases[i] != NULL) && (STR_CMP(reqname, aliases[i]) != 0); i++)
      /* nothing */ ;
    if (aliases[i] == NULL)
      return 0; /* neither the name nor any of the aliases matched */
  }
  /* get the rpc number */
  numbers = myldap_get_values(entry, attmap_rpc_oncRpcNumber);
  if ((numbers == NULL) || (numbers[0] == NULL))
  {
    log_log(LOG_WARNING, "%s: %s: missing",
            myldap_get_dn(entry), attmap_rpc_oncRpcNumber);
    return 0;
  }
  else if (numbers[1] != NULL)
  {
    log_log(LOG_WARNING, "%s: %s: multiple values",
            myldap_get_dn(entry), attmap_rpc_oncRpcNumber);
  }
  errno = 0;
  number = strtol(numbers[0], &tmp, 10);
  if ((*(numbers[0]) == '\0') || (*tmp != '\0'))
  {
    log_log(LOG_WARNING, "%s: %s: non-numeric",
            myldap_get_dn(entry), attmap_rpc_oncRpcNumber);
    return 0;
  }
  else if ((errno != 0) || (number > UINT32_MAX))
  {
    log_log(LOG_WARNING, "%s: %s: out of range",
            myldap_get_dn(entry), attmap_rpc_oncRpcNumber);
    return 0;
  }
  /* write the entry */
  WRITE_INT32(fp, NSLCD_RESULT_BEGIN);
  WRITE_STRING(fp, name);
  WRITE_STRINGLIST_EXCEPT(fp, aliases, name);
  WRITE_INT32(fp, number);
  return 0;
}