Solved

About LOCAL_CREDS option ......

Posted on 2004-08-07
4
239 Views
Last Modified: 2010-04-21
Hi guys

For credentials in unix domain sockets, we use LOCAL_CREDS option set using setsockopt(). But I want to make this code work on solaris . what should i replace it with in order to work...


the syntax is :

setsockopt(fd[1], 0, LOCAL_CREDS, &on, sizeof(on));

what should i do to make it workon solaris machine ..

Full code is :-->

#include   <stdio.h>
#include   <stdlib.h>
#include   <sys/socket.h>
#include   <errno.h>
#include   <sys/types.h>
#include   <sys/uio.h>
#include   <signal.h>
#include   <time.h>
#include   <sys/types.h>
#include   <stdlib.h>
#include   <pthread.h>
#include   <sys/param.h>
#include   <sys/cred.h>


ssize_t recv_cred(int, void *, size_t, struct cred *);

main()
{
  int             fd[2], on, n;
  char            buf[100];
  struct cred    cred;

  if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd) < 0)
    perror("Socketpair Error");

  /* must set the socket option on the *receiving* socket */
  on = 1;
  setsockopt(fd[1], 0, LOCAL_CREDS, &on, sizeof(on));

  write(fd[0], "hello, world\n", 13);

  if ( (n = recv_cred(fd[1], buf, sizeof(buf), &cred)) < 0)
    perror("Recv_Cred Error");

  else if (n == 0)
    perror("Recv_Cred, Unexpected EOF");

  buf[n] = 0;                     /* null terminate */
  printf("data: %s", buf);

 if (cred.cr_ngroups == 0)
    printf("[No CREDENTIALS Returned]\n");

  else
    {
      printf(" Real User ID = %d\n", cred.cr_ruid);
      printf(" Real Group ID = %d\n", cred.cr_rgid);
      //      printf(" Login Name = %-*s\n", MAXLOGNAME, cred.cr_login);
      printf(" Effective User ID = %d\n", cred.cr_uid);
      printf(" Effective Group ID = %d\n", cred.cr_gid);
      printf(" %d Supplementary Groups:", cred.cr_ngroups - 1);

      for (n = 1; n < cred.cr_ngroups; n++)   /* [0] is the egid */
        printf(" %d", cred.cr_groups[n]);

      printf("\n");
    }

  exit(0);

}
#define CONTROL_LEN     (sizeof(struct cmsghdr) + sizeof(struct cred))


ssize_t
recv_cred(int fd, void *ptr, size_t nbytes, struct cred *credptr)
{
  struct msghdr   msg;
  struct iovec    iov[1];
  char            control[CONTROL_LEN + 20];
  int             n;

  msg.msg_name = NULL;
  msg.msg_namelen = 0;

  iov[0].iov_base = ptr;
  iov[0].iov_len = nbytes;

  msg.msg_iov = iov;
  msg.msg_iovlen = 1;

  msg.msg_control = control;
  msg.msg_controllen = sizeof(control);
 msg.msg_flags = 0;

  if ( (n = recvmsg(fd, &msg, 0)) < 0)
    return(n);

  credptr->cr_ngroups = 0;       /* indicates no credentials returned */

  if (credptr && msg.msg_controllen > 0)
    {
      struct cmsghdr  *cmptr = (struct cmsghdr *) control;

      if (cmptr->cmsg_len != sizeof(struct cmsghdr) + sizeof(struct cred))
        err_quit("control length = %d", cmptr->cmsg_len);

      if (cmptr->cmsg_level != SOL_SOCKET)
        err_quit("control level != SOL_SOCKET");

      if (cmptr->cmsg_type != SCM_CREDS)
        err_quit("control type != SCM_CREDS");

      memcpy(credptr, CMSG_DATA(cmptr), sizeof(struct cred));
    }

  return(n);
}


Am getting few errors when i compile this on solaris 9 machine ...

i want to get rid of that LOCAL_CREDS error and SCM_CREDS error..

can u help me pls .... or else can u tell me how i can extract credentials like user id group id of the peer process...

bye
aman

0
Comment
Question by:amankhan
  • 2
  • 2
4 Comments
 
LVL 51

Accepted Solution

by:
ahoffmann earned 500 total points
ID: 11747602
> Am getting few errors when i compile this on solaris 9 machine ...
please post errors
0
 

Author Comment

by:amankhan
ID: 11750658
[ab1221@eagles ~/AdvNetProg/Assign3]$ cc -o tfcred02 tfcred02.c -lsocket -lnsl -lrt
tfcred02.c: In function `main':
tfcred02.c:30: error: `LOCAL_CREDS' undeclared (first use in this function)
tfcred02.c:30: error: (Each undeclared identifier is reported only once
tfcred02.c:30: error: for each function it appears in.)
 [ab1221@eagles ~/AdvNetProg/Assign3]$
0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 11751113
AFAIK Solaris does not have these socket options
0
 

Author Comment

by:amankhan
ID: 11759662
Then how can i make it work....
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

My previous tech tip, Installing the Solaris OS From the Flash Archive On a Tape (http://www.experts-exchange.com/articles/OS/Unix/Solaris/Installing-the-Solaris-OS-From-the-Flash-Archive-on-a-Tape.html), discussed installing the Solaris Operating S…
I have been running these systems for a few years now and I am just very happy with them.   I just wanted to share the manual that I have created for upgrades and other things.  Oooh yes! FreeBSD makes me happy (as a server), no maintenance and I al…
Learn how to find files with the shell using the find and locate commands. Use locate to find a needle in a haystack.: With locate, check if the file still exists.: Use find to get the actual location of the file.:
In a previous video, we went over how to export a DynamoDB table into Amazon S3.  In this video, we show how to load the export from S3 into a DynamoDB table.

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now