Example #1
0
srvd_boolean_t srvd_service_nss_passwd_request_name_get(const srvd_service_request_t *request,
                                                        char **name) {
  srvd_protocol_packet_field_t *field = NULL;
  srvd_protocol_packet_field_entry_t *entry = NULL;

  SRVD_RETURN_FALSE_UNLESS(request);
  SRVD_RETURN_FALSE_UNLESS(request->packet.field_count > 0);

  SRVD_RETURN_FALSE_UNLESS(name);
  SRVD_RETURN_FALSE_UNLESS(*name == NULL);

  srvd_protocol_packet_field_get_first(&request->packet, &field);
  if(field->type != SRVD_SERVICE_NSS_PASSWD_REQUEST_NAME) {
    SRVD_LOG_ERROR("srvd_service_nss_passwd_request_name_get: Invalid packet type");
    return SRVD_FALSE;
  }

  SRVD_RETURN_FALSE_UNLESS(field->entry_count == 1);

  srvd_protocol_packet_field_entry_get_first(field, &entry);

  *name = malloc(entry->size);
  if(*name == NULL) {
    SRVD_LOG_ERROR("srvd_service_nss_passwd_request_name_get: Unable to allocate memory for name");
    return SRVD_FALSE;
  }

  strncpy(*name, entry->data, entry->size);
  (*name)[entry->size - 1] = '\0';

  return SRVD_TRUE;
}
Example #2
0
srvd_boolean_t srvd_service_nss_passwd_request_entities_get(const srvd_service_request_t *request,
                                                            int32_t *offset) {
  srvd_protocol_packet_field_t *field = NULL;
  srvd_protocol_packet_field_entry_t *entry = NULL;

  SRVD_RETURN_FALSE_UNLESS(request);
  SRVD_RETURN_FALSE_UNLESS(request->packet.field_count > 0);

  SRVD_RETURN_FALSE_UNLESS(offset);

  srvd_protocol_packet_field_get_first(&request->packet, &field);
  if(field->type != SRVD_SERVICE_NSS_PASSWD_REQUEST_ENTITIES) {
    SRVD_LOG_ERROR("srvd_service_nss_passwd_request_entites_get: Invalid packet type");
    return SRVD_FALSE;
  }

  SRVD_RETURN_FALSE_UNLESS(field->entry_count == 1);

  srvd_protocol_packet_field_entry_get_first(field, &entry);

  return srvd_protocol_packet_field_entry_get_uint32(entry, (uint32_t *)offset);
}
Example #3
0
static enum nss_status _srvd_nss_aliases_populate(const srvd_service_response_t *response,
                                                  struct aliasent *ae, char *buffer, size_t bufsize, int *ret_errno) {
  enum nss_status status = NSS_STATUS_SUCCESS;
  srvd_protocol_packet_field_t *field;
  SRVD_BUFFER(bi, buffer);

  /* Servers are not required to send the LOCAL field. */
  ae->alias_local = 0;

  SRVD_SERVICE_RESPONSE_FIELD_ITERATE(response, field) {
    srvd_protocol_packet_field_entry_t *entry = NULL;

    switch(field->type) {
    case SRVD_SERVICE_NSS_ALIASES_RESPONSE_NAME:
      if(!srvd_protocol_packet_field_entry_get_first(field, &entry)) {
        SRVD_NSS_FAIL(status, ret_errno, NSS_STATUS_TRYAGAIN, EINVAL,
                      _srvd_nss_aliases_populate_error);
      }

      if(!SRVD_BUFFER_CHECK_OFFSET(bi, buffer, bufsize, entry->size)) {
        SRVD_NSS_FAIL(status, ret_errno, NSS_STATUS_TRYAGAIN, ERANGE,
                      _srvd_nss_aliases_populate_error);
      }

      strncpy(SRVD_BUFFER_REF(bi), entry->data, entry->size);
      SRVD_BUFFER_REF(bi)[entry->size - 1] = '\0';
      ae->alias_name = SRVD_BUFFER_REF(bi);

      SRVD_BUFFER_ITERATOR_NEXT(bi, entry->size);
      break;

    case SRVD_SERVICE_NSS_ALIASES_RESPONSE_MEMBERS:
      ae->alias_members_len = field->entry_count;

      if(!SRVD_BUFFER_CHECK_OFFSET(bi, buffer, bufsize, ae->alias_members_len * sizeof(char *))) {
        SRVD_NSS_FAIL(status, ret_errno, NSS_STATUS_TRYAGAIN, ERANGE,
                      _srvd_nss_aliases_populate_error);
      }

      memset(SRVD_BUFFER_REF(bi), 0, ae->alias_members_len * sizeof(char *));
      ae->alias_members = (char **)SRVD_BUFFER_REF(bi);

      SRVD_BUFFER_ITERATOR_NEXT(bi, ae->alias_members_len * sizeof(char *));

      uint16_t entry_offset;
      SRVD_PROTOCOL_PACKET_FIELD_ENTRY_ITERATE_COUNT(field, entry, entry_offset) {
        if(!SRVD_BUFFER_CHECK_OFFSET(bi, buffer, bufsize, entry->size)) {
          SRVD_NSS_FAIL(status, ret_errno, NSS_STATUS_TRYAGAIN, ERANGE,
                        _srvd_nss_aliases_populate_error);
        }

        strncpy(SRVD_BUFFER_REF(bi), entry->data, entry->size);
        SRVD_BUFFER_REF(bi)[entry->size - 1] = '\0';
        ae->alias_members[entry_offset] = SRVD_BUFFER_REF(bi);

        SRVD_BUFFER_ITERATOR_NEXT(bi, entry->size);
      }
      break;

    case SRVD_SERVICE_NSS_ALIASES_RESPONSE_LOCAL:
      if(!srvd_protocol_packet_field_entry_get_first(field, &entry)) {
        SRVD_NSS_FAIL(status, ret_errno, NSS_STATUS_TRYAGAIN, EINVAL,
                      _srvd_nss_aliases_populate_error);
      }

      srvd_protocol_packet_field_entry_get_uint8(entry, (uint8_t *)&ae->alias_local);
      break;

    default:
      break;
    }
  }