errno_t get_serv_byport(struct proxy_id_ctx *ctx, struct sysdb_ctx *sysdb, struct sss_domain_info *dom, const char *be_filter, const char *protocol) { errno_t ret; enum nss_status status; struct servent *result; TALLOC_CTX *tmp_ctx; uint16_t port; char buffer[BUFLEN]; tmp_ctx = talloc_new(NULL); if (!tmp_ctx) return ENOMEM; result = talloc_zero(tmp_ctx, struct servent); if (!result) { ret = ENOMEM; goto done; } errno = 0; port = htons(strtouint16(be_filter, NULL, 0)); if (errno) { ret = errno; goto done; } status = ctx->ops.getservbyport_r(port, protocol, result, buffer, BUFLEN, &ret); if (status != NSS_STATUS_SUCCESS && status != NSS_STATUS_NOTFOUND) { DEBUG(SSSDBG_MINOR_FAILURE, ("getservbyport_r failed for service [%s].\n", be_filter)); return ret; } if (status == NSS_STATUS_NOTFOUND) { /* Make sure we remove it from the cache */ ret = sysdb_svc_delete(sysdb, NULL, port, protocol); } else { /* Results found. Save them into the cache */ ret = proxy_save_service(sysdb, result, !dom->case_sensitive, dom->service_timeout); } done: talloc_free(tmp_ctx); return ret; }
END_TEST START_TEST (test_strtouint16_pos_integer_uintmax_base_10) { uint32_t result; const char *input = "65535"; uint32_t expected = UINT16_MAX; char *endptr; errno_t error; result = strtouint16(input, &endptr, 10); error = errno; EXPECT_UNSET_ERRNO(error); CHECK_ZERO_ENDPTR(endptr); CHECK_RESULT(expected, result); }
END_TEST START_TEST (test_strtouint16_neg_integer_base_10) { uint32_t result; const char *input = "-123"; uint32_t expected = UINT16_MAX; char *endptr; errno_t error; result = strtouint16(input, &endptr, 10); error = errno; CHECK_ERRNO(ERANGE, error); CHECK_ZERO_ENDPTR(endptr); CHECK_RESULT(expected, result); }
END_TEST START_TEST (test_strtouint16_emptystring_base_10) { uint32_t result; const char *input = ""; uint32_t expected = 0; char *endptr; const char *expected_endptr = input; errno_t error; result = strtouint16(input, &endptr, 10); error = errno; EXPECT_UNSET_ERRNO(error); CHECK_ENDPTR(expected_endptr, endptr); CHECK_RESULT(expected, result); }
END_TEST START_TEST (test_strtouint16_mixed_alphanumeric_base_10) { uint32_t result; const char *input = "12b13"; uint32_t expected = 12; char *endptr; const char *expected_endptr = input+2; errno_t error; result = strtouint16(input, &endptr, 10); error = errno; EXPECT_UNSET_ERRNO(error); CHECK_ENDPTR(expected_endptr, endptr); CHECK_RESULT(expected, result); }
END_TEST /* Base-10 */ START_TEST (test_strtouint16_pos_integer_base_10) { uint16_t result; const char *input = "123"; uint16_t expected = 123; char *endptr; errno_t error; result = strtouint16(input, &endptr, 10); error = errno; EXPECT_UNSET_ERRNO(error); CHECK_ZERO_ENDPTR(endptr); CHECK_RESULT(expected, result); }