home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume6 / mverify < prev    next >
Text File  |  1989-03-20  |  8KB  |  275 lines

  1. Newsgroups: comp.sources.misc
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Subject: v06i064: mverify - Mail alias/user verification
  4. Reply-To: jeff@quark.wv.tek.com (Jeff Beadles)
  5.  
  6. Posting-number: Volume 6, Issue 64
  7. Submitted-by: jeff@quark.wv.tek.com (Jeff Beadles)
  8. Archive-name: mverify
  9.  
  10. This program opens a connection to SMTP sendmail on a target host.  It then
  11. attempts to verify that an alias/user exists in the eyes of the sendmail.
  12.  
  13. I use it to verify users on remote hosts without waiting for mail to bounce.
  14.  
  15.     -Jeff Beadles
  16.  
  17. --
  18. Jeff Beadles
  19. jeff@quark.WV.TEK.COM
  20.  
  21.  
  22. #--------------------------------CUT HERE-------------------------------------
  23. #! /bin/sh
  24. #
  25. # This is a shell archive.  Save this into a file, edit it
  26. # and delete all lines above this comment.  Then give this
  27. # file to sh by executing the command "sh file".  The files
  28. # will be extracted into the current directory owned by
  29. # you with default permissions.
  30. #
  31. # The files contained herein are:
  32. #
  33. # -rw-r--r--  1 jeff         1647 Mar  7 20:32 README
  34. # -rw-r--r--  1 jeff         4049 Mar  6 10:47 mverify.c
  35. #
  36. echo 'x - README'
  37. if test -f README; then echo 'shar: not overwriting README'; else
  38. sed 's/^X//' << '________This_Is_The_END________' > README
  39. X
  40. XRequirements:    SMTP sendmail on the receiving (target) host, and an OS that
  41. X        supports sockets.
  42. X
  43. XTo compile:    "make mverify"    (Yes that's right, there's no makefile.)
  44. X       (or) cc -O -o mverify mverify.c
  45. X
  46. XTo execute:    "mverify user@host"
  47. X
  48. X---------------------------------------------------------------------------
  49. Xmverify.c    Copyright 1989, Jeff Beadles jeff@quark.WV.TEK.COM
  50. X
  51. XPermission is granted to freely copy this program without charge.
  52. XIf you distribute a binary to someone, you must also provide the source
  53. Xupon request.
  54. X
  55. XThis started out as a little tool, and a learning experience for sockets &
  56. Xthe like.  If you find it useful, then good for you.  If not, then read rm(1).
  57. XWhat it does is fairly simple. It opens a connection to SMTP sendmail on a
  58. Xtarget host.  It then attempts to verify that the user exists in the eyes
  59. Xof the sendmail.  For example:  Let's say that I want to know who the
  60. Xuser/alias 'postmaster@quark' expanded to.  Mverify would be invoked as:
  61. X
  62. X% mverify postmaster@quark
  63. X
  64. XJeff Beadles  jeff 
  65. X
  66. XWith the /usr/lib/sendmail -bv command/option, it would only tell you that
  67. Xthe mail was 'deliverable' if the target was on another host.
  68. X
  69. XMost all of the error messages should be self explainatory.
  70. X
  71. XAs long as the local host can find the target host DIRECTLY, it
  72. Xshould work.  This program has no concept of mail domains.
  73. XIf it is given a domain-style host, it truncates everything up to
  74. Xincluding the first '.'  IE:  jeff@quark.WV.TEK.COM = jeff@quark
  75. X
  76. XIf you think of something useful to add, please send it to me, and
  77. XI'll see about adding it.
  78. X
  79. XJeff Beadles
  80. Xjeff@quark.WV.TEK.COM
  81. X...!uunet!tektronix.TEK.COM!quark.WV!jeff
  82. ________This_Is_The_END________
  83. if test `wc -l < README` -ne 43; then
  84.     echo 'shar: README was damaged during transit (should have been 43 lines)'
  85. fi
  86. fi        ; : end of overwriting check
  87. echo 'x - mverify.c'
  88. if test -f mverify.c; then echo 'shar: not overwriting mverify.c'; else
  89. sed 's/^X//' << '________This_Is_The_END________' > mverify.c
  90. X/*
  91. X * mverify.c    Copyright 1989, Jeff Beadles
  92. X *                jeff@quark.WV.TEK.COM
  93. X *
  94. X *    Permission is granted to freely copy this program without charge.
  95. X *    There are a couple of lines of autobounce.c by Pete Shipley
  96. X *    shipley@berkley.edu.
  97. X *
  98. X *    To compile, cc -o mverify mverify  : To use, mverify user@host
  99. X *
  100. X *    Note:  This program has no concept of mail domains.
  101. X *    If it is given a domain-style host, it truncates everything up to
  102. X *    including the '.'  IE:  jeff@quark.WV.TEK.COM = jeff@quark
  103. X *
  104. X *    This started out as a little tool.  If you find it useful, then
  105. X *    good for you.  If not, then read rm(1).
  106. X *
  107. X *    If you think of something useful to add, please send it to me, and
  108. X *    I'll see about adding it.
  109. X *
  110. X *    Jeff Beadles
  111. X *    jeff@quark.WV.TEK.COM
  112. X *
  113. X */
  114. X
  115. X/* #define index strchr   /* */
  116. X
  117. X#include <sys/param.h>
  118. X#include <sys/socket.h>
  119. X#include <netdb.h> 
  120. X#include <netinet/in.h>
  121. X#include <stdio.h>
  122. X#include <strings.h>
  123. X
  124. Xmain(argc, argv)
  125. Xint argc;
  126. Xchar **argv;
  127. X{
  128. X    FILE    *fin;
  129. X    FILE    *fout;
  130. X    char    *retval,
  131. X        *fgets(),
  132. X        *index(),
  133. X        buffer[2048],
  134. X        targetuser[1024],
  135. X        targethost[1024];
  136. X
  137. X    int    s;
  138. X    struct    servent  *sp;
  139. X    struct    hostent *hp, *gethostbyname();
  140. X    struct    sockaddr_in server;
  141. X
  142. X    if ( argc != 2) {
  143. X        (void)fprintf(stderr,"Usage: %s user@host\n",argv[0]);
  144. X        exit(1);
  145. X    }
  146. X    strcpy(targetuser,argv[1]);
  147. X    if( (retval=index(targetuser,'@')) == 0) {
  148. X        (void)fprintf(stdout,"Usage: %s user@host\n",argv[0]);
  149. X        exit(1);
  150. X    }
  151. X    *retval='\0';
  152. X    retval++;
  153. X    strcpy(targethost,retval);
  154. X    if ( (retval=index(targethost,'.')) != 0) {
  155. X           fprintf(stderr,"\nWarning: I do not know about mail domains.\n");
  156. X           fprintf(stderr,"Converting %s to ",targethost);
  157. X           *retval='\0';
  158. X           fprintf(stderr,"%s\n\n",targethost);
  159. X    }
  160. X
  161. X/*
  162. X *    One socket please...
  163. X */
  164. X    if ( (s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  165. X        perror("opening stream socket");
  166. X        exit(1);
  167. X    }
  168. X/*
  169. X *    Now get the information for the @host part of the address.
  170. X */
  171. X    server.sin_family = AF_INET;
  172. X    if ( (hp = gethostbyname(targethost)) == 0) {
  173. X        (void) fprintf(stderr, "%s: unknown host\n", targethost);
  174. X        exit(2);
  175. X    }
  176. X
  177. X
  178. X/*
  179. X *    Now get the smtp port using tcp.
  180. X */
  181. X    bcopy(hp->h_addr, (char *)&server.sin_addr, hp->h_length);
  182. X    sp = getservbyname("smtp", "tcp"); 
  183. X    server.sin_port = sp->s_port;
  184. X    if(server.sin_port == htons(0)) {
  185. X        (void)fprintf(stderr,"Unknown service: smtp/tcp\n");
  186. X        exit(1);
  187. X    }
  188. X
  189. X/*
  190. X *    Connecting to the socket might make things go a little easier...  :-)
  191. X */
  192. X    if (connect(s, (struct sockaddr *)&server, sizeof(server)) < 0) {
  193. X        perror("connecting stream socket");
  194. X        exit(1);
  195. X    }
  196. X
  197. X/*
  198. X *    Change the to streams 'cause I like'em better.
  199. X */
  200. X    fout = fdopen(s,"w");
  201. X    fin  = fdopen(s,"r");
  202. X
  203. X/*
  204. X *    Wait for the smtp mailer to answer.  It will greet us with:
  205. X * 220 quark.WV.TEK.COM Sendmail 5.17/6.24 ready at Thu, 2 Mar 89 23:52:29 PST
  206. X */
  207. X    while( (retval=fgets(buffer,sizeof(buffer) - 1,fin)) != NULL) {
  208. X        if ( !strncmp(buffer,"220 ",4))
  209. X            break;
  210. X    }
  211. X
  212. X/*
  213. X *    Now that we have the mailers attention, tell it to 'verify' the user.
  214. X */
  215. X    fprintf(fout,"\nVRFY %s\n",targetuser);
  216. X    fflush(fout);
  217. X
  218. X/*
  219. X *    Now just go into a loop reading responces from the mailer.
  220. X */
  221. X    while( (retval=fgets(buffer,sizeof(buffer) -1,fin)) != NULL) {
  222. X/*
  223. X *    Zap ^M < > from the lines.
  224. X */
  225. X        if ( (retval=index(buffer,'\r')) != 0)
  226. X            *retval='\0';
  227. X        if ( (retval=index(buffer,'<')) != 0)
  228. X            *retval=' ';
  229. X        if ( (retval=index(buffer,'>')) != 0)
  230. X            *retval=' ';
  231. X/*
  232. X *    250 = valid data follows.  If true, then this is a valid line.
  233. X *    The +4 skips the '250-'
  234. X */
  235. X        if ( !strncmp(buffer,"250",3)) {
  236. X            puts( buffer + 4);
  237. X        }
  238. X/*
  239. X *     550 is 'Command unrecognized.  Tell the user and exit.
  240. X *    The +4 skips the '550-'
  241. X */
  242. X        if ( !strncmp(buffer,"550",3)) {
  243. X            puts( buffer + 4);
  244. X            break;
  245. X        }
  246. X/*
  247. X * If "250 " then this was the last line of data.  
  248. X * (Note the space.  a '-' means that there's still more to come.)
  249. X */
  250. X        if ( !strncmp(buffer,"250 ", 4))
  251. X            break;
  252. X    }
  253. X/*
  254. X *    Close the SMTP connection.
  255. X */
  256. X    fputs("\n\nQUIT\n", fout);
  257. X    fflush(fout);
  258. X    fclose(fout);
  259. X    fclose(fin);
  260. X/*
  261. X *    And leave this nice program.
  262. X */
  263. X    exit(0);
  264. X}
  265. X
  266. ________This_Is_The_END________
  267. if test `wc -l < mverify.c` -ne 176; then
  268.     echo 'shar: mverify.c was damaged during transit (should have been 176 lines)'
  269. fi
  270. fi        ; : end of overwriting check
  271. exit 0
  272.  
  273.  
  274.  
  275.