nss_services.c revision cff6bb5f8ee424b0e3aff74247e103e44075b16a
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/*
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen SSSD
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen Authors:
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen Stephen Gallagher <sgallagh@redhat.com>
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen Copyright (C) 2012 Red Hat
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen This program is free software; you can redistribute it and/or modify
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen it under the terms of the GNU General Public License as published by
463e82bdf0e990f4f2252d2b53ea23a5abe5883cTimo Sirainen the Free Software Foundation; either version 3 of the License, or
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen (at your option) any later version.
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen This program is distributed in the hope that it will be useful,
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen GNU General Public License for more details.
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen
2c677e9d339bc91d5b54376ba2986f71476c06abTimo Sirainen You should have received a copy of the GNU General Public License
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen*/
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen#include <nss.h>
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen#include <netdb.h>
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen#include <errno.h>
20c892309312df8f4f73cfcaf8acd2ededda8b05Timo Sirainen#include <sys/types.h>
20c892309312df8f4f73cfcaf8acd2ededda8b05Timo Sirainen#include <unistd.h>
20c892309312df8f4f73cfcaf8acd2ededda8b05Timo Sirainen#include <stdlib.h>
20c892309312df8f4f73cfcaf8acd2ededda8b05Timo Sirainen#include <stdint.h>
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen#include <stdio.h>
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen#include <string.h>
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen#include "sss_cli.h"
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainenstatic struct sss_nss_getservent_data {
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen size_t len;
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen size_t ptr;
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen uint8_t *data;
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen} sss_nss_getservent_data;
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainenstatic void sss_nss_getservent_data_clean(void) {
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen if (sss_nss_getservent_data.data != NULL) {
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen free(sss_nss_getservent_data.data);
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen sss_nss_getservent_data.data = NULL;
c21c33a8c98972c45349066fc76ac9e2c05013c1Timo Sirainen }
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen sss_nss_getservent_data.len = 0;
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen sss_nss_getservent_data.ptr = 0;
7bd3f5614e0dd2324dd1015f084de72c0b069a1aTimo Sirainen}
7bd3f5614e0dd2324dd1015f084de72c0b069a1aTimo Sirainen
7bd3f5614e0dd2324dd1015f084de72c0b069a1aTimo Sirainen/* GETSERVBYNAME Request
7bd3f5614e0dd2324dd1015f084de72c0b069a1aTimo Sirainen *
2c677e9d339bc91d5b54376ba2986f71476c06abTimo Sirainen * 0-X: Sequence of two, zero-terminated strings (name, protocol).
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen * Protocol may be zero-length to imply "any"
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen *
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen * GETSERVBYPORT Request:
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen * 0-3: 16-bit port number in network byte order
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen * 4-7: Reserved/padding
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen * 8-X: Zero-terminated string (protocol)
e6d7d19c328e7043ad35d5a52c1617bde915a16fTimo Sirainen * Protocol may be zero-length to imply "any"
d7095f3a4466fbb78b2d5eb3d322bc15a5b0ab1fTimo Sirainen *
153de7823e64c67678b3fc95719c41a8ec5b864dTimo Sirainen * Replies:
153de7823e64c67678b3fc95719c41a8ec5b864dTimo Sirainen * 0-3: 32-bit unsigned number of results
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen * 4-7: 32-bit unsigned (reserved/padding)
b0be0bead3d6963149f7f2a9504b8ab5aced9af5Timo Sirainen * 7-X: Result data (blocks equal to number of results)
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen *
e6d7d19c328e7043ad35d5a52c1617bde915a16fTimo Sirainen * Result data:
8d131435ba4648c8821160ec38d508c97177c715Timo Sirainen * 0-3: 32-bit unsigned port number in network byte order
9315dd69233d554452df0c12bc57002d2042a8f4Timo Sirainen * 4-7: 32-bit unsigned number of aliases
7de1c472fd23ddac6b4dc5cbeee6fa6a8418b071Timo Sirainen * 8-X: sequence of zero-terminated strings
7de1c472fd23ddac6b4dc5cbeee6fa6a8418b071Timo Sirainen * (name, protocol, zero or more aliases)
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen */
538c58fc95200fcc5e91abdda8b912b574a2f968Timo Sirainenstruct sss_nss_svc_rep {
b99f3f908d51f4d1f7628bdf2cc6100cd8587656Timo Sirainen struct servent *result;
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen char *buffer;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen size_t buflen;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen};
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen#define SVC_METADATA_COUNT 8
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenstatic errno_t
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainensss_nss_getsvc_readrep(struct sss_nss_svc_rep *sr,
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen uint8_t *buf, size_t *len)
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen{
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen errno_t ret;
7de1c472fd23ddac6b4dc5cbeee6fa6a8418b071Timo Sirainen uint32_t c;
b99f3f908d51f4d1f7628bdf2cc6100cd8587656Timo Sirainen uint32_t num_aliases;
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen size_t i, l, slen, dlen, pad, ptaliases, alen;
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen char *sbuf;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen /* Buffer must contain two 32-bit integers,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen * at least one character and null-terminator
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen * for the name, and at least a null-
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen * terminator for the protocol.
7de1c472fd23ddac6b4dc5cbeee6fa6a8418b071Timo Sirainen */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen if (*len < 11) {
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen /* not enough space for data, bad packet */
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen return EBADMSG;
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen }
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen /* Get the port */
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen SAFEALIGN_COPY_UINT32(&c, buf, NULL);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen sr->result->s_port = (uint16_t)c;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Get the number of aliases */
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen SAFEALIGN_COPY_UINT32(&num_aliases, buf + sizeof(uint32_t), NULL);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen sbuf = (char *)&buf[2 * sizeof(uint32_t)];
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen slen = *len - (2 * sizeof(uint32_t));
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen dlen = sr->buflen;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen /* Copy in the name */
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen i = 0;
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen sr->result->s_name = &(sr->buffer[i]);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen ret = sss_readrep_copy_string(sbuf, &i,
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen &slen, &dlen,
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen &sr->result->s_name,
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen NULL);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen if (ret != EOK) return ret;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Copy in the protocol */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen sr->result->s_proto = &(sr->buffer[i]);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen ret = sss_readrep_copy_string(sbuf, &i,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen &slen, &dlen,
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen &sr->result->s_proto,
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen NULL);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen if (ret != EOK) return ret;
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen /* Make sure sr->buffer[i+pad] is 32-bit aligned */
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen pad = 0;
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen while((i + pad) % 4) {
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen pad++;
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen }
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen /* Copy in the aliases */
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen sr->result->s_aliases = (char **) &(sr->buffer[i+pad]);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen ptaliases = (sizeof(char *) * (num_aliases + 1)) + pad;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (ptaliases > dlen) {
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen return ERANGE; /* not ENOMEM, ERANGE is what glibc looks for */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen dlen -= ptaliases;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen ptaliases += i;
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen sr->result->s_aliases[num_aliases] = NULL; /* terminate array */
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen for (l = 0; l < num_aliases; l++) {
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen sr->result->s_aliases[l] = &(sr->buffer[ptaliases]);
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen ret = sss_readrep_copy_string(sbuf, &i,
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen &slen, &dlen,
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen &sr->result->s_aliases[l],
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen &alen);
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen if (ret != EOK) return ret;
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen ptaliases += alen + 1;
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen }
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen *len = slen - i;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen return EOK;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen}
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainenenum nss_status
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen_nss_sss_getservbyname_r(const char *name,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen const char *protocol,
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen struct servent *result,
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen char *buffer, size_t buflen,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen int *errnop)
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen{
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen struct sss_cli_req_data rd;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen struct sss_nss_svc_rep svcrep;
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen size_t name_len;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen size_t proto_len = 0;
23079bf0a6e7489c5f542b0b897a71bdfd884a51Timo Sirainen uint8_t *repbuf;
23079bf0a6e7489c5f542b0b897a71bdfd884a51Timo Sirainen uint8_t *data;
23079bf0a6e7489c5f542b0b897a71bdfd884a51Timo Sirainen size_t replen, len;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen enum nss_status nret;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen int ret;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen /* Caught once glibc passing in buffer == 0x0 */
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen if (!buffer || !buflen) return ERANGE;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen ret = sss_strnlen(name, SSS_NAME_MAX, &name_len);
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen if (ret != 0) {
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen *errnop = EINVAL;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen return NSS_STATUS_NOTFOUND;
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen if (protocol) {
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen ret = sss_strnlen(protocol, SSS_NAME_MAX, &proto_len);
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen if (ret != 0) {
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen *errnop = EINVAL;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen return NSS_STATUS_NOTFOUND;
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen }
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen }
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen rd.len = name_len + proto_len + 2;
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen data = malloc(sizeof(uint8_t)*rd.len);
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen if (data == NULL) {
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen nret = NSS_STATUS_TRYAGAIN;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen goto out;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen memcpy(data, name, name_len + 1);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (protocol) {
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen memcpy(data + name_len + 1, protocol, proto_len + 1);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } else {
68b3667c9ee95951d7c3e03b19b2d37abbaa5736Timo Sirainen /* No protocol specified, pass empty string */
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen data[name_len + 1] = '\0';
9315dd69233d554452df0c12bc57002d2042a8f4Timo Sirainen }
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen rd.data = data;
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen sss_nss_lock();
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
7889c9f65e23c83fc31cecf304cab4ab070d6aa1Timo Sirainen nret = sss_nss_make_request(SSS_NSS_GETSERVBYNAME, &rd,
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen &repbuf, &replen, errnop);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen free(data);
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen if (nret != NSS_STATUS_SUCCESS) {
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen goto out;
e20e638805c4bd54e039891a3e92760b1dfa189aTimo Sirainen }
68b3667c9ee95951d7c3e03b19b2d37abbaa5736Timo Sirainen
68b3667c9ee95951d7c3e03b19b2d37abbaa5736Timo Sirainen svcrep.result = result;
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen svcrep.buffer = buffer;
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen svcrep.buflen = buflen;
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen /* no results if not found */
68b3667c9ee95951d7c3e03b19b2d37abbaa5736Timo Sirainen if (((uint32_t *)repbuf)[0] == 0) {
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen free(repbuf);
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen nret = NSS_STATUS_NOTFOUND;
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen goto out;
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen }
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen /* only 1 result is accepted for this function */
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen if (((uint32_t *)repbuf)[0] != 1) {
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen *errnop = EBADMSG;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen free(repbuf);
8bb360f9e5de1c25e4f875205bb06e8bf15dae14Timo Sirainen nret = NSS_STATUS_TRYAGAIN;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen goto out;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen }
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen len = replen - SVC_METADATA_COUNT;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen ret = sss_nss_getsvc_readrep(&svcrep,
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen repbuf + SVC_METADATA_COUNT,
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen &len);
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen free(repbuf);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen if (ret) {
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen *errnop = ret;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen nret = NSS_STATUS_TRYAGAIN;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen goto out;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen }
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen nret = NSS_STATUS_SUCCESS;
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenout:
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen sss_nss_unlock();
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen return nret;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen}
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenenum nss_status
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen_nss_sss_getservbyport_r(int port, const char *protocol,
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen struct servent *result,
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen char *buffer, size_t buflen,
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen int *errnop)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen struct sss_cli_req_data rd;
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen struct sss_nss_svc_rep svcrep;
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen size_t proto_len = 0;
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen uint8_t *repbuf;
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen uint8_t *data;
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen size_t replen, len;
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen enum nss_status nret;
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen int ret;
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen /* Caught once glibc passing in buffer == 0x0 */
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen if (!buffer || !buflen) return ERANGE;
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen if (protocol) {
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen ret = sss_strnlen(protocol, SSS_NAME_MAX, &proto_len);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen if (ret != 0) {
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen *errnop = EINVAL;
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen return NSS_STATUS_NOTFOUND;
1e2887ae909d9817cc43a7e40ecb50508419f7edTimo Sirainen }
1e2887ae909d9817cc43a7e40ecb50508419f7edTimo Sirainen }
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen rd.len = sizeof(uint32_t)*2 + proto_len + 1;
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen data = malloc(sizeof(char)*rd.len);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen if (data == NULL) {
1e2887ae909d9817cc43a7e40ecb50508419f7edTimo Sirainen nret = NSS_STATUS_TRYAGAIN;
1e2887ae909d9817cc43a7e40ecb50508419f7edTimo Sirainen goto out;
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen }
1e2887ae909d9817cc43a7e40ecb50508419f7edTimo Sirainen
1e2887ae909d9817cc43a7e40ecb50508419f7edTimo Sirainen SAFEALIGN_SET_UINT32(data, port, NULL);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen /* Padding */
1e2887ae909d9817cc43a7e40ecb50508419f7edTimo Sirainen memset(data + sizeof(uint32_t), 0, 4);
1e2887ae909d9817cc43a7e40ecb50508419f7edTimo Sirainen
1e2887ae909d9817cc43a7e40ecb50508419f7edTimo Sirainen if (protocol) {
1e2887ae909d9817cc43a7e40ecb50508419f7edTimo Sirainen memcpy(data + sizeof(uint32_t)*2, protocol, proto_len + 1);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen } else {
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen /* No protocol specified, pass empty string */
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen data[sizeof(uint32_t)*2] = '\0';
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen }
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen rd.data = data;
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen sss_nss_lock();
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen nret = sss_nss_make_request(SSS_NSS_GETSERVBYPORT, &rd,
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen &repbuf, &replen, errnop);
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen free(data);
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen if (nret != NSS_STATUS_SUCCESS) {
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen goto out;
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen }
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen svcrep.result = result;
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen svcrep.buffer = buffer;
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen svcrep.buflen = buflen;
4b89231f4ec9cc69f4aea715e1d34f405c7e317dTimo Sirainen
4b89231f4ec9cc69f4aea715e1d34f405c7e317dTimo Sirainen /* no results if not found */
4b89231f4ec9cc69f4aea715e1d34f405c7e317dTimo Sirainen if (((uint32_t *)repbuf)[0] == 0) {
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen free(repbuf);
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen nret = NSS_STATUS_NOTFOUND;
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen goto out;
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen }
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen /* only 1 result is accepted for this function */
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen if (((uint32_t *)repbuf)[0] != 1) {
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen *errnop = EBADMSG;
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen free(repbuf);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen nret = NSS_STATUS_TRYAGAIN;
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen goto out;
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen }
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen len = replen - SVC_METADATA_COUNT;
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen ret = sss_nss_getsvc_readrep(&svcrep,
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen repbuf + SVC_METADATA_COUNT,
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen &len);
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen free(repbuf);
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen if (ret) {
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen *errnop = ret;
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen nret = NSS_STATUS_TRYAGAIN;
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen goto out;
cd5ee8630497fdbd853ef588a858b4ef619a5e03Timo Sirainen }
cd5ee8630497fdbd853ef588a858b4ef619a5e03Timo Sirainen
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen nret = NSS_STATUS_SUCCESS;
7394389230750c45b105cdefb5850c81cae8cdc0Timo Sirainen
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainenout:
1032e5427bf10566098f3b3bb9110e2bc1227e85Timo Sirainen sss_nss_unlock();
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen return nret;
7e94cf9d70ce9fdeccb7a85ff400b899e6386f36Timo Sirainen}
7e94cf9d70ce9fdeccb7a85ff400b899e6386f36Timo Sirainen
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen
9887c39c5ba429169389153ca99de49e084a73f0Timo Sirainenenum nss_status
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen_nss_sss_setservent(void)
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen{
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen enum nss_status nret;
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen int errnop;
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen sss_nss_lock();
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen /* make sure we do not have leftovers, and release memory */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen sss_nss_getservent_data_clean();
b99f3f908d51f4d1f7628bdf2cc6100cd8587656Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen nret = sss_nss_make_request(SSS_NSS_SETSERVENT,
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen NULL, NULL, NULL, &errnop);
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen if (nret != NSS_STATUS_SUCCESS) {
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen errno = errnop;
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen }
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen
1032e5427bf10566098f3b3bb9110e2bc1227e85Timo Sirainen sss_nss_unlock();
1032e5427bf10566098f3b3bb9110e2bc1227e85Timo Sirainen return nret;
1032e5427bf10566098f3b3bb9110e2bc1227e85Timo Sirainen}
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainenstatic enum nss_status internal_getservent_r(struct servent *result,
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen char *buffer, size_t buflen,
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen int *errnop);
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainenenum nss_status
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen_nss_sss_getservent_r(struct servent *result,
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen char *buffer, size_t buflen,
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen int *errnop)
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen{
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen enum nss_status nret;
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen sss_nss_lock();
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen nret = internal_getservent_r(result, buffer, buflen, errnop);
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen sss_nss_unlock();
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen return nret;
41bb0aa8e357876bc9a1916a37c9e3e78e5f8185Timo Sirainen}
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainenstatic enum nss_status internal_getservent_r(struct servent *result,
dd8de60250511cc729b67249e61dfc6b4debff11Timo Sirainen char *buffer, size_t buflen,
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen int *errnop)
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen{
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen struct sss_cli_req_data rd;
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen struct sss_nss_svc_rep pwrep;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint8_t *repbuf;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen size_t replen;
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen enum nss_status nret;
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen uint32_t num_entries;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int ret;
7394389230750c45b105cdefb5850c81cae8cdc0Timo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen /* Caught once glibc passing in buffer == 0x0 */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (!buffer || !buflen) return ERANGE;
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen /* if there are leftovers return the next one */
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen if (sss_nss_getservent_data.data != NULL &&
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen sss_nss_getservent_data.ptr < sss_nss_getservent_data.len) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen repbuf = sss_nss_getservent_data.data + sss_nss_getservent_data.ptr;
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen replen = sss_nss_getservent_data.len - sss_nss_getservent_data.ptr;
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen pwrep.result = result;
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen pwrep.buffer = buffer;
41bb0aa8e357876bc9a1916a37c9e3e78e5f8185Timo Sirainen pwrep.buflen = buflen;
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen ret = sss_nss_getsvc_readrep(&pwrep, repbuf, &replen);
b35f7104715edee0cfac6d46ab0b342033867eb7Timo Sirainen if (ret) {
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen *errnop = ret;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return NSS_STATUS_TRYAGAIN;
51920d00fa50edf7b2e9b1019288d64b7abee7f3Timo Sirainen }
1d3f7c1278168d5b1cbfa9a2cc9929a0909056b4Timo Sirainen
51920d00fa50edf7b2e9b1019288d64b7abee7f3Timo Sirainen /* advance buffer pointer */
21ec6628c567eeff025af35d8027be01044b0b1aTimo Sirainen sss_nss_getservent_data.ptr = sss_nss_getservent_data.len - replen;
21ec6628c567eeff025af35d8027be01044b0b1aTimo Sirainen
21ec6628c567eeff025af35d8027be01044b0b1aTimo Sirainen return NSS_STATUS_SUCCESS;
21ec6628c567eeff025af35d8027be01044b0b1aTimo Sirainen }
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen /* release memory if any */
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen sss_nss_getservent_data_clean();
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen /* retrieve no more than SSS_NSS_MAX_ENTRIES at a time */
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen num_entries = SSS_NSS_MAX_ENTRIES;
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen rd.len = sizeof(uint32_t);
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen rd.data = &num_entries;
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen nret = sss_nss_make_request(SSS_NSS_GETSERVENT, &rd,
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen &repbuf, &replen, errnop);
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen if (nret != NSS_STATUS_SUCCESS) {
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen return nret;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen /* no results if not found */
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen if ((((uint32_t *)repbuf)[0] == 0)
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen || (replen - SVC_METADATA_COUNT == 0)) {
cd5ee8630497fdbd853ef588a858b4ef619a5e03Timo Sirainen free(repbuf);
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen return NSS_STATUS_NOTFOUND;
fd2118e34f4d1d65cffdccc40d74dda931fae81eTimo Sirainen }
fd2118e34f4d1d65cffdccc40d74dda931fae81eTimo Sirainen
fd2118e34f4d1d65cffdccc40d74dda931fae81eTimo Sirainen sss_nss_getservent_data.data = repbuf;
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen sss_nss_getservent_data.len = replen;
5a7b52012bf77132bb8f466d07e0e88c63fdba42Timo Sirainen
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen /* skip metadata fields */
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen sss_nss_getservent_data.ptr = SVC_METADATA_COUNT;
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen /* call again ourselves, this will return the first result */
9887c39c5ba429169389153ca99de49e084a73f0Timo Sirainen return internal_getservent_r(result, buffer, buflen, errnop);
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen}
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainenenum nss_status
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen_nss_sss_endservent(void)
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen{
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen enum nss_status nret;
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen int errnop;
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen sss_nss_lock();
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen /* make sure we do not have leftovers, and release memory */
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen sss_nss_getservent_data_clean();
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen nret = sss_nss_make_request(SSS_NSS_ENDSERVENT,
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen NULL, NULL, NULL, &errnop);
5a7b52012bf77132bb8f466d07e0e88c63fdba42Timo Sirainen if (nret != NSS_STATUS_SUCCESS) {
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen errno = errnop;
5efcaaace97d50e58e57424ee5bc51c7a0e942b4Timo Sirainen }
5efcaaace97d50e58e57424ee5bc51c7a0e942b4Timo Sirainen
5efcaaace97d50e58e57424ee5bc51c7a0e942b4Timo Sirainen sss_nss_unlock();
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen return nret;
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen}
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen