sig_file.c
上传用户:knt0001
上传日期:2022-01-28
资源大小:264k
文件大小:6k
源码类别:

Email客户端

开发平台:

C/C++

  1. /**
  2.     eMail is a command line SMTP client.
  3.     Copyright (C) 2001 - 2008 email by Dean Jones
  4.     Software supplied and written by http://www.cleancode.org
  5.     This file is part of eMail.
  6.     eMail is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 2 of the License, or
  9.     (at your option) any later version.
  10.     eMail is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.     You should have received a copy of the GNU General Public License
  15.     along with eMail; if not, write to the Free Software
  16.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17. **/
  18. #if HAVE_CONFIG_H
  19. # include "config.h"
  20. #endif
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <unistd.h>
  24. #include <sys/utsname.h>
  25. /* Autoconf manual suggests this. */
  26. #if TIME_WITH_SYS_TIME
  27. # include <sys/time.h>
  28. # include <time.h>
  29. #else
  30. # if HAVE_SYS_TIME_H
  31. #  include <sys/time.h>
  32. # else
  33. #  include <time.h>
  34. # endif
  35. #endif
  36. #include "email.h"
  37. #include "utils.h"
  38. #include "sig_file.h"
  39. #include "error.h"
  40. /**
  41.  * will print the digital time of day in
  42.  * file 'app'.  If localtime() (or gmtime()) fails at all, a default buffer
  43.  * will be applied of 00:00:00 so that this function doesn't fail
  44. **/
  45. static void
  46. appendTime(dstrbuf *app)
  47. {
  48. time_t tim;
  49. struct tm *lt;
  50. char tempbuf[MAXBUF] = { 0 };
  51. tim = time(NULL);
  52. #ifdef USE_GMT
  53. lt = gmtime(&tim);
  54. #else
  55. lt = localtime(&tim);
  56. #endif
  57. if (lt == NULL) {
  58. snprintf(tempbuf, MAXBUF - 1, "00:00:00");
  59. } else {
  60. strftime(tempbuf, MAXBUF - 1, "%I:%M:%S %p", lt);
  61. }
  62. dsbPrintf(app, "%s", tempbuf);
  63. }
  64. /**
  65.  * will print the digital date of the month and year
  66.  * in the file 'app'.  If localtime() fails (or gmtime()), it will apply a default
  67.  * value of "00/00/00" so that this function does not fail.
  68. **/
  69. static void
  70. appendDate(dstrbuf *app)
  71. {
  72. time_t tim;
  73. struct tm *lt;
  74. char tempbuf[MAXBUF] = { 0 };
  75. tim = time(NULL);
  76. #ifdef USE_GMT
  77. lt = gmtime(&tim);
  78. #else
  79. lt = localtime(&tim);
  80. #endif
  81. if (lt == NULL) {
  82. snprintf(tempbuf, MAXBUF - 1, "00/00/00");
  83. } else {
  84. strftime(tempbuf, MAXBUF - 1, "%m/%d/%Y", lt);
  85. }
  86. dsbPrintf(app, "%s", tempbuf);
  87. }
  88. /**
  89.  * will print the strftime version that is similar to
  90.  * ctime() in the file 'app'.  If localtime() fails (or gmtime()), ctime() will be called
  91.  * in it's place.  If ctime() fails, a standard format of "Unspecified Date"
  92.  * will be placed in the file.  This function will not fail.
  93. **/
  94. static void
  95. appendCtime(dstrbuf *app)
  96. {
  97. time_t tim;
  98. struct tm *lt;
  99. char *ctimeval = NULL;
  100. char tempbuf[MAXBUF] = { 0 };
  101. tim = time(NULL);
  102. #ifdef USE_GMT
  103. lt = gmtime(&tim);
  104. #else
  105. lt = localtime(&tim);
  106. #endif
  107. if (lt == NULL) {
  108. ctimeval = ctime(&tim);
  109. if (!ctimeval) {
  110. snprintf(tempbuf, MAXBUF - 1, "Unspecified Date");
  111. } else {
  112. snprintf(tempbuf, MAXBUF - 1, "%s", ctimeval);
  113. }
  114. } else {
  115. #ifdef USE_GNU_STRFTIME
  116. strftime(tempbuf, MAXBUF - 1, "%a, %d %b %Y %H:%M:%S %z", lt);
  117. #else /* I don't believe anyone but glibc does the smaller %z */
  118. strftime(tempbuf, MAXBUF - 1, "%a, %d %b %Y %H:%M:%S %Z", lt);
  119. #endif
  120. }
  121. dsbPrintf(app, "%s", tempbuf);
  122. }
  123. /**
  124.  * will print the information from uname() in
  125.  * the file 'app'.  If uname() fails, a default value of "Unspecified Host"
  126.  * will be appended to the file.  This function will not fail
  127. **/
  128. static void
  129. appendHostinfo(dstrbuf *app)
  130. {
  131. struct utsname sys;
  132. if (uname(&sys) < 0) {
  133. dsbPrintf(app, "Unspecified Host");
  134. } else {
  135. dsbPrintf(app, "%s %s %s", sys.sysname, sys.release, sys.machine);
  136. }
  137. }
  138. /**
  139.  * will open the /usr/games/fortune command
  140.  * I will attempt to call putenv() to set IFS to a safe environment
  141.  * setting.  You should have putenv() or configure would have failed
  142. **/
  143. static void
  144. appendFortune(dstrbuf *app)
  145. {
  146. FILE *fortune;
  147. char tempbuf[MAXBUF] = { 0 };
  148. /* set IFS and PATH environment variable for security reasons */
  149. putenv("IFS=' '");
  150. putenv("PATH='/usr/bin:/usr/local/bin:/usr/games'");
  151. if (!(fortune = popen("/usr/games/fortune", "r"))) {
  152. warning("Could not exectute /usr/games/fortune");
  153. dsbPrintf(app, "Unspecified Fortune");
  154. return;
  155. }
  156. /*
  157.  * if we didn't return early from a failure to call
  158.  * then we should get the output from the fortune command
  159.  * and append it.
  160.  */
  161. while (fgets(tempbuf, sizeof(tempbuf), fortune) != NULL) {
  162. dsbPrintf(app, tempbuf);
  163. }
  164. pclose(fortune);
  165. }
  166. /**
  167.  * AppendSig will append the signature file and take into 
  168.  * account the wildcards allowed to be specified and transform 
  169.  * them to the correct modules.
  170. **/
  171. int
  172. appendSig(dstrbuf *app, const char *sigfile)
  173. {
  174. FILE *sig;
  175. int next_char;
  176. if (!(sig = fopen(sigfile, "r"))) {
  177. warning("Could not open signature file");
  178. return ERROR;
  179. }
  180. /* Loop through signature file pulling out the contents and fixing wildcards */
  181. while ((next_char = fgetc(sig)) != EOF) {
  182. if (next_char == '%') {
  183. switch ((next_char = fgetc(sig))) {
  184. case 't':
  185. appendTime(app);
  186. break;
  187. case 'd':
  188. appendDate(app);
  189. break;
  190. case 'v':
  191. dsbPrintf(app, "%s", EMAIL_VERSION);
  192. break;
  193. case 'c':
  194. appendCtime(app);
  195. break;
  196. case 'h':
  197. appendHostinfo(app);
  198. break;
  199. case 'f':
  200. appendFortune(app);
  201. break;
  202. default:
  203. dsbCatChar(app, next_char);
  204. break;
  205. }
  206. } else {
  207. dsbCatChar(app, next_char);
  208. }
  209. }
  210. if (ferror(sig)) {
  211. fclose(sig);
  212. return ERROR;
  213. }
  214. /* We have to append <BR> to our sig divider for HTML */
  215. if (Mopts.html) {
  216. dsbPrintf(app, "<BR>n");
  217. }
  218. fclose(sig);
  219. return SUCCESS;
  220. }