commit-mailutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU Mailutils branch, master, updated. release-2.2-643-gb8dc129


From: Sergey Poznyakoff
Subject: [SCM] GNU Mailutils branch, master, updated. release-2.2-643-gb8dc129
Date: Sat, 30 Mar 2013 08:09:12 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Mailutils".

http://git.savannah.gnu.org/cgit/mailutils.git/commit/?id=b8dc1293e299380a32992baa98a773282354d459

The branch, master has been updated
       via  b8dc1293e299380a32992baa98a773282354d459 (commit)
      from  9b2c81921aa7c32542db310c819586f81f0ed082 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit b8dc1293e299380a32992baa98a773282354d459
Author: Sergey Poznyakoff <address@hidden>
Date:   Sat Mar 30 10:08:52 2013 +0200

    Implement msgchk
    
    * mh/msgchk.c: New file.
    * mh/Makefile.am: Build msgchk.
    * mh/mh_getopt.h: Update.
    * mh/.gitignore: Update.
    * mh/TODO: Update.

-----------------------------------------------------------------------

Summary of changes:
 mh/.gitignore  |    1 +
 mh/Makefile.am |    1 +
 mh/TODO        |    4 +-
 mh/mh_getopt.h |    7 +-
 mh/msgchk.c    |  396 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 407 insertions(+), 2 deletions(-)
 create mode 100644 mh/msgchk.c

diff --git a/mh/.gitignore b/mh/.gitignore
index 0d106bb..1b897e3 100644
--- a/mh/.gitignore
+++ b/mh/.gitignore
@@ -23,6 +23,7 @@ mhn
 mhseq
 mhparam
 mhpath
+msgchk
 pick
 pick-gram.c
 pick-gram.h
diff --git a/mh/Makefile.am b/mh/Makefile.am
index a4c430f..9b05c4f 100644
--- a/mh/Makefile.am
+++ b/mh/Makefile.am
@@ -34,6 +34,7 @@ bin_PROGRAMS = \
  mhparam\
  mhpath\
  mhseq\
+ msgchk\
  pick\
  prompter\
  refile\
diff --git a/mh/TODO b/mh/TODO
index 7156390..6620fab 100644
--- a/mh/TODO
+++ b/mh/TODO
@@ -41,6 +41,7 @@ State Nice    Utility         Comments
 +      10      whatnow         
 +      20      sortm
 +       20      prompter
+*       20      msgchk          --date functionality not implemented
 
 Utilities In Alphabetical Order
 ===============================
@@ -55,6 +56,7 @@ mark
 mhl
 mhn
 mhpath
+msgchk
 pick
 prompter
 refile
@@ -68,4 +70,4 @@ whom
 
 Individual TODOs
 ================
-* Add support for RFC 2231 to mhn
\ No newline at end of file
+* Add support for RFC 2231 to mhn
diff --git a/mh/mh_getopt.h b/mh/mh_getopt.h
index a0fb7c8..a46ddb2 100644
--- a/mh/mh_getopt.h
+++ b/mh/mh_getopt.h
@@ -46,6 +46,7 @@ enum mh_arg {
   ARG_ALL,             
   ARG_AND,             
   ARG_ANNOTATE,                
+  ARG_APOP,
   ARG_AUDIT,           
   ARG_AUTO,            
   ARG_BEFORE,          
@@ -83,6 +84,7 @@ enum mh_arg {
   ARG_FROM,            
   ARG_GROUP,              
   ARG_HEADER,          
+  ARG_HOST,
   ARG_INPLACE,         
   ARG_INTERACTIVE,     
   ARG_LBRACE,          
@@ -95,6 +97,7 @@ enum mh_arg {
   ARG_MOVETO,
   ARG_MSGID,           
   ARG_NOALIAS,            
+  ARG_NOAPOP,
   ARG_NOAUDIT,         
   ARG_NOAUTO,          
   ARG_NOBELL,          
@@ -114,13 +117,14 @@ enum mh_arg {
   ARG_NOFORWARD,               
   ARG_NOHEADER,                
   ARG_NOHEADERS,               
-  ARG_NOINTERACTIVE,      
   ARG_NOINPLACE,               
+  ARG_NOINTERACTIVE,      
   ARG_NOLIMIT,         
   ARG_NOLIST,          
   ARG_NOMIME,          
   ARG_NOMOREPROC,              
   ARG_NOMSGID,         
+  ARG_NONOTIFY,
   ARG_NOPAUSE,         
   ARG_NOPUBLIC,                
   ARG_NOPUSH,          
@@ -134,6 +138,7 @@ enum mh_arg {
   ARG_NOSTORE,         
   ARG_NOT,             
   ARG_NOTEXTFIELD,     
+  ARG_NOTIFY,
   ARG_NOTOTAL,         
   ARG_NOTRUNCATE,              
   ARG_NOUSE,           
diff --git a/mh/msgchk.c b/mh/msgchk.c
new file mode 100644
index 0000000..36f40ea
--- /dev/null
+++ b/mh/msgchk.c
@@ -0,0 +1,396 @@
+/* GNU Mailutils -- a suite of utilities for electronic mail
+   Copyright (C) 2013 Free Software Foundation, Inc.
+
+   GNU Mailutils 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 3, or (at your option)
+   any later version.
+
+   GNU Mailutils is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GNU Mailutils.  If not, see <http://www.gnu.org/licenses/>. */
+
+#include "mh.h"
+#include "mailutils/kwd.h"
+#include "mailutils/folder.h"
+#include "mailutils/auth.h"
+#include <pwd.h>
+
+static char doc[] = N_("GNU MH msgchk")"\v"
+N_("Use -help to obtain the list of traditional MH options.");
+static char args_doc[] = N_("USER [USER...]");
+
+/* GNU options */
+static struct argp_option options[] = {
+  {"date",         ARG_DATE,    N_("BOOL"), OPTION_ARG_OPTIONAL,
+   N_("print out the last date mail was read") },
+  {"nodate",       ARG_NODATE,  NULL, OPTION_HIDDEN,
+   N_("don't print out the last date mail was read") },
+  {"notify",       ARG_NOTIFY, "all|mail|nomail", 0,
+   N_("produce a message upon these events") },
+  {"nonotify",     ARG_NONOTIFY, "all|mail|nomail", 0,
+   N_("disable notification") },
+  {"host",         ARG_HOST,     N_("URL"), 0,
+   N_("check mail on this host or URL") },
+  {"user",         ARG_USER,     N_("NAME"), 0,
+   N_("set user name for remote mailbox access") },
+  {"apop",         ARG_APOP,    N_("BOOL"), OPTION_ARG_OPTIONAL,
+   N_("enable APOP") },
+  {"noapop",       ARG_NOAPOP,  NULL, OPTION_HIDDEN,
+   N_("disable APOP") },
+  {NULL}
+};
+
+/* Traditional MH options */
+struct mh_option mh_option[] = {
+  { "date", MH_OPT_BOOL },
+  { "notify", MH_OPT_ARG, "all|mail|nomail" },
+  { "nonotify", MH_OPT_ARG, "all|mail|nomail" },
+  { "host", MH_OPT_ARG, "host-or-url" },
+  { "user", MH_OPT_ARG, "name" },
+  { "apop", MH_OPT_BOOL },
+  { NULL }
+};
+
+int date_option;
+int apop_option;
+char *remote_host;
+char *remote_user;
+
+#define NOTIFY_MAIL   0x1
+#define NOTIFY_NOMAIL 0x2
+#define NOTIFY_ALL    (NOTIFY_MAIL|NOTIFY_NOMAIL)
+
+int notify = NOTIFY_ALL;
+
+static struct mu_kwd notifytab[] = {
+  { "mail", NOTIFY_MAIL },
+  { "nomail", NOTIFY_NOMAIL },
+  { "all", NOTIFY_ALL },
+  { NULL }
+};
+
+static error_t
+opt_handler (int key, char *arg, struct argp_state *state)
+{
+  int n;
+  
+  switch (key)
+    {
+    case ARG_DATE:
+      date_option = is_true (arg);
+      break;
+      
+    case ARG_NODATE:
+      date_option = 0;
+      break;
+      
+    case ARG_APOP:
+      apop_option = is_true (arg);
+      break;
+      
+    case ARG_NOAPOP:
+      apop_option = 0;
+      break;
+      
+    case ARG_NOTIFY:
+      if (mu_kwd_xlat_name (notifytab, arg, &n))
+       argp_error (state, "unknown notify argument: %s", arg);
+      notify |= n;
+      break;
+      
+    case ARG_NONOTIFY:
+      if (mu_kwd_xlat_name (notifytab, arg, &n))
+       argp_error (state, "unknown notify argument: %s", arg);
+      notify &= ~n;
+      break;
+      
+    case ARG_USER:
+      remote_user = arg;
+      break;
+      
+    case ARG_HOST:
+      remote_host = arg;
+      break;
+      
+    default:
+      return ARGP_ERR_UNKNOWN;
+    }
+  return 0;
+}
+
+static char *
+attach_auth_ticket (mu_mailbox_t mbox)
+{
+  char *filename = NULL;
+  mu_folder_t folder = NULL;
+  mu_authority_t auth = NULL;
+
+  if (mu_mailbox_get_folder (mbox, &folder) == 0
+      && mu_folder_get_authority (folder, &auth) == 0
+      && auth)
+    {
+      mu_wicket_t wicket;
+      int rc;
+  
+      filename = mu_tilde_expansion (mu_ticket_file, MU_HIERARCHY_DELIMITER,
+                                    NULL);
+      mu_debug (MU_DEBCAT_MAILBOX, MU_DEBUG_TRACE1,
+               ("Reading user ticket file %s", filename));
+      
+      if ((rc = mu_file_wicket_create (&wicket, filename)) == 0)
+       {
+         mu_ticket_t ticket;
+      
+         if ((rc = mu_wicket_get_ticket (wicket, NULL, &ticket)) == 0)
+           {
+             rc = mu_authority_set_ticket (auth, ticket);
+             mu_debug (MU_DEBCAT_MAILBOX, MU_DEBUG_TRACE1,
+                       ("Retrieved and set ticket: %d", rc));
+           }
+         else
+           mu_debug (MU_DEBCAT_MAILBOX, MU_DEBUG_ERROR,
+                     ("Error retrieving ticket: %s\n",
+                      mu_strerror (rc)));
+         mu_wicket_destroy (&wicket);
+       }
+      else
+        mu_debug (MU_DEBCAT_MAILBOX, MU_DEBUG_ERROR,
+                 ("Error creating wicket: %s\n", mu_strerror (rc)));
+      if (rc)
+       {
+         free (filename);
+         filename = NULL;
+       }
+    }
+  return filename;
+}
+
+int
+checkmail (const char *username, int personal)
+{
+  int rc;
+  mu_url_t url;
+  mu_mailbox_t mbox;
+  size_t recent = 0, count = 0;
+  int status = 1;
+  int have_user;
+  
+  if (remote_host)
+    {
+      static mu_url_t pop_hint;
+
+      if (pop_hint)
+       {
+         rc = mu_url_create (&pop_hint, "pop://");
+         if (rc)
+           {
+             mu_error ("cannot create URL hint: %s", mu_strerror (rc));
+             exit (2);
+           }
+       }
+      
+      rc = mu_url_create_hint (&url, remote_host, MU_URL_PARSE_DEFAULT,
+                              pop_hint);
+      if (rc)
+       {
+         mu_diag_funcall (MU_DIAG_ERROR, "mu_url_create_hint", remote_host,
+                          rc);
+         exit (2);
+       }
+      
+      if (apop_option)
+       {
+         rc = mu_url_set_auth (url, "+APOP");
+         if (rc)
+           {
+             mu_diag_funcall (MU_DIAG_ERROR, "mu_url_set_auth", "+APOP", rc);
+             exit (2);
+           }
+       }
+    }
+  else
+    {
+      char *s;
+      rc = mu_construct_user_mailbox_url (&s, username);
+      if (rc)
+       {
+         mu_diag_funcall (MU_DIAG_ERROR, "mu_construct_user_mailbox_url",
+                          username, rc);
+         exit (2);
+       }
+      
+      rc = mu_url_create (&url, s);
+      if (rc)
+       {
+         mu_diag_funcall (MU_DIAG_ERROR, "mu_url_create", s, rc);
+         exit (2);
+       }
+      free (s);
+    }
+  
+  rc = mu_mailbox_create_from_url (&mbox, url);
+  if (rc)
+    {
+      mu_diag_funcall (MU_DIAG_ERROR, "mu_mailbox_create_from_url",
+                      mu_url_to_string (url), rc);
+      exit (2);
+    }
+
+  if (personal)
+    {
+      char *filename = attach_auth_ticket (mbox);
+
+      have_user = mu_url_has_flag (url, MU_URL_USER);
+      if (!have_user)
+       {
+         mu_url_t tickurl;
+
+         if (mu_wicket_file_match_url (filename, url, MU_URL_PARSE_ALL,
+                                       &tickurl) == 0)
+           {
+             have_user = mu_url_has_flag (tickurl, MU_URL_USER);
+             mu_url_destroy (&tickurl);
+           }
+       }
+      free (filename);
+    }
+  else
+    have_user = 0;
+
+  if (!have_user)
+    {
+      mu_url_t turl;
+
+      mu_mailbox_get_url (mbox, &turl);
+      rc = mu_url_set_user (turl, username);
+      if (rc)
+       {
+         mu_diag_funcall (MU_DIAG_ERROR, "mu_url_set_user", username, rc);
+         exit (2);
+       }
+    }
+  
+  rc = mu_mailbox_open (mbox, MU_STREAM_READ);
+  if (rc)
+    {
+      mu_diag_funcall (MU_DIAG_ERROR, "mu_mailbox_open",
+                      mu_url_to_string (url), rc);
+      exit (2);
+    }
+  
+  rc = mu_mailbox_messages_count (mbox, &count);
+  if (rc)
+    mu_diag_funcall (MU_DIAG_ERROR, "mu_mailbox_messages_count",
+                    mu_url_to_string (url), rc);
+  if (count)
+    {
+      status = 0;
+
+      if (notify & NOTIFY_MAIL)
+       {
+         mu_off_t mbsiz = 0;
+         
+         rc = mu_mailbox_messages_recent (mbox, &recent);
+         if (rc)
+           {
+             mu_diag_funcall (MU_DIAG_ERROR, "mu_mailbox_messages_recent",
+                              mu_url_to_string (url), rc);
+
+             mu_mailbox_get_size (mbox, &mbsiz);
+             if (personal)
+               mu_printf (ngettext ("You have %lu message",
+                                    "You have %lu messages",
+                                    count),
+                          (unsigned long) count);
+             else
+               mu_printf (ngettext ("%s has %lu message",
+                                    "%s has %lu messages",
+                                    count),
+                          username, (unsigned long) count);
+             mu_printf (ngettext (" (%lu byte)",
+                                  " (%lu bytes)",
+                                  mbsiz), (unsigned long) mbsiz);
+           }
+         else
+           {
+             if (personal)
+               mu_printf (recent ? _("You have new mail waiting") :
+                                   _("You have old mail waiting"));
+             else
+               mu_printf (recent ? _("%s has new mail waiting") :
+                                   _("%s has old mail waiting"), username);
+           }
+
+         if (date_option)
+           /*FIXME*/;
+             
+         mu_printf ("\n");
+       }
+    }
+  else
+    {
+      status = 1;
+
+      if (notify & NOTIFY_NOMAIL)
+       {
+         if (personal)
+           mu_printf (_("You don't have any mail waiting\n"));
+         else
+           mu_printf (_("%s doesn't have any mail waiting\n"),
+                      username);
+       }
+    }
+  mu_mailbox_destroy (&mbox);
+  
+  return status;
+}
+
+int
+main (int argc, char **argv)
+{
+  int index;
+  int rc = 0;
+  
+  MU_APP_INIT_NLS ();
+  
+  mh_argp_init ();
+  mh_argp_parse (&argc, &argv, 0, options, mh_option, args_doc, doc,
+                opt_handler, NULL, &index);
+
+  argc -= index;
+  argv += index;
+
+  if (argc == 0)
+    {
+      if (remote_user)
+       rc |= checkmail (remote_user, 1);
+      else
+       {
+         struct passwd *pw = getpwuid (getuid ());
+         if (!pw)
+           {
+             mu_error (_("cannot determine my username"));
+             return 2;
+           }
+         rc |= checkmail (pw->pw_name, 1);
+       }
+    }
+  else if (remote_user)
+    {
+      mu_error (_("no arguments are allowed when the -user option is given"));
+      return 2;
+    }
+  else
+    while (argc--)
+      rc |= checkmail (*argv++, 0);
+
+  return rc;
+}
+  
+
+


hooks/post-receive
-- 
GNU Mailutils



reply via email to

[Prev in Thread] Current Thread [Next in Thread]