home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume35 / ncftp / part03 / ftprc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-25  |  5.3 KB  |  251 lines

  1. /* ftprc.c */
  2.  
  3. #include "sys.h"
  4. #include <sys/types.h>
  5. #include <sys/param.h>
  6. #include <sys/stat.h>
  7.  
  8. #ifdef SCO324
  9. #    include <sys/arpa.h>
  10. #endif
  11.  
  12. #include <string.h>
  13. #include <ctype.h>
  14. #include "ftpdefs.h"
  15. #include "defaults.h"
  16. #include "ftprc.h"
  17. #include "main.h"
  18. #include "cmds.h"
  19. #include "copyright.h"
  20.  
  21. /* ftprc.c global variables */
  22. siteptr                    firstsite = NULL, lastsite = NULL;
  23. char                    rcname[MAXPATHLEN];
  24. int                        parsing_rc = 0;
  25.  
  26. extern char                *line, *margv[];
  27. extern int                margc;
  28. extern string            anon_password;        /* most likely your email address */
  29. extern struct userinfo    uinfo;
  30.  
  31. int thrash_rc(void)
  32. {
  33.     struct stat            st;
  34.     string                word, str;
  35.     char                cwd[MAXPATHLEN];
  36.     char                *cp, *dp, *rc;
  37.     FILE                *fp;
  38.     int                    i;
  39.  
  40.     (void) get_cwd(cwd, sizeof(cwd));
  41.     if (cwd[strlen(cwd) - 1] != '/')
  42.         (void) Strncat(cwd, "/");
  43.  
  44.     /* Because some versions of regular ftp complain about ncftp's
  45.      * #set commands, FTPRC takes precedence over NETRC.
  46.      */
  47.     for (i=0; i<2; i++) {
  48.         rc = (i == 0) ? FTPRC : NETRC;
  49.  
  50.         sprintf(rcname, "%s%s", cwd, rc);
  51.         if (stat(rcname, &st) == 0)
  52.             goto foundrc;
  53.         
  54.         sprintf(rcname, "%s.%s", cwd, rc);
  55.         if (stat(rcname, &st) == 0)
  56.             goto foundrc;
  57.  
  58.         (void) sprintf(rcname, "%s/.%s", uinfo.homedir, rc);
  59.         if (stat(rcname, &st) == 0)
  60.             goto foundrc;
  61.     }
  62.  
  63.     return (0);    /* it's OK not to have an rc. */
  64.     
  65. foundrc:    
  66.     if ((st.st_mode & 077) != 0)                /* rc must be unreadable by others. */
  67.         (void) chmod(rcname, 0600);
  68.  
  69.     if ((fp = fopen(rcname, "r")) == NULL) {
  70.         Perror(rcname);
  71.         return -1;
  72.     }
  73.     
  74.     parsing_rc = 1;
  75.     while (cp = FGets(str, fp)) {
  76.         while (isspace(*cp)) ++cp;        /* skip leading space. */
  77.         if (*cp == '#') {
  78.             if ((strncmp("set", ++cp, (size_t)3) == 0) || (strncmp("unset", cp, (size_t)5) == 0)) {
  79.                 (void) strcpy(line, cp);
  80.                 makeargv();
  81.                 set(margc, margv);            
  82.                 /* setting or unsetting a variable. */
  83.             } /* else a comment. */
  84.         } else {
  85.             if (strncmp(cp, "machine", (size_t) 7) == 0) {
  86.                 /* We have a new machine record. */
  87.                 cp += 7;
  88.                 while (isspace(*cp)) ++cp;    /* skip delimiting space. */
  89.                 dp = word;
  90.                 while (*cp && !isspace(*cp)) *dp++ = *cp++;    /* copy the name. */
  91.                 *dp = 0;
  92.                 AddNewSitePtr(word);
  93.             }
  94.         }
  95.     }
  96.     (void) fclose(fp);
  97.     parsing_rc = 0;
  98.     return 1;
  99. }    /* thrash_rc */
  100.  
  101.  
  102.  
  103. void AddNewSitePtr(char *word)
  104. {
  105.     siteptr            s;
  106.  
  107.     if (s = (siteptr) malloc(sizeof(site))) {
  108.         s->next = NULL;
  109.         if (s->name = malloc(strlen(word) + 1)) {
  110.             (void) strcpy(s->name, word);
  111.             if (firstsite == NULL)
  112.                 firstsite = lastsite = s;
  113.             else {
  114.                 lastsite->next = s;
  115.                 lastsite = s;
  116.             }
  117.         } else {
  118.             free(s);
  119.         }
  120.     }
  121. }    /* AddNewSitePtr */
  122.  
  123.  
  124.  
  125.  
  126. void GetFullSiteName(char *host)
  127. {
  128.     register siteptr s, s2;
  129.  
  130.     /* see if 'host' is in our list of favorite sites. */
  131.     for (s = firstsite; s != NULL; s2=s->next, s=s2)
  132.         if (strstr(s->name, host) != NULL) {
  133.             (void) strcpy(host, s->name);
  134.             break;
  135.         }
  136. }    /* GetFullSiteName */
  137.  
  138.  
  139.  
  140.  
  141. int ruserpass2(char *host, char **username, char **pass, char **acct)
  142. {
  143.     FILE            *fp;
  144.     char            *cp, *dp, *dst, *ep;
  145.     str32            macname;
  146.     char            *varname;
  147.     int                site_found;
  148.     string            str;
  149.     static string    auser;
  150.     static str32    apass, aacct;
  151.  
  152.     site_found = 0;
  153.  
  154.     if ((fp = fopen(rcname, "r")) != NULL) {
  155.         parsing_rc = 1;
  156.         while (FGets(str, fp)) {
  157.             if (cp = strstr(str, "machine")) {
  158.                 /* Look for the machine token. */
  159.                 cp += 7;
  160.                 while (isspace(*cp))
  161.                     cp++;
  162.             } else
  163.                 continue;
  164.             if (strncmp(cp, host, strlen(host)) == 0) {
  165.                 site_found = 1;
  166.                 while (!isspace(*cp))
  167.                     ++cp;        /* skip the site name. */
  168.                 do {
  169.                     /* Skip any comments ahead of time. */
  170.                     for (dp=cp; *dp; dp++) {
  171.                         if (*dp == '#') {
  172.                             *dp = 0;
  173.                             break;
  174.                         }
  175.                     }
  176.  
  177.                     ep = cp;
  178.                     while (1) {
  179.                         varname = strtok(ep, RC_DELIM);
  180.                         if (!varname) break;
  181.                         dst = ep = NULL;
  182.                         switch (*varname) {
  183.                             case 'u':    /* user */
  184.                                 *username = dst = auser;
  185.                                 break;
  186.                             case 'l':    /* login */
  187.                                 *username = dst = auser;
  188.                                 break;
  189.                             case 'p':    /* password */
  190.                                 *pass = dst = apass;
  191.                                 break;
  192.                             case 'a':    /* account */
  193.                                 *acct = dst = aacct;
  194.                                 break;
  195.                         /*    case 'd':  /o default */
  196.                         /* unused -- use 'set anon_password.' */
  197.                             case 'm':    /* macdef or machine */
  198.                                 if (strcmp(varname, "macdef"))
  199.                                     goto done;    /* new machine record... */
  200.                                 dst = macname;
  201.                                 break;
  202.                             default:
  203.                                 (void) fprintf(stderr, "Unknown .netrc keyword \"%s\"\n",
  204.                                     varname
  205.                                 );
  206.                         }
  207.                         if (dst) {
  208.                             dp = strtok(ep, RC_DELIM);
  209.                             if (dp)
  210.                                 (void) strcpy(dst, dp);
  211.                             if (dst == macname) {
  212.                                 /*
  213.                                  *    Read in the lines of the macro.
  214.                                  *    The macro's end is denoted by
  215.                                  *    a blank line.
  216.                                  */
  217.                                 (void) make_macro(macname, fp);
  218.                                 goto nextline;
  219.                             }
  220.                         }
  221.                     }
  222. nextline: ;
  223.                 } while (cp = FGets(str, fp));
  224.                 break;
  225.             }        /* end if we found the machine record. */
  226.         }
  227. done:
  228.         parsing_rc = 0;
  229.         (void) fclose(fp);
  230.     }
  231.  
  232.     if (!site_found) {
  233.         /* didn't find it in the rc. */
  234.         return (0);
  235.     }
  236.  
  237.     if (*username == NULL) {
  238.         *username = "anonymous";
  239.         *pass = anon_password;
  240.     }
  241.  
  242.     /* Make sure the password looks like an address. */
  243.     if (strcmp(*username, "anonymous") == 0) {
  244.         if (*pass == NULL || index(*pass, '@') == NULL)
  245.             *pass = anon_password;
  246.     }
  247.     return (1);    /* found */
  248. }    /* ruserpass2 */
  249.  
  250. /* eof ftprc.c */
  251.