2
2
service.c - NSS lookup functions for services database
4
4
Copyright (C) 2006 West Consulting
5
Copyright (C) 2006, 2007, 2008, 2010 Arthur de Jong
5
Copyright (C) 2006, 2007, 2008, 2010, 2012 Arthur de Jong
6
6
Copyright (C) 2010 Symas Corporation
8
8
This library is free software; you can redistribute it and/or
98
99
#ifdef NSS_FLAVOUR_SOLARIS
100
101
#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN
102
static nss_status_t read_servstring(TFILE *fp,nss_XbyY_args_t *args)
102
static char *servent2str(struct servent *result,char *buffer,size_t buflen)
104
struct servent result;
109
/* read the servent */
110
retv=read_servent(fp,&result,NSS_ARGS(args)->buf.buffer,args->buf.buflen,&errno);
111
if (retv!=NSS_STATUS_SUCCESS)
113
/* allocate a temporary buffer */
114
buflen=args->buf.buflen;
115
buffer=(char *)malloc(buflen);
116
/* build the formatted string */
117
/* FIXME: implement proper buffer size checking */
118
sprintf(buffer,"%s %d/%s",result.s_name,result.s_port,result.s_proto);
119
if (result.s_aliases)
120
for (i=0;result.s_aliases[i];i++)
105
res=snprintf(buffer,buflen,"%s %d/%s",result->s_name,result->s_port,result->s_proto);
106
if ((res<0)||(res>=buflen))
108
if (result->s_aliases)
109
for (i=0;result->s_aliases[i];i++)
123
strcat(buffer,result.s_aliases[i]);
111
strlcat(buffer," ",buflen);
112
strlcat(buffer,result->s_aliases[i],buflen);
125
/* copy the result back to the result buffer and free the temporary one */
126
strcpy(NSS_ARGS(args)->buf.buffer,buffer);
128
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer;
129
NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->buf.buffer);
130
return NSS_STATUS_SUCCESS;
133
#define READ_RESULT(fp) \
134
NSS_ARGS(args)->buf.result? \
135
read_servent(fp,(struct servent *)NSS_ARGS(args)->buf.result,NSS_ARGS(args)->buf.buffer,NSS_ARGS(args)->buf.buflen,&errno): \
136
read_servstring(fp,args); \
137
if ((NSS_ARGS(args)->buf.result)&&(retv==NSS_STATUS_SUCCESS)) \
138
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result;
140
#else /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */
142
#define READ_RESULT(fp) \
143
read_servent(fp,(struct servent *)NSS_ARGS(args)->buf.result,NSS_ARGS(args)->buf.buffer,NSS_ARGS(args)->buf.buflen,&errno); \
144
if (retv==NSS_STATUS_SUCCESS) \
145
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result;
147
#endif /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */
114
if (strlen(buffer)>=buflen-1)
118
#endif /* HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */
120
static nss_status_t read_result(TFILE *fp,nss_XbyY_args_t *args)
122
READ_RESULT(servent,&args->erange);
149
125
static nss_status_t services_getservbyname(nss_backend_t UNUSED(*be),void *args)
151
127
NSS_BYGEN(NSLCD_ACTION_SERVICE_BYNAME,
152
128
WRITE_STRING(fp,NSS_ARGS(args)->key.serv.serv.name);
153
129
WRITE_STRING(fp,NSS_ARGS(args)->key.serv.proto),
130
read_result(fp,args));
157
133
static nss_status_t services_getservbyport(nss_backend_t UNUSED(*be),void *args)