env.c
上传用户:xxcykj
上传日期:2007-01-04
资源大小:727k
文件大小:6k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2.  * env.c -- small service routines
  3.  *
  4.  * Copyright 1998 by Eric S. Raymond
  5.  * For license terms, see the file COPYING in this directory.
  6.  */
  7. #include "config.h"
  8. #include <stdio.h>
  9. #include <ctype.h>
  10. #if defined(STDC_HEADERS)
  11. #include <stdlib.h>
  12. #endif
  13. #if defined(HAVE_UNISTD_H)
  14. #include <unistd.h>
  15. #endif
  16. #include <pwd.h>
  17. #include <string.h>
  18. #ifdef HAVE_GETHOSTBYNAME
  19. #include <netdb.h>
  20. #endif /* HAVE_GETHOSTBYNAME */
  21. #include  <sys/types.h>
  22. #include  <time.h>
  23. #include "fetchmail.h"
  24. #include "i18n.h"
  25. extern char *getenv(); /* needed on sysV68 R3V7.1. */
  26. extern char *program_name;
  27. void envquery(int argc, char **argv)
  28. /* set up basic stuff from the environment (including the rc file name) */
  29. {
  30.     struct passwd by_name, by_uid, *pwp;
  31.     if (!(user = getenv("LOGNAME")))
  32. user = getenv("USER");
  33.     if (!(pwp = getpwuid(getuid())))
  34.     {
  35. fprintf(stderr,
  36. _("%s: You don't exist.  Go away.n"),
  37. program_name);
  38. exit(PS_UNDEFINED);
  39.     }
  40.     else
  41.     {
  42. memcpy(&by_uid, pwp, sizeof(struct passwd));
  43. if (!user)
  44.     pwp = &by_uid;
  45. else if ((pwp = getpwnam(user)))
  46. {
  47.     /*
  48.      * This logic is needed to handle gracefully the possibility
  49.      * that multiple names might be mapped to one UID
  50.      */
  51.     memcpy(&by_name, pwp, sizeof(struct passwd));
  52.     if (by_name.pw_uid == by_uid.pw_uid)
  53. pwp = &by_name;
  54.     else
  55. pwp = &by_uid;
  56. }
  57. else
  58. {
  59.     fprintf(stderr,
  60.     _("%s: can't find your name and home directory!n"),
  61.     program_name);
  62.     exit(PS_UNDEFINED);
  63. }
  64. user = xstrdup(pwp->pw_name);
  65.     }
  66.     if (!(home = getenv("HOME")))
  67. home = pwp->pw_dir;
  68.     if ((program_name = strrchr(argv[0], '/')) != NULL)
  69. ++program_name;
  70.     else
  71. program_name = argv[0];
  72. #define RCFILE_NAME ".fetchmailrc"
  73.     rcfile = (char *) xmalloc(strlen(home)+sizeof(RCFILE_NAME)+1);
  74.     /* avoid //.fetchmailrc */
  75.     if (strcmp(home, "/") != 0) {
  76.      strcpy(rcfile, home);
  77.     } else {
  78.      *rcfile = '';
  79.     }
  80.     strcat(rcfile, "/");
  81.     strcat(rcfile, RCFILE_NAME);
  82. }
  83. char *host_fqdn(void)
  84. /* get the FQDN of the machine we're running */
  85. {
  86.     char tmpbuf[HOSTLEN+1];
  87.     if (gethostname(tmpbuf, sizeof(tmpbuf)))
  88.     {
  89. fprintf(stderr, _("%s: can't determine your host!"),
  90. program_name);
  91. exit(PS_DNS);
  92.     }
  93. #ifdef HAVE_GETHOSTBYNAME
  94.     /* if we got a . in the hostname assume it is a FQDN */
  95.     if (strchr(tmpbuf, '.') == NULL)
  96.     {
  97. struct hostent *hp;
  98. /* if we got a basename (as we do in Linux) make a FQDN of it */
  99. hp = gethostbyname(tmpbuf);
  100. if (hp == (struct hostent *) NULL)
  101. {
  102.     /* exit with error message */
  103.     fprintf(stderr,
  104.     _("gethostbyname failed for %sn"), tmpbuf);
  105.     exit(PS_DNS);
  106. }
  107. return(xstrdup(hp->h_name));
  108.     }
  109.     else
  110. #endif /* HAVE_GETHOSTBYNAME */
  111. return(xstrdup(tmpbuf));
  112. }
  113. static char *tzoffset(time_t *now)
  114. /* calculate timezone offset */
  115. {
  116.     static char offset_string[6];
  117.     struct tm gmt, *lt;
  118.     int off;
  119.     char sign = '+';
  120.     gmt = *gmtime(now);
  121.     lt = localtime(now);
  122.     off = (lt->tm_hour - gmt.tm_hour) * 60 + lt->tm_min - gmt.tm_min;
  123.     if (lt->tm_year < gmt.tm_year)
  124. off -= 24 * 60;
  125.     else if (lt->tm_year > gmt.tm_year)
  126. off += 24 * 60;
  127.     else if (lt->tm_yday < gmt.tm_yday)
  128. off -= 24 * 60;
  129.     else if (lt->tm_yday > gmt.tm_yday)
  130. off += 24 * 60;
  131.     if (off < 0) {
  132. sign = '-';
  133. off = -off;
  134.     }
  135.     if (off >= 24 * 60) /* should be impossible */
  136. off = 23 * 60 + 59; /* if not, insert silly value */
  137.     sprintf(offset_string, "%c%02d%02d", sign, off / 60, off % 60);
  138.     return (offset_string);
  139. }
  140. char *rfc822timestamp(void)
  141. /* return a timestamp in RFC822 form */
  142. {
  143.     time_t now;
  144.     static char buf[50];
  145.     time(&now);
  146. #ifdef HAVE_STRFTIME
  147.     /*
  148.      * Conform to RFC822.  We generate a 4-digit year here, avoiding
  149.      * Y2K hassles.  Max length of this timestamp in an English locale
  150.      * should be 29 chars.  The only things that should vary by locale
  151.      * are the day and month abbreviations.
  152.      */
  153.     strftime(buf, sizeof(buf)-1, 
  154.      "%a, %d %b %Y %H:%M:%S XXXXX (%Z)", localtime(&now));
  155.     strncpy(strstr(buf, "XXXXX"), tzoffset(&now), 5);
  156. #else
  157.     /*
  158.      * This is really just a portability fallback, as the
  159.      * date format ctime(3) emits is not RFC822
  160.      * conformant.
  161.      */
  162.     strcpy(buf, ctime(&now));
  163.     buf[strlen(buf)-1] = ''; /* remove trailing n */
  164. #endif /* HAVE_STRFTIME */
  165.     return(buf);
  166. }
  167. const char *showproto(int proto)
  168. /* protocol index to protocol name mapping */
  169. {
  170.     switch (proto)
  171.     {
  172.     case P_AUTO: return("auto");
  173. #ifdef POP2_ENABLE
  174.     case P_POP2: return("POP2");
  175. #endif /* POP2_ENABLE */
  176.     case P_POP3: return("POP3");
  177.     case P_IMAP: return("IMAP");
  178.     case P_IMAP_K4: return("IMAP-K4");
  179. #ifdef GSSAPI
  180.     case P_IMAP_GSS: return("IMAP-GSS");
  181. #endif /* GSSAPI */
  182.     case P_IMAP_CRAM_MD5: return("IMAP-LOGIN");
  183.     case P_IMAP_LOGIN: return("IMAP-LOGIN");
  184.     case P_APOP: return("APOP");
  185.     case P_RPOP: return("RPOP");
  186.     case P_ETRN: return("ETRN");
  187.     default: return("unknown?!?");
  188.     }
  189. }
  190. char *visbuf(const char *buf)
  191. /* visibilize a given string */
  192. {
  193.     static char vbuf[BUFSIZ];
  194.     char *tp = vbuf;
  195.     while (*buf)
  196.     {
  197. if (*buf == '"')
  198. {
  199.     *tp++ = '\'; *tp++ = '"';
  200.     buf++;
  201. }
  202. else if (*buf == '\')
  203. {
  204.     *tp++ = '\'; *tp++ = '\';
  205.     buf++;
  206. }
  207. else if (isprint(*buf) || *buf == ' ')
  208.     *tp++ = *buf++;
  209. else if (*buf == 'n')
  210. {
  211.     *tp++ = '\'; *tp++ = 'n';
  212.     buf++;
  213. }
  214. else if (*buf == 'r')
  215. {
  216.     *tp++ = '\'; *tp++ = 'r';
  217.     buf++;
  218. }
  219. else if (*buf == 'b')
  220. {
  221.     *tp++ = '\'; *tp++ = 'b';
  222.     buf++;
  223. }
  224. else if (*buf < ' ')
  225. {
  226.     *tp++ = '\'; *tp++ = '^'; *tp++ = '@' + *buf;
  227.     buf++;
  228. }
  229. else
  230. {
  231.     (void) sprintf(tp, "\0x%02x", *buf++);
  232.     tp += strlen(tp);
  233. }
  234.     }
  235.     *tp++ = '';
  236.     return(vbuf);
  237. }
  238. /* env.c ends here */