home *** CD-ROM | disk | FTP | other *** search
/ ftp.uv.es / 2014.11.ftp.uv.es.tar / ftp.uv.es / pub / unix / elm-2.4-pl20.tar.Z / elm-2.4-pl20.tar / lib / tail_of.c < prev    next >
C/C++ Source or Header  |  1992-10-03  |  4KB  |  130 lines

  1. static char rcsid[] = "@(#)$Id: tail_of.c,v 5.1 1992/10/03 22:41:36 syd Exp $";
  2.  
  3. /*******************************************************************************
  4.  *  The Elm Mail System  -  $Revision: 5.1 $   $State: Exp $
  5.  *
  6.  *            Copyright (c) 1988-1992 USENET Community Trust
  7.  *            Copyright (c) 1986,1987 Dave Taylor
  8.  *******************************************************************************
  9.  * Bug reports, patches, comments, suggestions should be sent to:
  10.  *
  11.  *    Syd Weinstein, Elm Coordinator
  12.  *    elm@DSI.COM            dsinc!elm
  13.  *
  14.  *******************************************************************************
  15.  * $Log: tail_of.c,v $
  16.  * Revision 5.1  1992/10/03  22:41:36  syd
  17.  * Initial checkin as of 2.4 Release at PL0
  18.  *
  19.  *
  20.  ******************************************************************************/
  21.  
  22. /** 
  23.  
  24. **/
  25.  
  26. #include "headers.h"
  27.  
  28.  
  29. int
  30. tail_of(from, buffer, to)
  31. char *from, *buffer, *to;
  32. {
  33.     /** Return last two words of 'from'.  This is to allow
  34.         painless display of long return addresses as simply the
  35.         machine!username. 
  36.         Or if the first word of the 'from' address is username or
  37.         full_username and 'to' is not NULL, then use the 'to' line
  38.         instead of the 'from' line.
  39.         If the 'to' line is used, return 1, else return 0.
  40.  
  41.         Also modified to know about X.400 addresses (sigh) and
  42.         that when we ask for the tail of an address similar to
  43.         a%b@c we want to get back a@b ...
  44.     **/
  45.  
  46.     /** Note: '!' delimits Usenet nodes, '@' delimits ARPA nodes,
  47.               ':' delimits CSNet & Bitnet nodes, '%' delimits multi-
  48.           stage ARPA hops, and '/' delimits X.400 addresses...
  49.               (it is fortunate that the ASCII character set only has
  50.              so many metacharacters, as I think we're probably using
  51.           them all!!) **/
  52.  
  53.     register int loc, i = 0, cnt = 0, using_to = 0;
  54.     
  55. #ifndef INTERNET
  56.     
  57.     /** let's see if we have an address appropriate for hacking: 
  58.         what this actually does is remove the spuriously added
  59.         local bogus Internet header if we have one and the message
  60.         has some sort of UUCP component too...
  61.     **/
  62.  
  63.     sprintf(buffer, "@%s", hostfullname); 
  64.     if (chloc(from,'!') != -1 && in_string(from, buffer))
  65.        from[strlen(from)-strlen(buffer)] = '\0';
  66.  
  67. #endif
  68.  
  69.     /**
  70.         Produce a simplified version of the from into buffer.  If the
  71.         from is just "username" or "Full Username" it will be preserved.
  72.         If it is an address, the rightmost "stuff!stuff", "stuff@stuff",
  73.         or "stuff:stuff" will be used.
  74.     **/
  75.     for (loc = strlen(from)-1; loc >= 0 && cnt < 2; loc--) {
  76.       if (from[loc] == BANG || from[loc] == AT_SIGN ||
  77.           from[loc] == COLON) cnt++;
  78.       if (cnt < 2) buffer[i++] = from[loc];
  79.     }
  80.     buffer[i] = '\0';
  81.     reverse(buffer);
  82.  
  83. #ifdef MMDF
  84.     if (strlen(buffer) == 0) {
  85.       if(to && *to != '\0' && !addr_matches_user(to, username)) {
  86.         tail_of(to, buffer, (char *)0);
  87.         using_to = 1;
  88.       } else
  89.         strcpy(buffer, full_username);
  90.         }
  91. #endif /* MMDF */
  92.  
  93.     if ( strcmp(buffer,full_username) == 0 ||
  94.       addr_matches_user(buffer,username) ) {
  95.  
  96.       /* This message is from the user, so use the "to" header instead
  97.        * if possible, to be more informative. Otherwise be nice and
  98.        * use full_username rather than the bare username even if
  99.        * we've only matched on the bare username.
  100.        */
  101.  
  102.       if(to && *to != '\0' && !addr_matches_user(to, username)) {
  103.         tail_of(to, buffer, (char *)0);
  104.         using_to = 1;
  105.       } else
  106.         strcpy(buffer, full_username);
  107.  
  108.     } else {                    /* user%host@host? */
  109.  
  110.       /** The logic here is that we're going to use 'loc' as a handy
  111.           flag to indicate if we've hit a '%' or not.  If we have,
  112.           we'll rewrite it as an '@' sign and then when we hit the
  113.           REAL at sign (we must have one) we'll simply replace it
  114.           with a NULL character, thereby ending the string there.
  115.       **/
  116.  
  117.       loc = 0;
  118.  
  119.       for (i=0; buffer[i] != '\0'; i++)
  120.         if (buffer[i] == '%') {
  121.           buffer[i] = AT_SIGN;
  122.           loc++;
  123.         }
  124.         else if (buffer[i] == AT_SIGN && loc)
  125.           buffer[i] = '\0';
  126.     }
  127.     return(using_to);
  128.  
  129. }
  130.