summaryrefslogtreecommitdiff
path: root/nss/protocols.c
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2010-10-10 20:21:39 +0000
committerArthur de Jong <arthur@arthurdejong.org>2010-10-10 20:21:39 +0000
commit002ed77f4772e6d028bd4ef7900c518005bc913e (patch)
treefc360b1707c22862d3e80c8b8616d554e13a8796 /nss/protocols.c
parent5ec1d7dacd5b0610ddcbcfce0508e6978df532e4 (diff)
generate Solaris NSS functions using same macros that are used for Glibc, splitting functionality to make a string representation into a single function per NSS map
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-pam-ldapd-solaris@1258 ef36b2f9-881f-0410-afb5-c4e39611909c
Diffstat (limited to 'nss/protocols.c')
-rw-r--r--nss/protocols.c221
1 files changed, 60 insertions, 161 deletions
diff --git a/nss/protocols.c b/nss/protocols.c
index b490fc3..8c55cc3 100644
--- a/nss/protocols.c
+++ b/nss/protocols.c
@@ -50,10 +50,9 @@ nss_status_t _nss_ldap_getprotobyname_r(
const char *name,struct protoent *result,
char *buffer,size_t buflen,int *errnop)
{
- NSS_BYNAME(NSLCD_ACTION_PROTOCOL_BYNAME,buffer,buflen,
+ NSS_BYNAME(NSLCD_ACTION_PROTOCOL_BYNAME,
name,
read_protoent(fp,result,buffer,buflen,errnop));
- return retv;
}
/* get a protocol entry by number */
@@ -61,10 +60,9 @@ nss_status_t _nss_ldap_getprotobynumber_r(
int number,struct protoent *result,
char *buffer,size_t buflen,int *errnop)
{
- NSS_BYINT32(NSLCD_ACTION_PROTOCOL_BYNUMBER,buffer,buflen,
+ NSS_BYINT32(NSLCD_ACTION_PROTOCOL_BYNUMBER,
number,
read_protoent(fp,result,buffer,buflen,errnop));
- return retv;
}
/* thread-local file pointer to an ongoing request */
@@ -81,9 +79,8 @@ nss_status_t _nss_ldap_getprotoent_r(
struct protoent *result,
char *buffer,size_t buflen,int *errnop)
{
- NSS_GETENT(protoentfp,NSLCD_ACTION_PROTOCOL_ALL,buffer,buflen,
+ NSS_GETENT(protoentfp,NSLCD_ACTION_PROTOCOL_ALL,
read_protoent(protoentfp,result,buffer,buflen,errnop));
- return retv;
}
/* close the stream opened by setprotoent() above */
@@ -96,196 +93,98 @@ nss_status_t _nss_ldap_endprotoent(void)
#ifdef NSS_FLAVOUR_SOLARIS
-static nss_status_t _nss_nslcd_getprotobyname_r(
- const char *name,struct protoent *result,char *buffer,
- size_t buflen,int *errnop)
-{
- NSS_BYNAME(NSLCD_ACTION_PROTOCOL_BYNAME,buffer,buflen,
- name,
- read_protoent(fp,result,buffer,buflen,errnop));
- return retv;
-}
-
-static nss_status_t _xnss_ldap_getprotobyname_r(nss_backend_t UNUSED(*be),void *args)
-{
- struct protoent priv_proto;
- struct protoent *proto=NSS_ARGS(args)->buf.result?(struct protoent *)NSS_ARGS(args)->buf.result:&priv_proto;
- char *buffer=NSS_ARGS(args)->buf.buffer;
- size_t buflen=NSS_ARGS(args)->buf.buflen;
- char *data_ptr;
- nss_status_t status;
- if (NSS_ARGS(args)->buf.buflen<0)
- {
- NSS_ARGS(args)->erange=1;
- return NSS_STATUS_TRYAGAIN;
- }
- status=_nss_nslcd_getprotobyname_r(NSS_ARGS(args)->key.name,proto,buffer,buflen,&errno);
- if (status!=NSS_STATUS_SUCCESS)
- return status;
- if (!NSS_ARGS(args)->buf.result)
- {
- /* result==NULL, return file format */
- data_ptr=(char *)malloc(buflen);
- /* FIXME: shouldn't there be some range checks here to see if it actually
- fits inside the buffer? */
- sprintf(data_ptr,"%s\t\t%d",proto->p_name,proto->p_proto);
- if (proto->p_aliases)
+static nss_status_t read_protostring(TFILE *fp,nss_XbyY_args_t *args)
+{
+ struct protoent result;
+ nss_status_t retv;
+ char *buffer;
+ size_t buflen;
+ int i;
+ /* read the protoent */
+ retv=read_protoent(fp,&result,NSS_ARGS(args)->buf.buffer,args->buf.buflen,&errno);
+ if (retv!=NSS_STATUS_SUCCESS)
+ return retv;
+ /* allocate a temporary buffer */
+ buflen=args->buf.buflen;
+ buffer=(char *)malloc(buflen);
+ /* build the formatted string */
+ /* FIXME: implement proper buffer size checking */
+ sprintf(buffer,"%s\t\t%d",result.p_name,result.p_proto);
+ if (result.p_aliases)
+ for (i=0; result.p_aliases[i]; i++)
{
- int i;
- for (i=0; proto->p_aliases[i]; i++)
- {
- strcat(data_ptr," ");
- strcat(data_ptr,proto->p_aliases[i]);
- }
+ strcat(buffer," ");
+ strcat(buffer,result.p_aliases[i]);
}
- strcpy(buffer,data_ptr);
- free(data_ptr);
- NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer;
- NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->buf.buffer);
- }
- else
- {
- NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result;
- }
- return status;
+ /* copy the result back to the result buffer and free the temporary one */
+ strcpy(NSS_ARGS(args)->buf.buffer,buffer);
+ free(buffer);
+ NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer;
+ NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->buf.buffer);
+ return NSS_STATUS_SUCCESS;
}
-static nss_status_t _nss_nslcd_getprotobynumber_r(
- int number,struct protoent *result,char *buffer,
- size_t buflen,int *errnop)
+#define READ_RESULT(fp) \
+ NSS_ARGS(args)->buf.result? \
+ read_protoent(fp,(struct protoent *)NSS_ARGS(args)->buf.result,NSS_ARGS(args)->buf.buffer,NSS_ARGS(args)->buf.buflen,&errno): \
+ read_protostring(fp,args); \
+ if (NSS_ARGS(args)->buf.result) \
+ NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result
+
+static nss_status_t get_getprotobyname(nss_backend_t UNUSED(*be),void *args)
{
- NSS_BYINT32(NSLCD_ACTION_PROTOCOL_BYNUMBER,buffer,buflen,
- number,
- read_protoent(fp,result,buffer,buflen,errnop));
- return retv;
+ NSS_BYNAME(NSLCD_ACTION_PROTOCOL_BYNAME,
+ NSS_ARGS(args)->key.name,
+ READ_RESULT(fp));
}
-static nss_status_t _xnss_ldap_getprotobynumber_r(nss_backend_t UNUSED(*be),void *args)
+static nss_status_t get_getprotobynumber(nss_backend_t UNUSED(*be),void *args)
{
- struct protoent priv_proto;
- struct protoent *proto=NSS_ARGS(args)->buf.result?(struct protoent *)NSS_ARGS(args)->buf.result:&priv_proto;
- int number=NSS_ARGS(args)->key.number;
- char *buffer=NSS_ARGS(args)->buf.buffer;
- size_t buflen=NSS_ARGS(args)->buf.buflen;
- char *data_ptr;
- nss_status_t status;
- if (NSS_ARGS(args)->buf.buflen<0)
- {
- NSS_ARGS(args)->erange=1;
- return NSS_STATUS_TRYAGAIN;
- }
- status=_nss_nslcd_getprotobynumber_r(number,proto,buffer,buflen,&errno);
- if (status!=NSS_STATUS_SUCCESS)
- return status;
- if (!NSS_ARGS(args)->buf.result)
- {
- /* result==NULL, return file format */
- data_ptr=(char *)malloc(buflen);
- sprintf(data_ptr,"%s\t\t%d",proto->p_name,proto->p_proto);
- if (proto->p_aliases)
- {
- int i;
- for (i=0; proto->p_aliases[i]; i++)
- {
- strcat(data_ptr," ");
- strcat(data_ptr,proto->p_aliases[i]);
- }
- }
- strcpy(buffer,data_ptr);
- free(data_ptr);
- NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer;
- NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->buf.buffer);
- }
- else
- {
- NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result;
- }
- return status;
+ NSS_BYINT32(NSLCD_ACTION_PROTOCOL_BYNUMBER,
+ NSS_ARGS(args)->key.number,
+ READ_RESULT(fp));
}
/* thread-local file pointer to an ongoing request */
static __thread TFILE *protoentfp;
-static nss_status_t _xnss_ldap_setprotoent(nss_backend_t UNUSED(*be),void UNUSED(*args))
+static nss_status_t get_setprotoent(nss_backend_t UNUSED(*be),void UNUSED(*args))
{
NSS_SETENT(protoentfp);
}
-static nss_status_t _nss_nslcd_getprotoent_r(
- struct protoent *result,char *buffer,size_t buflen,int *errnop)
+static nss_status_t get_getprotoent(nss_backend_t UNUSED(*be),void *args)
{
- NSS_GETENT(protoentfp,NSLCD_ACTION_PROTOCOL_ALL,buffer,buflen,
- read_protoent(protoentfp,result,buffer,buflen,errnop));
- return retv;
-}
-
-static nss_status_t _xnss_ldap_getprotoent_r(nss_backend_t UNUSED(*be),void *args)
-{
- struct protoent priv_proto;
- struct protoent *proto=NSS_ARGS(args)->buf.result?(struct protoent *)NSS_ARGS(args)->buf.result:&priv_proto;
- char *buffer=NSS_ARGS(args)->buf.buffer;
- size_t buflen=NSS_ARGS(args)->buf.buflen;
- char *data_ptr;
- nss_status_t status;
- if (NSS_ARGS(args)->buf.buflen<0)
- {
- NSS_ARGS(args)->erange=1;
- return NSS_STATUS_TRYAGAIN;
- }
- status=_nss_nslcd_getprotoent_r(proto,buffer,buflen,&errno);
- if (status!=NSS_STATUS_SUCCESS)
- return status;
- if (!NSS_ARGS(args)->buf.result)
- {
- /* result==NULL, return file format */
- data_ptr=(char *)malloc(buflen);
- sprintf(data_ptr,"%s\t\t%d",proto->p_name,proto->p_proto);
- if (proto->p_aliases)
- {
- int i;
- for (i=0; proto->p_aliases[i]; i++)
- {
- strcat(data_ptr," ");
- strcat(data_ptr,proto->p_aliases[i]);
- }
- }
- strcpy(buffer,data_ptr);
- free(data_ptr);
- NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer;
- NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->buf.buffer);
- }
- else
- {
- NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result;
- }
- return status;
+ NSS_GETENT(protoentfp,NSLCD_ACTION_PROTOCOL_ALL,
+ READ_RESULT(protoentfp));
}
-static nss_status_t _xnss_ldap_endprotoent(nss_backend_t UNUSED(*be),void UNUSED(*args))
+static nss_status_t get_endprotoent(nss_backend_t UNUSED(*be),void UNUSED(*args))
{
NSS_ENDENT(protoentfp);
}
-static nss_status_t _xnss_ldap_protocols_destr(nss_backend_t *be,void UNUSED(*args))
+static nss_status_t destructor(nss_backend_t *be,void UNUSED(*args))
{
free(be);
return NSS_STATUS_SUCCESS;
}
static nss_backend_op_t proto_ops[]={
- _xnss_ldap_protocols_destr,
- _xnss_ldap_endprotoent,
- _xnss_ldap_setprotoent,
- _xnss_ldap_getprotoent_r,
- _xnss_ldap_getprotobyname_r,
- _xnss_ldap_getprotobynumber_r
+ destructor,
+ get_endprotoent,
+ get_setprotoent,
+ get_getprotoent,
+ get_getprotobyname,
+ get_getprotobynumber
};
nss_backend_t *_nss_ldap_protocols_constr(const char UNUSED(*db_name),
- const char UNUSED(*src_name),const char UNUSED(*cfg_args))
+ const char UNUSED(*src_name),const char UNUSED(*cfg_args))
{
nss_backend_t *be;
- if (!(be=(nss_backend_t *)malloc(sizeof(*be))))
+ be=(nss_backend_t *)malloc(sizeof(*be));
+ if (be==NULL)
return NULL;
be->ops=proto_ops;
be->n_ops=sizeof(proto_ops)/sizeof(nss_backend_op_t);