Gets the principal name of a known entity at the server end.
Network Services Library (libnsl.a)
#include <rpc/rpcsec_gss.h>
bool_t rpc_gss_get_principal_name(s_principal,mech,name_u,node,secdomain)
rpc_gss_principal_t *s_principal;
char *mech;
char *name_u;
char *node;
char *secdomain;
Sometimes, a server wants to compare principal name that it has received with that of a known entity. The rpc_gss_get_principal_name subroutine provides the principal name of a known entity. This subroutine has various parameters that uniquely identify the known entity on the network and creates principal name of the rpc_gss_principal_t type.
Item | Description |
---|---|
s_principal | Represents the principal name of a client. This is an output parameter. |
mech | Represents the supported security mechanism that is used (for example, kerberosv5). |
name_u | Specifies the UNIX login name. |
node | Represents the machine name. |
secdomain | Represents the security domain. |
Parameter values are dependent on security mechanism. For those parameters that are not applicable for a particular security mechanism, you can specify NULL.
Item | Description |
---|---|
TRUE | successful |
FALSE | unsuccessful |
You can use the rpc_gss_get_error subroutine to retrieve the error number.
In the following example, the principal name is constructed for users with the myuser UNIX-login name, the mynode node, the mydomain domain, and the kerberosv5 security mechanism.
#include <stdlib.h>
#include <rpc/rpc.h>
#include <rpc/rpcsec_gss.h>
#define PROGNUM 0x3fffffffL
#define VERSNUM 0x1L
static void sample_dispatch(struct svc_req *, SVCXPRT *);
main()
{
/* Create RPC service handle and register with RPCBIND service */
/* Set the principal name */
svc_run();
return 1;
}
/* following is the sample dispatch routine*/
static void sample_dispatch(struct svc_req *request, SVCXPRT *xprt)
{
char *myuser,*mynode,*mydomain;
rpc_gss_principal_t princ;
myuser = "test01";
mynode = "localhost";
mydomain = "ibm.com";
if (!rpc_gss_get_principal_name(&princ,"kerberosv5",myuser,mynode,mydomain))
{
fprintf(stderr,"Error in getting principal name\n");
exit(1);
}
/* Compare retrieved principal name in 'princ' with received principal name */
/* Send reply back to caller */
}