home *** CD-ROM | disk | FTP | other *** search
- /* History:
- 5/3/91 DJB authd version 3.5 alpha.
- 5/3/91 DJB modified to not compile without HAVE_UCRED
- 5/1/91 DJB baseline public domain
- Derived from authd 3.01, DJB.
- */
-
- #include "confhaveucred.h"
- #ifndef HAVE_UCRED
- error! error! error! XXX
- authd will not work on a system without struct ucred.
- #endif
-
- #include <stdio.h>
- #ifdef USE_SYSLOG
- #include <syslog.h>
- #endif
- #include "structfile.h"
- #include "structucred.h"
- #include "structinpcb.h"
- #include "getfcred.h"
- #include "filetable.h"
- #include "netinp.h"
- #include "auread.h"
- #include "username.h"
-
- int flagpwnam = 0;
- int flagauthd = 0;
- char localport[10];
- char remoteport[10];
-
- zap(err,argv0)
- char *err;
- char *argv0;
- {
- if (flagauthd)
- /* Reporting errors honestly to a remote host could damage security. */
- printf("%s, %s: ERROR: UNKNOWN-ERROR\r\n",localport,remoteport);
- else
- fprintf(stderr,"%s: fatal: %s\n",argv0,err);
- exit(37); /*XXX*/
- }
-
- #define ZAP(err) zap(err,argv[0])
-
- int loc4[4];
- int rem4[4];
- #define l1 loc4[0]
- #define l2 loc4[1]
- #define l3 loc4[2]
- #define l4 loc4[3]
- #define r1 rem4[0]
- #define r2 rem4[1]
- #define r3 rem4[2]
- #define r4 rem4[3]
-
- int doit(fp)
- register struct file *fp;
- {
- register struct ucred *uc;
- register int uid;
- char *un;
-
- uc = getfcred(fp);
- if (!uc)
- return -1;
- uid = (int) uc->cr_ruid;
- if (flagpwnam)
- {
- if (uid2username(uid,&un) == 1)
- /* XXX: We don't give out userids that don't have usernames. */
- return -1;
- if (flagauthd)
- /* UNIX is a trademark of AT&T. :-) */
- /* XXX: We could try to report UNIX variants here. */
- printf("%s, %s: USERID: %s: %s\r\n",localport,remoteport,"UNIX",un);
- else
- printf("%s\n",un);
- }
- else
- printf("%d\n",uid);
- return 0;
- }
-
- main(argc,argv)
- int argc;
- char *argv[];
- {
- register struct file *xfile;
- register struct file *fp;
- register struct inpcb *inp;
- int lp;
- int rp;
-
- if ((!strcmp(argv[0],"authd"))
- || ((strlen(argv[0]) >= 6)
- && (!strcmp(argv[0] + strlen(argv[0]) - 6,"/authd"))))
- flagauthd = flagpwnam = 1;
- else
- if ((!strcmp(argv[0],"tcpuname"))
- || ((strlen(argv[0]) >= 9)
- && (!strcmp(argv[0] + strlen(argv[0]) - 9,"/tcpuname"))))
- flagpwnam = 1;
-
- if (flagauthd)
- {
- if (readlr(localport,remoteport,loc4,rem4,&lp,&rp) == -1)
- exit(1); /*XXX*/
- #ifdef USE_SYSLOG
- /* This isn't worth the time for the procedure call, but if you want... */
- syslog(LOG_DEBUG,"authd: checking up on %d.%d.%d.%d %d %d.%d.%d.%d %d\n",
- r1,r2,r3,r4,rp,l1,l2,l3,l4,lp);
- #endif
- }
- else
- {
- if (argc < 4)
- ZAP("need four arguments");
- if (sscanf(argv[1],"%d.%d.%d.%d",&r1,&r2,&r3,&r4) < 4)
- ZAP("arg 1 must be a.b.c.d");
- if (sscanf(argv[2],"%d",&rp) < 1)
- ZAP("arg 2 must be integer");
- if (sscanf(argv[3],"%d.%d.%d.%d",&l1,&l2,&l3,&l4) < 4)
- ZAP("arg 3 must be a.b.c.d");
- if (sscanf(argv[4],"%d",&lp) < 1)
- ZAP("arg 4 must be integer");
- }
-
- if (netinpinit(r1,r2,r3,r4,rp) == -1)
- ZAP("cannot init netstat");
- if (filetableinit() == -1)
- ZAP("cannot init space for file table");
-
- xfile = getfiletable();
- if (!xfile)
- ZAP("cannot get file table");
-
- while (inp = nextnetinp())
- {
- /* Cursed be Convex and the other manufacturers who make this code */
- /* nearly impossible to write with any pretense of portability. */
- if((((char *) &inp->inp_faddr)[3] == (char) r4)
- &&(((char *) &inp->inp_laddr)[3] == (char) l4)
- &&(((char *) &inp->inp_faddr)[2] == (char) r3)
- &&(((char *) &inp->inp_laddr)[2] == (char) l3)
- &&(((char *) &inp->inp_faddr)[1] == (char) r2)
- &&(((char *) &inp->inp_laddr)[1] == (char) l2)
- &&(((char *) &inp->inp_faddr)[0] == (char) r1)
- &&(((char *) &inp->inp_laddr)[0] == (char) l1)
- &&(inp->inp_fport == htons((unsigned short) rp))
- &&(inp->inp_lport == htons((unsigned short) lp))
- )
- /* Is it worth snarfing the socket and checking that it points back */
- /* to inp? No, because then we have to worry about sys/socketvar.h, */
- /* including sys/mbuf.h on a Convex and maybe other machines, etc. */
- /* Sometimes portability gets in the way of everything else. */
- for (fp = xfile;fp < xfile + mynfile;++fp)
- if (fp->f_count && (fp->f_type == DTYPE_SOCKET))
- if ((char *) fp->f_data == (char *) inp->inp_socket)
- {
- if (doit(fp) == -1)
- ZAP("cannot get userid");
- exit(0);
- }
- }
- ZAP("no such TCP connection");
- exit(1);
- }
-