Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

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

Posted on 2004-08-08
2
Medium Priority
?
357 Views
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 *);

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


To compile on soalris :

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

To Run :

  ./tfcred02


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..

bye
aman

0
Comment
Question by:amankhan
2 Comments
 
LVL 38

Accepted Solution

by:
yuzh earned 1000 total points
ID: 11749869
Please have a look at the following docs:
   "Secure interprocess communication"
     http://cr.yp.to/docs/secureipc.html

   "Secure UNIX Programming FAQ":
   http://www.securitymap.net/sdm/docs/faq/secure-faq.html
   http://www.uni-giessen.de/faq/archiv/unix-faq.programmer.secure-programming/msg00000.html
0
 
LVL 1

Expert Comment

by:eric_j_kropf
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.
0

Featured Post

How to Use the Help Bell

Need to boost the visibility of your question for solutions? Use the Experts Exchange Help Bell to confirm priority levels and contact subject-matter experts for question attention.  Check out this how-to article for more information.

Question has a verified solution.

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

Google Drive is extremely cheap offsite storage, and it's even possible to get extra storage for free for two years.  You can use the free account 15GB, and if you have an Android device..when you install Google Drive for the first time it will giveā€¦
In part one, we reviewed the prerequisites required for installing SQL Server vNext. In this part we will explore how to install Microsoft's SQL Server on Ubuntu 16.04.
Connecting to an Amazon Linux EC2 Instance from Windows Using PuTTY.
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.
Suggested Courses
Course of the Month9 days, 12 hours left to enroll

926 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