I want to make this program run on solaris machine .....

Posted on 2004-08-08
Last Modified: 2013-12-05
Hi guys,

 The following program is for getting credentials......

 I have some problems facing when run on solaris machine ......

Program is following :---->

#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 *);

  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");
      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]);

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

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)
  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));


To compile on soalris :

 cc -o tfcred02 tfcred02.c -lsocket -lnsl -lrt

To Run :


Am getting some errors:

They are following :---->

[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.)
tfcred02.c: In function `recv_cred':
tfcred02.c:86: error: structure has no member named `msg_control'
tfcred02.c:87: error: structure has no member named `msg_controllen'
tfcred02.c:88: error: structure has no member named `msg_flags'
tfcred02.c:95: error: structure has no member named `msg_controllen'
tfcred02.c:105: error: `SCM_CREDS' undeclared (first use in this function)
tfcred02.c:108: warning: passing arg 2 of `memcpy' makes pointer from integer without a cast

[ab1221@eagles ~/AdvNetProg/Assign3]$

Pls help me in this program..


Question by:amankhan
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
LVL 38

Accepted Solution

yuzh earned 500 total points
ID: 11749869
Please have a look at the following docs:
   "Secure interprocess communication"

   "Secure UNIX Programming FAQ":

Expert Comment

ID: 11754948
In the :

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

LOCAL_CREDS is not defined in the code.

int setsockopt( SOCKET s,  int level,  int optname,  const char* optval,  int optlen);

Hope this helps.

Featured Post

Secure Your WordPress Site: 5 Essential Approaches

WordPress is the web's most popular CMS, but its dominance also makes it a target for attackers. Our eBook will show you how to:

Prevent costly exploits of core and plugin vulnerabilities
Repel automated attacks
Lock down your dashboard, secure your code, and protect your users

Question has a verified solution.

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

If you have a server on collocation with the super-fast CPU, that doesn't mean that you get it running at full power. Here is a preamble. When doing inventory of Linux servers, that I'm administering, I've found that some of them are running on l…
Every server (virtual or physical) needs a console: and the console can be provided through hardware directly connected, software for remote connections, local connections, through a KVM, etc. This document explains the different types of consol…
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.:
Learn how to navigate the file tree with the shell. Use pwd to print the current working directory: Use ls to list a directory's contents: Use cd to change to a new directory: Use wildcards instead of typing out long directory names: Use ../ to move…
Suggested Courses

630 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