diff options
author | Arthur de Jong <arthur@arthurdejong.org> | 2006-11-25 11:56:24 +0100 |
---|---|---|
committer | Arthur de Jong <arthur@arthurdejong.org> | 2006-11-25 11:56:24 +0100 |
commit | 70f10e2b6c10e7e47ab3377854e61a4534af79fb (patch) | |
tree | 4bab7fb53ab220809034db70411a23711fa7417b /nss/services.c | |
parent | 1d4906c0e367960d35bd688e85b31cb6a376f5bc (diff) |
implement server end of service name lookup and fix client end to translate between host and network byte order and to also pass protocol in request
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/libnss_ldapd@123 ef36b2f9-881f-0410-afb5-c4e39611909c
Diffstat (limited to 'nss/services.c')
-rw-r--r-- | nss/services.c | 53 |
1 files changed, 50 insertions, 3 deletions
diff --git a/nss/services.c b/nss/services.c index 5da0f19..9f6047a 100644 --- a/nss/services.c +++ b/nss/services.c @@ -36,7 +36,7 @@ #define LDF_INT32(field) READ_INT32(fp,field) #define SERVICE_NAME result->s_name #define SERVICE_ALIASES result->s_aliases -#define SERVICE_NUMBER result->s_port +#define SERVICE_NUMBER port #define SERVICE_PROTOCOL result->s_proto static enum nss_status read_servent( @@ -44,21 +44,68 @@ static enum nss_status read_servent( char *buffer,size_t buflen,int *errnop) { int32_t tmpint32,tmp2int32,tmp3int32; + int port; size_t bufptr=0; /* auto-genereted read code */ LDF_SERVICE; + /* store number in network byte order */ + result->s_port=ntohs(port); /* we're done */ return NSS_STATUS_SUCCESS; } enum nss_status _nss_ldap_getservbyname_r(const char *name,const char *protocol,struct servent *result,char *buffer,size_t buflen,int *errnop) { - NSS_BYNAME(NSLCD_ACTION_SERVICE_BYNAME,name,read_servent); + FILE *fp; + int32_t tmpint32; + enum nss_status retv; + /* open socket and write request */ + OPEN_SOCK(fp); + WRITE_REQUEST(fp,NSLCD_ACTION_SERVICE_BYNAME); + /* write the parameters */ + WRITE_STRING(fp,name); + /* fall back to empty string in case of NULL */ + if (protocol==NULL) + protocol=""; + WRITE_STRING(fp,protocol); + WRITE_FLUSH(fp); + /* read response */ + READ_RESPONSEHEADER(fp,NSLCD_ACTION_SERVICE_BYNAME); + READ_RESPONSE_CODE(fp); + retv=read_servent(fp,result,buffer,buflen,errnop); + /* check read result */ + if (retv!=NSS_STATUS_SUCCESS) + return retv; + /* close socket and we're done */ + fclose(fp); + return NSS_STATUS_SUCCESS; } enum nss_status _nss_ldap_getservbyport_r(int port,const char *protocol,struct servent *result,char *buffer,size_t buflen,int *errnop) { - NSS_BYINT32(NSLCD_ACTION_SERVICE_BYNUMBER,port,read_servent); + FILE *fp; + int32_t tmpint32; + enum nss_status retv; + /* open socket and write request */ + OPEN_SOCK(fp); + WRITE_REQUEST(fp,NSLCD_ACTION_SERVICE_BYNUMBER); + /* write the parameters */ + WRITE_INT32(fp,ntohs(port)); + /* fall back to empty string in case of NULL */ + if (protocol==NULL) + protocol=""; + WRITE_STRING(fp,protocol); + WRITE_FLUSH(fp); + /* read response */ + READ_RESPONSEHEADER(fp,NSLCD_ACTION_SERVICE_BYNUMBER); + READ_RESPONSE_CODE(fp); + retv=read_servent(fp,result,buffer,buflen,errnop); + /* check read result */ + if (retv!=NSS_STATUS_SUCCESS) + return retv; + /* close socket and we're done */ + fclose(fp); + return NSS_STATUS_SUCCESS; } /* thread-local file pointer to an ongoing request */ |