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; }
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); }
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; } }