Solved

About LOCAL_CREDS option ......

Posted on 2004-08-07
4
250 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

Secure Your Active Directory - April 20, 2017

Active Directory plays a critical role in your company’s IT infrastructure and keeping it secure in today’s hacker-infested world is a must.
Microsoft published 300+ pages of guidance, but who has the time, money, and resources to implement? Register now to find an easier way.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This tech tip describes how to install the Solaris Operating System from a tape backup that was created using the Solaris flash archive utility. I have used this procedure on the Solaris 8 and 9 OS, and it shoudl also work well on the Solaris 10 rel…
Introduction Regular patching is part of a system administrator's tasks. However, many patches require that the system be in single-user mode before they can be installed. A cluster patch in particular can take quite a while to apply if the machine…
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
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.

749 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