blob: c04d0fe25f4f43b2a6c02db492e7e36b1f7e9467 [file] [log] [blame]
Jari Aalto726f6381996-08-26 18:22:31 +00001/* mailcheck.c -- The check is in the mail... */
2
Jari Aalto31859422009-01-12 13:36:28 +00003/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
Jari Aalto726f6381996-08-26 18:22:31 +00004
Jari Aalto31859422009-01-12 13:36:28 +00005 This file is part of GNU Bash, the Bourne Again SHell.
Jari Aalto726f6381996-08-26 18:22:31 +00006
Jari Aalto31859422009-01-12 13:36:28 +00007 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
Jari Aalto726f6381996-08-26 18:22:31 +000011
Jari Aalto31859422009-01-12 13:36:28 +000012 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
Jari Aalto726f6381996-08-26 18:22:31 +000016
Jari Aalto31859422009-01-12 13:36:28 +000017 You should have received a copy of the GNU General Public License
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
19*/
Jari Aalto726f6381996-08-26 18:22:31 +000020
Jari Aaltoccc6cda1996-12-23 17:02:34 +000021#include "config.h"
22
Jari Aalto726f6381996-08-26 18:22:31 +000023#include <stdio.h>
24#include "bashtypes.h"
25#include "posixstat.h"
Chet Rameyac50fba2014-02-26 09:36:43 -050026#if defined (HAVE_SYS_PARAM_H)
Jari Aaltocce855b1998-04-17 19:52:44 +000027# include <sys/param.h>
28#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +000029#if defined (HAVE_UNISTD_H)
30# include <unistd.h>
31#endif
Jari Aaltof73dda02001-11-13 17:56:06 +000032#include "posixtime.h"
Jari Aalto726f6381996-08-26 18:22:31 +000033#include "bashansi.h"
Jari Aaltob80f6442004-07-27 13:29:18 +000034#include "bashintl.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +000035
Jari Aalto726f6381996-08-26 18:22:31 +000036#include "shell.h"
Jari Aalto726f6381996-08-26 18:22:31 +000037#include "execute_cmd.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +000038#include "mailcheck.h"
Jari Aalto726f6381996-08-26 18:22:31 +000039#include <tilde/tilde.h>
40
Jari Aalto31859422009-01-12 13:36:28 +000041/* Values for flags word in struct _fileinfo */
42#define MBOX_INITIALIZED 0x01
43
44extern time_t shell_start_time;
45
Jari Aaltof73dda02001-11-13 17:56:06 +000046extern int mailstat __P((const char *, struct stat *));
Jari Aalto726f6381996-08-26 18:22:31 +000047
Jari Aalto31859422009-01-12 13:36:28 +000048typedef struct _fileinfo {
Jari Aalto726f6381996-08-26 18:22:31 +000049 char *name;
Jari Aaltoccc6cda1996-12-23 17:02:34 +000050 char *msg;
Jari Aalto726f6381996-08-26 18:22:31 +000051 time_t access_time;
52 time_t mod_time;
Jari Aaltocce855b1998-04-17 19:52:44 +000053 off_t file_size;
Jari Aalto31859422009-01-12 13:36:28 +000054 int flags;
Jari Aalto726f6381996-08-26 18:22:31 +000055} FILEINFO;
56
57/* The list of remembered mail files. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +000058static FILEINFO **mailfiles = (FILEINFO **)NULL;
Jari Aalto726f6381996-08-26 18:22:31 +000059
60/* Number of mail files that we have. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +000061static int mailfiles_count;
Jari Aalto726f6381996-08-26 18:22:31 +000062
63/* The last known time that mail was checked. */
Jari Aalto31859422009-01-12 13:36:28 +000064static time_t last_time_mail_checked = 0;
Jari Aaltoccc6cda1996-12-23 17:02:34 +000065
66/* Non-zero means warn if a mail file has been read since last checked. */
67int mail_warning;
Jari Aalto726f6381996-08-26 18:22:31 +000068
Jari Aaltof73dda02001-11-13 17:56:06 +000069static int find_mail_file __P((char *));
Jari Aalto31859422009-01-12 13:36:28 +000070static void init_mail_file __P((int));
Jari Aaltof73dda02001-11-13 17:56:06 +000071static void update_mail_file __P((int));
72static int add_mail_file __P((char *, char *));
73
Jari Aalto31859422009-01-12 13:36:28 +000074static FILEINFO *alloc_mail_file __P((char *, char *));
75static void dispose_mail_file __P((FILEINFO *));
76
Jari Aaltof73dda02001-11-13 17:56:06 +000077static int file_mod_date_changed __P((int));
78static int file_access_date_changed __P((int));
79static int file_has_grown __P((int));
80
81static char *parse_mailpath_spec __P((char *));
82
Jari Aalto726f6381996-08-26 18:22:31 +000083/* Returns non-zero if it is time to check mail. */
84int
85time_to_check_mail ()
86{
Jari Aaltoccc6cda1996-12-23 17:02:34 +000087 char *temp;
88 time_t now;
Jari Aalto7117c2d2002-07-17 14:10:11 +000089 intmax_t seconds;
Jari Aaltoccc6cda1996-12-23 17:02:34 +000090
91 temp = get_string_value ("MAILCHECK");
Jari Aalto726f6381996-08-26 18:22:31 +000092
93 /* Negative number, or non-numbers (such as empty string) cause no
94 checking to take place. */
Jari Aaltof73dda02001-11-13 17:56:06 +000095 if (temp == 0 || legal_number (temp, &seconds) == 0 || seconds < 0)
Jari Aalto726f6381996-08-26 18:22:31 +000096 return (0);
97
Jari Aaltoccc6cda1996-12-23 17:02:34 +000098 now = NOW;
Jari Aalto726f6381996-08-26 18:22:31 +000099 /* Time to check if MAILCHECK is explicitly set to zero, or if enough
100 time has passed since the last check. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000101 return (seconds == 0 || ((now - last_time_mail_checked) >= seconds));
Jari Aalto726f6381996-08-26 18:22:31 +0000102}
103
104/* Okay, we have checked the mail. Perhaps I should make this function
105 go away. */
106void
107reset_mail_timer ()
108{
109 last_time_mail_checked = NOW;
110}
111
112/* Locate a file in the list. Return index of
113 entry, or -1 if not found. */
114static int
115find_mail_file (file)
116 char *file;
117{
118 register int i;
119
120 for (i = 0; i < mailfiles_count; i++)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000121 if (STREQ (mailfiles[i]->name, file))
Jari Aalto726f6381996-08-26 18:22:31 +0000122 return i;
123
124 return -1;
125}
126
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000127#define RESET_MAIL_FILE(i) \
128 do \
129 { \
130 mailfiles[i]->access_time = mailfiles[i]->mod_time = 0; \
Jari Aaltocce855b1998-04-17 19:52:44 +0000131 mailfiles[i]->file_size = 0; \
Jari Aalto31859422009-01-12 13:36:28 +0000132 mailfiles[i]->flags = 0; \
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000133 } \
134 while (0)
135
Jari Aalto95732b42005-12-07 14:08:12 +0000136#define UPDATE_MAIL_FILE(i, finfo) \
137 do \
138 { \
139 mailfiles[i]->access_time = finfo.st_atime; \
140 mailfiles[i]->mod_time = finfo.st_mtime; \
141 mailfiles[i]->file_size = finfo.st_size; \
Jari Aalto31859422009-01-12 13:36:28 +0000142 mailfiles[i]->flags |= MBOX_INITIALIZED; \
Jari Aalto95732b42005-12-07 14:08:12 +0000143 } \
144 while (0)
145
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000146static void
Jari Aalto31859422009-01-12 13:36:28 +0000147init_mail_file (i)
148 int i;
149{
150 mailfiles[i]->access_time = mailfiles[i]->mod_time = last_time_mail_checked ? last_time_mail_checked : shell_start_time;
151 mailfiles[i]->file_size = 0;
152 mailfiles[i]->flags = 0;
153}
154
155static void
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000156update_mail_file (i)
157 int i;
158{
159 char *file;
160 struct stat finfo;
161
162 file = mailfiles[i]->name;
Jari Aaltof73dda02001-11-13 17:56:06 +0000163 if (mailstat (file, &finfo) == 0)
Jari Aalto95732b42005-12-07 14:08:12 +0000164 UPDATE_MAIL_FILE (i, finfo);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000165 else
166 RESET_MAIL_FILE (i);
167}
168
Jari Aalto726f6381996-08-26 18:22:31 +0000169/* Add this file to the list of remembered files and return its index
170 in the list of mail files. */
171static int
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000172add_mail_file (file, msg)
173 char *file, *msg;
Jari Aalto726f6381996-08-26 18:22:31 +0000174{
175 struct stat finfo;
176 char *filename;
177 int i;
178
179 filename = full_pathname (file);
Jari Aaltoe8ce7751997-09-22 20:22:27 +0000180 i = find_mail_file (filename);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000181 if (i >= 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000182 {
Jari Aaltof73dda02001-11-13 17:56:06 +0000183 if (mailstat (filename, &finfo) == 0)
Jari Aalto95732b42005-12-07 14:08:12 +0000184 UPDATE_MAIL_FILE (i, finfo);
185
Jari Aalto726f6381996-08-26 18:22:31 +0000186 free (filename);
187 return i;
188 }
189
190 i = mailfiles_count++;
191 mailfiles = (FILEINFO **)xrealloc
192 (mailfiles, mailfiles_count * sizeof (FILEINFO *));
193
Jari Aalto31859422009-01-12 13:36:28 +0000194 mailfiles[i] = alloc_mail_file (filename, msg);
195 init_mail_file (i);
196
Jari Aalto726f6381996-08-26 18:22:31 +0000197 return i;
198}
199
200/* Reset the existing mail files access and modification times to zero. */
201void
202reset_mail_files ()
203{
204 register int i;
205
206 for (i = 0; i < mailfiles_count; i++)
Jari Aalto95732b42005-12-07 14:08:12 +0000207 RESET_MAIL_FILE (i);
Jari Aalto726f6381996-08-26 18:22:31 +0000208}
209
Jari Aalto31859422009-01-12 13:36:28 +0000210static FILEINFO *
211alloc_mail_file (filename, msg)
212 char *filename, *msg;
213{
214 FILEINFO *mf;
215
216 mf = (FILEINFO *)xmalloc (sizeof (FILEINFO));
217 mf->name = filename;
218 mf->msg = msg ? savestring (msg) : (char *)NULL;
219 mf->flags = 0;
220
221 return mf;
222}
223
224static void
225dispose_mail_file (mf)
226 FILEINFO *mf;
227{
228 free (mf->name);
229 FREE (mf->msg);
230 free (mf);
231}
232
Jari Aalto726f6381996-08-26 18:22:31 +0000233/* Free the information that we have about the remembered mail files. */
234void
235free_mail_files ()
236{
237 register int i;
238
239 for (i = 0; i < mailfiles_count; i++)
Jari Aalto31859422009-01-12 13:36:28 +0000240 dispose_mail_file (mailfiles[i]);
Jari Aalto726f6381996-08-26 18:22:31 +0000241
242 if (mailfiles)
243 free (mailfiles);
244
245 mailfiles_count = 0;
246 mailfiles = (FILEINFO **)NULL;
247}
248
Jari Aalto31859422009-01-12 13:36:28 +0000249void
250init_mail_dates ()
251{
252 if (mailfiles == 0)
253 remember_mail_dates ();
254}
255
Jari Aalto726f6381996-08-26 18:22:31 +0000256/* Return non-zero if FILE's mod date has changed and it has not been
Jari Aalto95732b42005-12-07 14:08:12 +0000257 accessed since modified. If the size has dropped to zero, reset
258 the cached mail file info. */
Jari Aalto726f6381996-08-26 18:22:31 +0000259static int
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000260file_mod_date_changed (i)
261 int i;
Jari Aalto726f6381996-08-26 18:22:31 +0000262{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000263 time_t mtime;
Jari Aalto726f6381996-08-26 18:22:31 +0000264 struct stat finfo;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000265 char *file;
Jari Aalto726f6381996-08-26 18:22:31 +0000266
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000267 file = mailfiles[i]->name;
268 mtime = mailfiles[i]->mod_time;
Jari Aalto726f6381996-08-26 18:22:31 +0000269
Chet Rameyac50fba2014-02-26 09:36:43 -0500270 if (mailstat (file, &finfo) != 0)
271 return (0);
272
273 if (finfo.st_size > 0)
Chet Ramey00018032011-11-21 20:51:19 -0500274 return (mtime < finfo.st_mtime);
Jari Aalto726f6381996-08-26 18:22:31 +0000275
Jari Aalto95732b42005-12-07 14:08:12 +0000276 if (finfo.st_size == 0 && mailfiles[i]->file_size > 0)
277 UPDATE_MAIL_FILE (i, finfo);
278
Jari Aalto726f6381996-08-26 18:22:31 +0000279 return (0);
280}
281
282/* Return non-zero if FILE's access date has changed. */
283static int
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000284file_access_date_changed (i)
285 int i;
Jari Aalto726f6381996-08-26 18:22:31 +0000286{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000287 time_t atime;
Jari Aalto726f6381996-08-26 18:22:31 +0000288 struct stat finfo;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000289 char *file;
Jari Aalto726f6381996-08-26 18:22:31 +0000290
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000291 file = mailfiles[i]->name;
292 atime = mailfiles[i]->access_time;
Jari Aalto726f6381996-08-26 18:22:31 +0000293
Chet Rameyac50fba2014-02-26 09:36:43 -0500294 if (mailstat (file, &finfo) != 0)
295 return (0);
296
297 if (finfo.st_size > 0)
Chet Ramey00018032011-11-21 20:51:19 -0500298 return (atime < finfo.st_atime);
Jari Aalto726f6381996-08-26 18:22:31 +0000299
300 return (0);
301}
302
303/* Return non-zero if FILE's size has increased. */
304static int
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000305file_has_grown (i)
306 int i;
Jari Aalto726f6381996-08-26 18:22:31 +0000307{
Jari Aaltocce855b1998-04-17 19:52:44 +0000308 off_t size;
Jari Aalto726f6381996-08-26 18:22:31 +0000309 struct stat finfo;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000310 char *file;
Jari Aalto726f6381996-08-26 18:22:31 +0000311
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000312 file = mailfiles[i]->name;
313 size = mailfiles[i]->file_size;
Jari Aalto726f6381996-08-26 18:22:31 +0000314
Jari Aaltof73dda02001-11-13 17:56:06 +0000315 return ((mailstat (file, &finfo) == 0) && (finfo.st_size > size));
Jari Aalto726f6381996-08-26 18:22:31 +0000316}
317
Jari Aalto726f6381996-08-26 18:22:31 +0000318/* Take an element from $MAILPATH and return the portion from
319 the first unquoted `?' or `%' to the end of the string. This is the
320 message to be printed when the file contents change. */
321static char *
322parse_mailpath_spec (str)
323 char *str;
324{
325 char *s;
326 int pass_next;
327
328 for (s = str, pass_next = 0; s && *s; s++)
329 {
330 if (pass_next)
331 {
332 pass_next = 0;
333 continue;
334 }
335 if (*s == '\\')
336 {
337 pass_next++;
338 continue;
339 }
340 if (*s == '?' || *s == '%')
Jari Aalto28ef6c32001-04-06 19:14:31 +0000341 return s;
Jari Aalto726f6381996-08-26 18:22:31 +0000342 }
343 return ((char *)NULL);
344}
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000345
346char *
347make_default_mailpath ()
348{
Jari Aaltob80f6442004-07-27 13:29:18 +0000349#if defined (DEFAULT_MAIL_DIRECTORY)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000350 char *mp;
351
Jari Aaltocce855b1998-04-17 19:52:44 +0000352 get_current_user_info ();
Jari Aaltof73dda02001-11-13 17:56:06 +0000353 mp = (char *)xmalloc (2 + sizeof (DEFAULT_MAIL_DIRECTORY) + strlen (current_user.user_name));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000354 strcpy (mp, DEFAULT_MAIL_DIRECTORY);
Jari Aaltod166f041997-06-05 14:59:13 +0000355 mp[sizeof(DEFAULT_MAIL_DIRECTORY) - 1] = '/';
356 strcpy (mp + sizeof (DEFAULT_MAIL_DIRECTORY), current_user.user_name);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000357 return (mp);
Jari Aaltob80f6442004-07-27 13:29:18 +0000358#else
359 return ((char *)NULL);
360#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000361}
362
Jari Aalto726f6381996-08-26 18:22:31 +0000363/* Remember the dates of the files specified by MAILPATH, or if there is
364 no MAILPATH, by the file specified in MAIL. If neither exists, use a
365 default value, which we randomly concoct from using Unix. */
Jari Aalto31859422009-01-12 13:36:28 +0000366
Jari Aalto726f6381996-08-26 18:22:31 +0000367void
368remember_mail_dates ()
369{
370 char *mailpaths;
371 char *mailfile, *mp;
372 int i = 0;
373
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000374 mailpaths = get_string_value ("MAILPATH");
375
376 /* If no $MAILPATH, but $MAIL, use that as a single filename to check. */
377 if (mailpaths == 0 && (mailpaths = get_string_value ("MAIL")))
378 {
379 add_mail_file (mailpaths, (char *)NULL);
380 return;
381 }
382
383 if (mailpaths == 0)
384 {
385 mailpaths = make_default_mailpath ();
Jari Aaltob80f6442004-07-27 13:29:18 +0000386 if (mailpaths)
387 {
388 add_mail_file (mailpaths, (char *)NULL);
389 free (mailpaths);
390 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000391 return;
392 }
393
Jari Aalto726f6381996-08-26 18:22:31 +0000394 while (mailfile = extract_colon_unit (mailpaths, &i))
395 {
396 mp = parse_mailpath_spec (mailfile);
397 if (mp && *mp)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000398 *mp++ = '\0';
399 add_mail_file (mailfile, mp);
Jari Aalto726f6381996-08-26 18:22:31 +0000400 free (mailfile);
401 }
Jari Aalto726f6381996-08-26 18:22:31 +0000402}
403
404/* check_mail () is useful for more than just checking mail. Since it has
405 the paranoids dream ability of telling you when someone has read your
406 mail, it can just as easily be used to tell you when someones .profile
407 file has been read, thus letting one know when someone else has logged
408 in. Pretty good, huh? */
409
410/* Check for mail in some files. If the modification date of any
411 of the files in MAILPATH has changed since we last did a
412 remember_mail_dates () then mention that the user has mail.
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000413 Special hack: If the variable MAIL_WARNING is non-zero and the
Jari Aalto726f6381996-08-26 18:22:31 +0000414 mail file has been accessed since the last time we remembered, then
415 the message "The mail in <mailfile> has been read" is printed. */
416void
417check_mail ()
418{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000419 char *current_mail_file, *message;
420 int i, use_user_notification;
421 char *dollar_underscore, *temp;
Jari Aalto726f6381996-08-26 18:22:31 +0000422
423 dollar_underscore = get_string_value ("_");
Jari Aalto726f6381996-08-26 18:22:31 +0000424 if (dollar_underscore)
425 dollar_underscore = savestring (dollar_underscore);
426
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000427 for (i = 0; i < mailfiles_count; i++)
Jari Aalto726f6381996-08-26 18:22:31 +0000428 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000429 current_mail_file = mailfiles[i]->name;
Jari Aalto726f6381996-08-26 18:22:31 +0000430
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000431 if (*current_mail_file == '\0')
432 continue;
433
434 if (file_mod_date_changed (i))
Jari Aalto726f6381996-08-26 18:22:31 +0000435 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000436 int file_is_bigger;
Jari Aalto726f6381996-08-26 18:22:31 +0000437
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000438 use_user_notification = mailfiles[i]->msg != (char *)NULL;
Jari Aaltob80f6442004-07-27 13:29:18 +0000439 message = mailfiles[i]->msg ? mailfiles[i]->msg : _("You have mail in $_");
Jari Aalto726f6381996-08-26 18:22:31 +0000440
Jari Aalto95732b42005-12-07 14:08:12 +0000441 bind_variable ("_", current_mail_file, 0);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000442
Jari Aalto726f6381996-08-26 18:22:31 +0000443#define atime mailfiles[i]->access_time
444#define mtime mailfiles[i]->mod_time
445
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000446 /* Have to compute this before the call to update_mail_file, which
Jari Aalto726f6381996-08-26 18:22:31 +0000447 resets all the information. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000448 file_is_bigger = file_has_grown (i);
Jari Aalto726f6381996-08-26 18:22:31 +0000449
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000450 update_mail_file (i);
Jari Aalto726f6381996-08-26 18:22:31 +0000451
452 /* If the user has just run a program which manipulates the
453 mail file, then don't bother explaining that the mail
454 file has been manipulated. Since some systems don't change
455 the access time to be equal to the modification time when
456 the mail in the file is manipulated, check the size also. If
457 the file has not grown, continue. */
Jari Aaltob80f6442004-07-27 13:29:18 +0000458 if ((atime >= mtime) && !file_is_bigger)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000459 continue;
Jari Aalto726f6381996-08-26 18:22:31 +0000460
461 /* If the mod time is later than the access time and the file
462 has grown, note the fact that this is *new* mail. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000463 if (use_user_notification == 0 && (atime < mtime) && file_is_bigger)
Jari Aaltob80f6442004-07-27 13:29:18 +0000464 message = _("You have new mail in $_");
Jari Aalto726f6381996-08-26 18:22:31 +0000465#undef atime
466#undef mtime
467
Jari Aaltof73dda02001-11-13 17:56:06 +0000468 if (temp = expand_string_to_string (message, Q_DOUBLE_QUOTES))
Jari Aalto726f6381996-08-26 18:22:31 +0000469 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000470 puts (temp);
471 free (temp);
Jari Aalto726f6381996-08-26 18:22:31 +0000472 }
473 else
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000474 putchar ('\n');
Jari Aalto726f6381996-08-26 18:22:31 +0000475 }
476
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000477 if (mail_warning && file_access_date_changed (i))
Jari Aalto726f6381996-08-26 18:22:31 +0000478 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000479 update_mail_file (i);
Jari Aaltob80f6442004-07-27 13:29:18 +0000480 printf (_("The mail in %s has been read\n"), current_mail_file);
Jari Aalto726f6381996-08-26 18:22:31 +0000481 }
Jari Aalto726f6381996-08-26 18:22:31 +0000482 }
Jari Aalto726f6381996-08-26 18:22:31 +0000483
484 if (dollar_underscore)
485 {
Jari Aalto95732b42005-12-07 14:08:12 +0000486 bind_variable ("_", dollar_underscore, 0);
Jari Aalto726f6381996-08-26 18:22:31 +0000487 free (dollar_underscore);
488 }
489 else
490 unbind_variable ("_");
491}