Solved

About <linux/ucred.h> .............

Posted on 2004-08-06
3
1,553 Views
Last Modified: 2013-11-15
#include        "unp.h"
#include        <sys/param.h>
#include        <sys/ucred.h>

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

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

        if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fd) < 0)
                err_sys("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)
                err_sys("recv_cred error");
        else if (n == 0)
                err_quit("recv_cred, unexpected EOF");

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

        if (cred.fc_ngroups == 0)
                printf("(no credentials returned)\n");
        else {
                printf("real user ID = %d\n", cred.fc_ruid);
                printf("real group ID = %d\n", cred.fc_rgid);
                printf("login name = %-*s\n", MAXLOGNAME, cred.fc_login);
                printf("effective user ID = %d\n", cred.fc_uid);
                printf("effective group ID = %d\n", cred.fc_gid);
                printf("%d supplementary groups:", cred.fc_ngroups - 1);
                for (n = 1; n < cred.fc_ngroups; n++)   /* [0] is the egid */
                        printf(" %d", cred.fc_groups[n]);
                printf("\n");
        }

        exit(0);
}

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

ssize_t
recv_cred(int fd, void *ptr, size_t nbytes, struct fcred *fcredptr)
{
        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);

        fcredptr->fc_ngroups = 0;       /* indicates no credentials returned */
        if (fcredptr && msg.msg_controllen > 0) {
                struct cmsghdr  *cmptr = (struct cmsghdr *) control;

                if (cmptr->cmsg_len != sizeof(struct cmsghdr) + sizeof(struct fcred))
                        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(fcredptr, CMSG_DATA(cmptr), sizeof(struct fcred));
        }

        return(n);
}



unp.h file
====

/* include unph */
/* Our own header.  Tabs are set for 4 spaces, not 8 */

#ifndef      __unp_h
#define      __unp_h

#include      "../config.h"      /* configuration options for current OS */
                                          /* "../config.h" is generated by configure */

/* If anything changes in the following list of #includes, must change
   acsite.m4 also, for configure's tests. */

#include      <sys/types.h>      /* basic system data types */
#include      <sys/socket.h>      /* basic socket definitions */
#include      <sys/time.h>      /* timeval{} for select() */
#include      <time.h>            /* timespec{} for pselect() */
#include      <netinet/in.h>      /* sockaddr_in{} and other Internet defns */
#include      <arpa/inet.h>      /* inet(3) functions */
#include      <errno.h>
#include      <fcntl.h>            /* for nonblocking */
#include      <netdb.h>
#include      <signal.h>
#include      <stdio.h>
#include      <stdlib.h>
#include      <string.h>
#include      <sys/stat.h>      /* for S_xxx file mode constants */
#include      <sys/uio.h>            /* for iovec{} and readv/writev */
#include      <unistd.h>
#include      <sys/wait.h>
#include      <sys/un.h>            /* for Unix domain sockets */

#ifdef      HAVE_SYS_SELECT_H
# include      <sys/select.h>      /* for convenience */
#endif

#ifdef      HAVE_POLL_H
# include      <poll.h>            /* for convenience */
#endif

#ifdef      HAVE_STRINGS_H
# include      <strings.h>            /* for convenience */
#endif

/* Three headers are normally needed for socket/file ioctl's:
 * <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>.
 */
#ifdef      HAVE_SYS_IOCTL_H
# include      <sys/ioctl.h>
#endif
#ifdef      HAVE_SYS_FILIO_H
# include      <sys/filio.h>
#endif
#ifdef      HAVE_SYS_SOCKIO_H
# include      <sys/sockio.h>
#endif

#ifdef      HAVE_PTHREAD_H
# include      <pthread.h>
#endif

/* OSF/1 actually disables recv() and send() in <sys/socket.h> */
#ifdef      __osf__
#undef      recv
#undef      send
#define      recv(a,b,c,d)      recvfrom(a,b,c,d,0,0)
#define      send(a,b,c,d)      sendto(a,b,c,d,0,0)
#endif

#ifndef      INADDR_NONE
/* $$.Ic INADDR_NONE$$ */
#define      INADDR_NONE      0xffffffff      /* should have been in <netinet/in.h> */
#endif

#ifndef      SHUT_RD                        /* these three Posix.1g names are quite new */
#define      SHUT_RD            0      /* shutdown for reading */
#define      SHUT_WR            1      /* shutdown for writing */
#define      SHUT_RDWR      2      /* shutdown for reading and writing */
/* $$.Ic SHUT_RD$$ */
/* $$.Ic SHUT_WR$$ */
/* $$.Ic SHUT_RDWR$$ */
#endif

/* *INDENT-OFF* */
#ifndef INET_ADDRSTRLEN
/* $$.Ic INET_ADDRSTRLEN$$ */
#define      INET_ADDRSTRLEN            16      /* "ddd.ddd.ddd.ddd\0"
                                                    1234567890123456 */
#endif

/* Define following even if IPv6 not supported, so we can always allocate
   an adequately-sized buffer, without #ifdefs in the code. */
#ifndef INET6_ADDRSTRLEN
/* $$.Ic INET6_ADDRSTRLEN$$ */
#define      INET6_ADDRSTRLEN      46      /* max size of IPv6 address string:
                           "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx" or
                           "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd\0"
                            1234567890123456789012345678901234567890123456 */
#endif
/* *INDENT-ON* */

/* Define bzero() as a macro if it's not in standard C library. */
#ifndef      HAVE_BZERO
#define      bzero(ptr,n)            memset(ptr, 0, n)
/* $$.If bzero$$ */
/* $$.If memset$$ */
#endif

/* Older resolvers do not have gethostbyname2() */
#ifndef      HAVE_GETHOSTBYNAME2
#define      gethostbyname2(host,family)            gethostbyname((host))
#endif

/* The structure returned by recvfrom_flags() */
struct in_pktinfo {
  struct in_addr      ipi_addr;      /* dst IPv4 address */
  int                        ipi_ifindex;/* received interface index */
};
/* $$.It in_pktinfo$$ */
/* $$.Ib ipi_addr$$ */
/* $$.Ib ipi_ifindex$$ */

/* We need the newer CMSG_LEN() and CMSG_SPACE() macros, but few
   implementations support them today.  These two macros really need
    an ALIGN() macro, but each implementation does this differently. */
#ifndef      CMSG_LEN
/* $$.Ic CMSG_LEN$$ */
#define      CMSG_LEN(size)            (sizeof(struct cmsghdr) + (size))
#endif
#ifndef      CMSG_SPACE
/* $$.Ic CMSG_SPACE$$ */
#define      CMSG_SPACE(size)      (sizeof(struct cmsghdr) + (size))
#endif

/* Posix.1g requires the SUN_LEN() macro but not all implementations DefinE
   it (yet).  Note that this 4.4BSD macro works regardless whether there is
   a length field or not. */
#ifndef      SUN_LEN
/* $$.Im SUN_LEN$$ */
# define      SUN_LEN(su) \
      (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
#endif

/* Posix.1g renames "Unix domain" as "local IPC".
   But not all systems DefinE AF_LOCAL and AF_LOCAL (yet). */
#ifndef      AF_LOCAL
#define AF_LOCAL      AF_UNIX
#endif
#ifndef      PF_LOCAL
#define PF_LOCAL      PF_UNIX
#endif

/* Posix.1g requires that an #include of <poll.h> DefinE INFTIM, but many
   systems still DefinE it in <sys/stropts.h>.  We don't want to include
   all the streams stuff if it's not needed, so we just DefinE INFTIM here.
   This is the standard value, but there's no guarantee it is -1. */
#ifndef INFTIM
#define INFTIM          (-1)    /* infinite poll timeout */
/* $$.Ic INFTIM$$ */
#ifdef      HAVE_POLL_H
#define      INFTIM_UNPH                        /* tell unpxti.h we defined it */
#endif
#endif

/* Following could be derived from SOMAXCONN in <sys/socket.h>, but many
   kernels still #define it as 5, while actually supporting many more */
#define      LISTENQ            1024      /* 2nd argument to listen() */

/* Miscellaneous constants */
#define      MAXLINE            4096      /* max text line length */
#define      MAXSOCKADDR  128      /* max socket address structure size */
#define      BUFFSIZE      8192      /* buffer size for reads and writes */

/* Define some port number that can be used for client-servers */
#define      SERV_PORT             9877                  /* TCP and UDP client-servers */
#define      SERV_PORT_STR      "9877"                  /* TCP and UDP client-servers */
#define      UNIXSTR_PATH      "/tmp/unix.str"      /* Unix domain stream cli-serv */
#define      UNIXDG_PATH            "/tmp/unix.dg"      /* Unix domain datagram cli-serv */
/* $$.ix [LISTENQ]~constant,~definition~of$$ */
/* $$.ix [MAXLINE]~constant,~definition~of$$ */
/* $$.ix [MAXSOCKADDR]~constant,~definition~of$$ */
/* $$.ix [BUFFSIZE]~constant,~definition~of$$ */
/* $$.ix [SERV_PORT]~constant,~definition~of$$ */
/* $$.ix [UNIXSTR_PATH]~constant,~definition~of$$ */
/* $$.ix [UNIXDG_PATH]~constant,~definition~of$$ */

/* Following shortens all the type casts of pointer arguments */
#define      SA      struct sockaddr

#define      FILE_MODE      (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
                              /* default file access permissions for new files */
#define      DIR_MODE      (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)
                              /* default permissions for new directories */

typedef      void      Sigfunc(int);      /* for signal handlers */

#define      min(a,b)      ((a) < (b) ? (a) : (b))
#define      max(a,b)      ((a) > (b) ? (a) : (b))

#ifndef      HAVE_ADDRINFO_STRUCT
# include      "../lib/addrinfo.h"
#endif

#ifndef      HAVE_IF_NAMEINDEX_STRUCT
struct if_nameindex {
  unsigned int   if_index;  /* 1, 2, ... */
  char          *if_name;   /* null terminated name: "le0", ... */
};
/* $$.It if_nameindex$$ */
/* $$.Ib if_index$$ */
/* $$.Ib if_name$$ */
#endif

#ifndef      HAVE_TIMESPEC_STRUCT
struct timespec {
  time_t      tv_sec;            /* seconds */
  long            tv_nsec;      /* and nanoseconds */
};
/* $$.It timespec$$ */
/* $$.Ib tv_sec$$ */
/* $$.Ib tv_nsec$$ */
#endif
/* end unph */

                  /* prototypes for our own library functions */
int             connect_nonb(int, const SA *, socklen_t, int);
int             connect_timeo(int, const SA *, socklen_t, int);
void       daemon_init(const char *, int);
void       daemon_inetd(const char *, int);
void       dg_cli(FILE *, int, const SA *, socklen_t);
void       dg_echo(int, SA *, socklen_t);
char      *gf_time(void);
void       heartbeat_cli(int, int, int);
void       heartbeat_serv(int, int, int);
struct addrinfo *host_serv(const char *, const char *, int, int);
int             inet_srcrt_add(char *, int);
u_char  *inet_srcrt_init(void);
void       inet_srcrt_print(u_char *, int);
char   **my_addrs(int *);
int             readable_timeo(int, int);
ssize_t       readline(int, void *, size_t);
ssize_t       readn(int, void *, size_t);
ssize_t       read_fd(int, void *, size_t, int *);
ssize_t       recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,
             struct in_pktinfo *);
Sigfunc *signal_intr(int, Sigfunc *);
int             sock_bind_wild(int, int);
int             sock_cmp_addr(const SA *, const SA *, socklen_t);
int             sock_cmp_port(const SA *, const SA *, socklen_t);
int             sock_get_port(const SA *, socklen_t);
void       sock_set_addr(SA *, socklen_t, const void *);
void       sock_set_port(SA *, socklen_t, int);
void       sock_set_wild(SA *, socklen_t);
char      *sock_ntop(const SA *, socklen_t);
char      *sock_ntop_host(const SA *, socklen_t);
int             sockfd_to_family(int);
void       str_echo(int);
void       str_cli(FILE *, int);
int             tcp_connect(const char *, const char *);
int             tcp_listen(const char *, const char *, socklen_t *);
void       tv_sub(struct timeval *, struct timeval *);
int             udp_client(const char *, const char *, void **, socklen_t *);
int             udp_connect(const char *, const char *);
int             udp_server(const char *, const char *, socklen_t *);
int             writable_timeo(int, int);
ssize_t       writen(int, const void *, size_t);
ssize_t       write_fd(int, void *, size_t, int);

#ifdef      MCAST
int             mcast_leave(int, const SA *, socklen_t);
int             mcast_join(int, const SA *, socklen_t, const char *, u_int);
int             mcast_get_if(int);
int             mcast_get_loop(int);
int             mcast_get_ttl(int);
int             mcast_set_if(int, const char *, u_int);
int             mcast_set_loop(int, int);
int             mcast_set_ttl(int, int);

void       Mcast_leave(int, const SA *, socklen_t);
void       Mcast_join(int, const SA *, socklen_t, const char *, u_int);
int             Mcast_get_if(int);
int             Mcast_get_loop(int);
int             Mcast_get_ttl(int);
void       Mcast_set_if(int, const char *, u_int);
void       Mcast_set_loop(int, int);
void       Mcast_set_ttl(int, int);
#endif

unsigned short      in_cksum(unsigned short *, int);

#ifndef      HAVE_GETADDRINFO_PROTO
int             getaddrinfo(const char *, const char *, const struct addrinfo *,
                               struct addrinfo **);
void       freeaddrinfo(struct addrinfo *);
char      *gai_strerror(int);
#endif

#ifndef      HAVE_GETNAMEINFO_PROTO
int             getnameinfo(const SA *, socklen_t, char *, size_t, char *, size_t, int);
#endif

#ifndef      HAVE_GETHOSTNAME_PROTO
int             gethostname(char *, int);
#endif

#ifndef      HAVE_HSTRERROR_PROTO
const char      *hstrerror(int);
#endif

#ifndef      HAVE_IF_NAMETOINDEX_PROTO
unsigned int       if_nametoindex(const char *);
char                  *if_indextoname(unsigned int, char *);
void                   if_freenameindex(struct if_nameindex *);
struct if_nameindex *if_nameindex(void);
#endif

#ifndef      HAVE_INET_PTON_PROTO
int                   inet_pton(int, const char *, void *);
const char      *inet_ntop(int, const void *, char *, size_t);
#endif

#ifndef      HAVE_INET_ATON_PROTO
int             inet_aton(const char *, struct in_addr *);
#endif

#ifndef      HAVE_ISFDTYPE_PROTO
int             isfdtype(int, int);
#endif

#ifndef      HAVE_PSELECT_PROTO
int             pselect(int, fd_set *, fd_set *, fd_set *,
                         const struct timespec *, const sigset_t *);
#endif

#ifndef      HAVE_SOCKATMARK_PROTO
int             sockatmark(int);
#endif

#ifndef      HAVE_SNPRINTF_PROTO
int             snprintf(char *, size_t, const char *, ...);
#endif

                  /* prototypes for our own library wrapper functions */
void       Connect_timeo(int, const SA *, socklen_t, int);
struct addrinfo *Host_serv(const char *, const char *, int, int);
const char            *Inet_ntop(int, const void *, char *, size_t);
void                   Inet_pton(int, const char *, void *);
char                  *If_indextoname(unsigned int, char *);
unsigned int             If_nametoindex(const char *);
struct if_nameindex      *If_nameindex(void);
char   **My_addrs(int *);
ssize_t       Read_fd(int, void *, size_t, int *);
int             Readable_timeo(int, int);
ssize_t       Recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,
             struct in_pktinfo *);
Sigfunc *Signal(int, Sigfunc *);
Sigfunc *Signal_intr(int, Sigfunc *);
int             Sock_bind_wild(int, int);
char      *Sock_ntop(const SA *, socklen_t);
char      *Sock_ntop_host(const SA *, socklen_t);
int             Sockfd_to_family(int);
int             Tcp_connect(const char *, const char *);
int             Tcp_listen(const char *, const char *, socklen_t *);
int             Udp_client(const char *, const char *, void **, socklen_t *);
int             Udp_connect(const char *, const char *);
int             Udp_server(const char *, const char *, socklen_t *);
ssize_t       Write_fd(int, void *, size_t, int);
int             Writable_timeo(int, int);

                  /* prototypes for our Unix wrapper functions: see {Sec errors} */
void      *Calloc(size_t, size_t);
void       Close(int);
void       Dup2(int, int);
int             Fcntl(int, int, int);
void       Gettimeofday(struct timeval *, void *);
int             Ioctl(int, int, void *);
pid_t       Fork(void);
void      *Malloc(size_t);
void       Mktemp(char *);
void      *Mmap(void *, size_t, int, int, int, off_t);
int             Open(const char *, int, mode_t);
void       Pipe(int *fds);
ssize_t       Read(int, void *, size_t);
void       Sigaddset(sigset_t *, int);
void       Sigdelset(sigset_t *, int);
void       Sigemptyset(sigset_t *);
void       Sigfillset(sigset_t *);
int             Sigismember(const sigset_t *, int);
void       Sigpending(sigset_t *);
void       Sigprocmask(int, const sigset_t *, sigset_t *);
char      *Strdup(const char *);
long       Sysconf(int);
void       Sysctl(int *, u_int, void *, size_t *, void *, size_t);
void       Unlink(const char *);
pid_t       Wait(int *);
pid_t       Waitpid(pid_t, int *, int);
void       Write(int, void *, size_t);

                  /* prototypes for our stdio wrapper functions: see {Sec errors} */
void       Fclose(FILE *);
FILE      *Fdopen(int, const char *);
char      *Fgets(char *, int, FILE *);
FILE      *Fopen(const char *, const char *);
void       Fputs(const char *, FILE *);

                  /* prototypes for our socket wrapper functions: see {Sec errors} */
int             Accept(int, SA *, socklen_t *);
void       Bind(int, const SA *, socklen_t);
void       Connect(int, const SA *, socklen_t);
void       Getpeername(int, SA *, socklen_t *);
void       Getsockname(int, SA *, socklen_t *);
void       Getsockopt(int, int, int, void *, socklen_t *);
int             Isfdtype(int, int);
void       Listen(int, int);
#ifdef      HAVE_POLL
int             Poll(struct pollfd *, unsigned long, int);
#endif
ssize_t       Readline(int, void *, size_t);
ssize_t       Readn(int, void *, size_t);
ssize_t       Recv(int, void *, size_t, int);
ssize_t       Recvfrom(int, void *, size_t, int, SA *, socklen_t *);
ssize_t       Recvmsg(int, struct msghdr *, int);
int             Select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
void       Send(int, const void *, size_t, int);
void       Sendto(int, const void *, size_t, int, const SA *, socklen_t);
void       Sendmsg(int, const struct msghdr *, int);
void       Setsockopt(int, int, int, const void *, socklen_t);
void       Shutdown(int, int);
int             Sockatmark(int);
int             Socket(int, int, int);
void       Socketpair(int, int, int, int *);
void       Writen(int, void *, size_t);

void       err_dump(const char *, ...);
void       err_msg(const char *, ...);
void       err_quit(const char *, ...);
void       err_ret(const char *, ...);
void       err_sys(const char *, ...);

#endif      /* __unp_h */


BUT MY PROBLEM IS , I COULD NOT FIND THAT HEADER FILE WHICH IS GIVEN LIKE SYS/UCRED.H

ALSO I WANT TO GET IT COMPILED ON SOLARIS TOOO , that program ,....

HW CAN I DO ....

aman
0
Comment
Question by:amankhan
3 Comments
 
LVL 3

Accepted Solution

by:
255x4 earned 500 total points
Comment Utility
ucred.h is from the BSD world, not the GNU/Linux world.  It appears that this file exists in the various BSD kernel sources.

I would first check by going to the root (/) directory and searching for the file.

cd /
find -name ucred.h

If that did not work, I would ckeck on the Solaris CD's for any header packages, especially any kernel header packages.  Finally, I would go to one of the BSD sites and try to download that particaluar file.  I have been looking, but I believe it will be in one of the packages here:

ftp://ftp14.freebsd.org/pub/FreeBSD/releases/i386/5.0-CURRENT/packages/linux/

especially the Linux_base or Linux_devtools.  These file are pretty large, so I will try and download them and find which one has the file.

thanks,

255x4
0
 

Author Comment

by:amankhan
Comment Utility
Thank you sir 255x4

but my problem is that will i be able to use cred.h that is on solaris to make it work...

aman
0
 

Expert Comment

by:effectivista
Comment Utility
where can i get header files
sys/filio.h
and sys/sockio.h
pls help quick
i m using linux
and want to make threaded server
0

Featured Post

What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

Join & Write a Comment

After running Ubuntu some time, you will be asked to download updates for fixing bugs and security updates. All the packages you download replace the previous ones, except for the kernel, also called "linux-image". This is due to the fact that w…
Join Greg Farro and Ethan Banks from Packet Pushers (http://packetpushers.net/podcast/podcasts/pq-show-93-smart-network-monitoring-paessler-sponsored/) and Greg Ross from Paessler (https://www.paessler.com/prtg) for a discussion about smart network …
Connecting to an Amazon Linux EC2 Instance from Windows Using PuTTY.
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.

763 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

13 Experts available now in Live!

Get 1:1 Help Now