aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/getmail
blob: eec5c6fbc135ee2539226611f34e49e75ad7cda4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#------------------------------------------------------------------------------
#
#               GetMail - Fetchmail Daemon Controlling Script
#
#             1999 by Thomas Nesges <ThomaNesges@TNT-Computer.de>
#
#------------------------------------------------------------------------------

#------------------------------------------------------------------------------
# GetMail starts/stops fetchmail in daemon mode and logs all actions to
# /var/log/fetchmail.log. Output is done by tailing the logfile.
#
# Sendmail/Fetchmail has to be installed, and your fetchmailrc has to be
# correctly configured. The option 'got' and 'goth' require a correctly
# installed GotMail. If you didn't install it in /usr/local/gotmail you 
# must change the path given.
#
# If you have any changes/corrections in the script, please send me email.
#------------------------------------------------------------------------------

#!/bin/sh

case "$1" in
  start)
   sendmail -q
   date +%d.%m.%Y\ %H:%M:%S\ fetchmail\ started >> /var/log/fetchmail.log
   fetchmail -d 1 -L /var/log/fetchmail.log &
   tail -f /var/log/fetchmail.log
   ;;
  stop)
   fetchmail -q
   date +%d.%m.%Y\ %H:%M:%S\ fetchmail\ stoped >> /var/log/fetchmail.log
   ;;
  fetch)
   date +%d.%m.%Y\ %H:%M:%S\ fetchmail\ started >> /var/log/fetchmail.log
   fetchmail -d 1 -L /var/log/fetchmail.log &
   tail -f /var/log/fetchmail.log
   ;;
  status)
   tail -f /var/log/fetchmail.log
   ;;
  got)
   /usr/local/gotmail/gotmail
   ;;
  goth)
   /usr/local/gotmail/gotmail html
   ;;
  send)
   /sendmail -q
   ;;
  clear)
   fetchmail -q
   rm /var/log/fetchmail.log
   ;;
  -v)
   echo 'getmail version: 0.0.1'
   ;;
  *)
   echo
   echo 'Usage: getmail option'
   echo
   echo 'options:'
   echo ' clear  - stops fetchmail and kills the logfile' 
   echo ' fetch  - starts fetchmail'
   echo ' got    - starts gotmail'
   echo ' goth   - starts gotmail html'
   echo ' send   - sends all mail from the mailqueue'
   echo ' status - tails the logfile'
   echo ' start  - starts fetchmail and tails the logfile'
   echo ' stop   - stops fetchmail'
   echo ' -v     - print the version number'
   echo	
esac
.sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/*
 * For license terms, see the file COPYING in this directory.
 */

/***********************************************************************
  module:       getpass.c
  project:      fetchmail
  programmer:   Carl Harris, ceharris@mal.com
  description: 	getpass() replacement which allows for long passwords.
                This version hacked by Wilfred Teiken, allowing the
                password to be piped to fetchmail.
 
 ***********************************************************************/

#include "config.h"

#include <stdio.h>
#include <signal.h>
#include <fcntl.h>
#if defined(HAVE_UNISTD_H)
#include <unistd.h>
#endif
#include "fetchmail.h"
#include "i18n.h"

#define INPUT_BUF_SIZE	PASSWORDLEN

#if defined(HAVE_TERMIOS_H) && defined(HAVE_TCSETATTR)
#  include <termios.h>
#else
#if defined(HAVE_TERMIO_H)
#  include <sys/ioctl.h>
#  include <termio.h>
#else
#if defined(HAVE_SGTTY_H)
#  include <sgtty.h>
#endif
#endif
#endif

static int ttyfd;

#if defined(HAVE_TCSETATTR)
  static struct termios termb;
  static tcflag_t flags;
#else
#if defined(HAVE_TERMIO_H)
  static struct termio termb;
  static unsigned short flags;
#else
#if defined(HAVE_STTY)
  static struct sgttyb ttyb;
  static int flags;
#endif
#endif
#endif

void static save_tty_state(void);
void static disable_tty_echo(void);
void static restore_tty_state(void);
static RETSIGTYPE sigint_handler(int);

char *getpassword(prompt)
char *prompt;
{
#if !(defined(HAVE_TCSETATTR) || defined(HAVE_TERMIO_H) || defined(HAVE_STTY))
#if defined(HAVE_GETPASS) 
    char *getpass();
    return getpass(prompt);
#else
    fputs(_("ERROR: no support for getpassword() routine\n"),stderr);
    exit(1);
#endif
#else
    register char *p;
    register int c;
    FILE *fi;
    static char pbuf[INPUT_BUF_SIZE];
    RETSIGTYPE (*sig)(int) = 0;	/* initialization pacifies -Wall */
    RETSIGTYPE sigint_handler(int);

    int istty = isatty(0);

    /* get the file descriptor for the actual input device if it's a tty */
    if (istty)
    {
	if ((fi = fdopen(open("/dev/tty", 2), "r")) == NULL)
	    fi = stdin;
	else
	    setbuf(fi, (char *)NULL);
    }
    else
	fi = stdin;

    /* store descriptor for the tty */
    ttyfd = fileno(fi);

    if (istty)
    {
	/* preserve tty state before turning off echo */
	save_tty_state();

	/* now that we have the current tty state, we can catch SIGINT and  
	   exit gracefully */
	sig = signal(SIGINT, sigint_handler);

	/* turn off echo on the tty */
	disable_tty_echo();

	/* display the prompt and get the input string */
	fprintf(stderr, "%s", prompt);
    }

    for (p = pbuf; (c = getc(fi))!='\n' && c!=EOF;)
    {
	if (p < &pbuf[INPUT_BUF_SIZE - 1])
	    *p++ = c;
    }
    *p = '\0';

    /* write a newline so cursor won't appear to hang */
    if (fi != stdin)
	fprintf(stderr, "\n");

    if (istty)
    {
	/* restore previous state of the tty */
	restore_tty_state();

	/* restore previous state of SIGINT */
	signal(SIGINT, sig);
    }
    if (fi != stdin)
	fclose(fi);

    return(pbuf);
#endif /* !(defined(HAVE_TCSETATTR) || ... */
}

static void save_tty_state (void)
{
#if defined(HAVE_TCSETATTR)
    tcgetattr(ttyfd, &termb);
    flags = termb.c_lflag;
#else
#if defined(HAVE_TERMIO_H)
    ioctl(ttyfd, TCGETA, (char *) &termb);
    flags = termb.c_lflag;
#else  /* we HAVE_STTY */
    gtty(ttyfd, &ttyb);
    flags = ttyb.sg_flags;
#endif
#endif
}

static void disable_tty_echo(void) 
{
    /* turn off echo on the tty */
#if defined(HAVE_TCSETATTR)
    termb.c_lflag &= ~ECHO;
    tcsetattr(ttyfd, TCSAFLUSH, &termb);
#else
#if defined(HAVE_TERMIO_H)
    termb.c_lflag &= ~ECHO;
    ioctl(ttyfd, TCSETA, (char *) &termb);
#else  /* we HAVE_STTY */
    ttyb.sg_flags &= ~ECHO;
    stty(ttyfd, &ttyb);
#endif
#endif
}

static void restore_tty_state(void)
{
    /* restore previous tty echo state */
#if defined(HAVE_TCSETATTR)
    termb.c_lflag = flags;
    tcsetattr(ttyfd, TCSAFLUSH, &termb);
#else
#if defined(HAVE_TERMIO_H)
    termb.c_lflag = flags;
    ioctl(ttyfd, TCSETA, (char *) &termb);
#else  /* we HAVE_STTY */
    ttyb.sg_flags = flags;
    stty(ttyfd, &ttyb);
#endif
#endif
}

static RETSIGTYPE sigint_handler(int signum)
{
    restore_tty_state();
    report(stderr, 1, 0, _("\nCaught signal... bailing out."));
}

/* getpass.c ends here */