Imported from ../bash-2.05b.tar.gz.
[platform/upstream/bash.git] / mailcheck.c
index d90e52f..5cc2fc2 100644 (file)
@@ -1,12 +1,12 @@
 /* mailcheck.c -- The check is in the mail... */
 
-/* Copyright (C) 1987,1989 Free Software Foundation, Inc.
+/* Copyright (C) 1987-2002 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
 Bash is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 1, or (at your option) any later
+Software Foundation; either version 2, or (at your option) any later
 version.
 
 Bash is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -16,35 +16,35 @@ for more details.
 
 You should have received a copy of the GNU General Public License along
 with Bash; see the file COPYING.  If not, write to the Free Software
-Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
 
 #include "config.h"
 
 #include <stdio.h>
 #include "bashtypes.h"
 #include "posixstat.h"
-#include <sys/param.h>
+#ifndef _MINIX
+#  include <sys/param.h>
+#endif
 #if defined (HAVE_UNISTD_H)
 #  include <unistd.h>
 #endif
+#include "posixtime.h"
 #include "bashansi.h"
 
 #include "shell.h"
-#include "maxpath.h"
 #include "execute_cmd.h"
 #include "mailcheck.h"
 #include <tilde/tilde.h>
 
-#ifndef NOW
-#define NOW ((time_t)time ((time_t *)0))
-#endif
+extern int mailstat __P((const char *, struct stat *));
 
 typedef struct {
   char *name;
   char *msg;
   time_t access_time;
   time_t mod_time;
-  long file_size;
+  off_t file_size;
 } FILEINFO;
 
 /* The list of remembered mail files. */
@@ -54,34 +54,34 @@ static FILEINFO **mailfiles = (FILEINFO **)NULL;
 static int mailfiles_count;
 
 /* The last known time that mail was checked. */
-static int last_time_mail_checked;
+static time_t last_time_mail_checked;
 
 /* Non-zero means warn if a mail file has been read since last checked. */
 int mail_warning;
 
+static int find_mail_file __P((char *));
+static void update_mail_file __P((int));
+static int add_mail_file __P((char *, char *));
+
+static int file_mod_date_changed __P((int));
+static int file_access_date_changed __P((int));
+static int file_has_grown __P((int));
+
+static char *parse_mailpath_spec __P((char *));
+
 /* Returns non-zero if it is time to check mail. */
 int
 time_to_check_mail ()
 {
   char *temp;
   time_t now;
-  long seconds;
+  intmax_t seconds;
 
   temp = get_string_value ("MAILCHECK");
-  seconds = -1L;
-
-  /* Skip leading whitespace in MAILCHECK. */
-  if (temp)
-    {
-      while (whitespace (*temp))
-       temp++;
-
-      seconds = atoi (temp);
-    }
 
   /* Negative number, or non-numbers (such as empty string) cause no
      checking to take place. */
-  if (seconds < 0)
+  if (temp == 0 || legal_number (temp, &seconds) == 0 || seconds < 0)
     return (0);
 
   now = NOW;
@@ -117,7 +117,7 @@ find_mail_file (file)
   do \
     { \
       mailfiles[i]->access_time = mailfiles[i]->mod_time = 0; \
-      mailfiles[i]->file_size = 0L; \
+      mailfiles[i]->file_size = 0; \
     } \
   while (0)
 
@@ -129,7 +129,7 @@ update_mail_file (i)
   struct stat finfo;
 
   file = mailfiles[i]->name;
-  if (stat (file, &finfo) == 0)
+  if (mailstat (file, &finfo) == 0)
     {
       mailfiles[i]->access_time = finfo.st_atime;
       mailfiles[i]->mod_time = finfo.st_mtime;
@@ -153,11 +153,11 @@ add_mail_file (file, msg)
   i = find_mail_file (filename);
   if (i >= 0)
     {
-      if (stat (filename, &finfo) == 0)
+      if (mailstat (filename, &finfo) == 0)
        {
          mailfiles[i]->mod_time = finfo.st_mtime;
          mailfiles[i]->access_time = finfo.st_atime;
-         mailfiles[i]->file_size = (long)finfo.st_size;
+         mailfiles[i]->file_size = finfo.st_size;
        }
       free (filename);
       return i;
@@ -219,7 +219,7 @@ file_mod_date_changed (i)
   file = mailfiles[i]->name;
   mtime = mailfiles[i]->mod_time;
 
-  if ((stat (file, &finfo) == 0) && (finfo.st_size > 0))
+  if ((mailstat (file, &finfo) == 0) && (finfo.st_size > 0))
     return (mtime != finfo.st_mtime);
 
   return (0);
@@ -237,7 +237,7 @@ file_access_date_changed (i)
   file = mailfiles[i]->name;
   atime = mailfiles[i]->access_time;
 
-  if ((stat (file, &finfo) == 0) && (finfo.st_size > 0))
+  if ((mailstat (file, &finfo) == 0) && (finfo.st_size > 0))
     return (atime != finfo.st_atime);
 
   return (0);
@@ -248,14 +248,14 @@ static int
 file_has_grown (i)
      int i;
 {
-  long size;
+  off_t size;
   struct stat finfo;
   char *file;
 
   file = mailfiles[i]->name;
   size = mailfiles[i]->file_size;
 
-  return ((stat (file, &finfo) == 0) && (finfo.st_size > size));
+  return ((mailstat (file, &finfo) == 0) && (finfo.st_size > size));
 }
 
 /* Take an element from $MAILPATH and return the portion from
@@ -281,7 +281,7 @@ parse_mailpath_spec (str)
          continue;
        }
       if (*s == '?' || *s == '%')
-        return s;
+       return s;
     }
   return ((char *)NULL);
 }
@@ -291,7 +291,8 @@ make_default_mailpath ()
 {
   char *mp;
 
-  mp = xmalloc (2 + sizeof (DEFAULT_MAIL_DIRECTORY) + strlen (current_user.user_name));
+  get_current_user_info ();
+  mp = (char *)xmalloc (2 + sizeof (DEFAULT_MAIL_DIRECTORY) + strlen (current_user.user_name));
   strcpy (mp, DEFAULT_MAIL_DIRECTORY);
   mp[sizeof(DEFAULT_MAIL_DIRECTORY) - 1] = '/';
   strcpy (mp + sizeof (DEFAULT_MAIL_DIRECTORY), current_user.user_name);
@@ -353,7 +354,6 @@ check_mail ()
   char *current_mail_file, *message;
   int i, use_user_notification;
   char *dollar_underscore, *temp;
-  WORD_LIST *tlist;
 
   dollar_underscore = get_string_value ("_");
   if (dollar_underscore)
@@ -390,7 +390,7 @@ check_mail ()
             the access time to be equal to the modification time when
             the mail in the file is manipulated, check the size also.  If
             the file has not grown, continue. */
-         if ((atime >= mtime) && !file_is_bigger)
+         if ((atime >= mtime) || !file_is_bigger)
            continue;
 
          /* If the mod time is later than the access time and the file
@@ -400,12 +400,10 @@ check_mail ()
 #undef atime
 #undef mtime
 
-         if ((tlist = expand_string (message, Q_DOUBLE_QUOTES)))
+         if (temp = expand_string_to_string (message, Q_DOUBLE_QUOTES))
            {
-             temp = string_list (tlist);
              puts (temp);
              free (temp);
-             dispose_words (tlist);
            }
          else
            putchar ('\n');