Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
John McEleney
/
mailutils
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
Commit
a436f9a9
...
a436f9a9257f92e5b51c8a3224f9c48685ec4963
authored
2002-02-05 15:01:07 +0000
by
Sergey Poznyakoff
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
Use argp_parse instead of getopt_long.
1 parent
582b1b6a
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
213 additions
and
335 deletions
comsat/comsat.c
imap4d/imap4d.c
mail.local/main.c
pop3d/pop3d.c
comsat/comsat.c
View file @
a436f9a
...
...
@@ -47,22 +47,26 @@ typedef struct utmp UTMP;
#define MAX_TTY_SIZE (sizeof (PATH_TTY_PFX) + sizeof (((UTMP*)0)->ut_line))
static
char
short_options
[]
=
"c:dhim:p:t:v"
;
static
struct
option
long_options
[]
=
const
char
*
argp_program_version
=
"comsatd ("
PACKAGE
") "
VERSION
;
const
char
*
argp_program_bug_address
=
"<bug-mailutils@gnu.org>"
;
static
char
doc
[]
=
"GNU comsatd"
;
static
struct
argp_option
options
[]
=
{
{
"config"
,
required_argument
,
0
,
'c'
},
{
"daemon"
,
no_argument
,
0
,
'd'
},
{
"help"
,
no_argument
,
0
,
'h'
},
{
"inetd"
,
no_argument
,
0
,
'i'
},
{
"maildir"
,
required_argument
,
0
,
'm'
},
{
"port"
,
required_argument
,
0
,
'p'
},
{
"timeout"
,
required_argument
,
0
,
't'
},
{
"version"
,
no_argument
,
0
,
'v'
},
{
0
,
0
,
0
,
0
}
{
"config"
,
'c'
,
"FILE"
,
0
,
"Read configuration from FILE"
,
0
},
{
NULL
,
0
,
NULL
,
0
,
NULL
,
0
}
};
#define MODE_INETD 0
#define MODE_DAEMON 1
static
error_t
comsatd_parse_opt
(
int
key
,
char
*
arg
,
struct
argp_state
*
state
);
static
struct
argp
argp
=
{
options
,
comsatd_parse_opt
,
NULL
,
doc
,
mu_daemon_argp_child
,
NULL
,
NULL
};
#define SUCCESS 0
#define NOT_HERE 1
...
...
@@ -72,13 +76,16 @@ static struct option long_options[] =
# define MAXHOSTNAMELEN 64
#endif
int
mode
=
MODE_INETD
;
int
port
=
512
;
/* Default biff port */
int
timeout
=
0
;
struct
daemon_param
daemon_param
=
{
MODE_INTERACTIVE
,
/* Start in interactive (inetd) mode */
20
,
/* Default maximum number of children.
Currently unused */
512
,
/* Default biff port */
0
,
/* Default timeout */
};
int
maxlines
=
5
;
char
hostname
[
MAXHOSTNAMELEN
];
const
char
*
username
;
const
char
*
maildir
=
MU_PATH_MAILDIR
;
static
void
comsat_init
(
void
);
static
void
comsat_daemon_init
(
void
);
...
...
@@ -92,55 +99,35 @@ static void change_user (const char *user);
static
int
xargc
;
static
char
**
xargv
;
char
*
config_file
=
NULL
;
in
t
main
(
int
argc
,
char
**
argv
)
static
error_
t
comsatd_parse_opt
(
int
key
,
char
*
arg
,
struct
argp_state
*
state
)
{
int
c
;
char
*
config_file
=
NULL
;
while
((
c
=
getopt_long
(
argc
,
argv
,
short_options
,
long_options
,
NULL
))
!=
-
1
)
switch
(
key
)
{
switch
(
c
)
{
case
'c'
:
config_file
=
optarg
;
break
;
case
'd'
:
mode
=
MODE_DAEMON
;
case
ARGP_KEY_INIT
:
state
->
child_inputs
[
0
]
=
state
->
input
;
break
;
case
'h'
:
help
();
/*NOTREACHED*/
case
'i'
:
mode
=
MODE_INETD
;
break
;
case
'm'
:
maildir
=
optarg
;
case
'c'
:
config_file
=
arg
;
break
;
case
'p'
:
port
=
strtoul
(
optarg
,
NULL
,
10
);
break
;
default:
return
ARGP_ERR_UNKNOWN
;
}
return
0
;
}
case
't'
:
timeout
=
strtoul
(
optarg
,
NULL
,
10
);
break
;
case
'v'
:
printf
(
IMPL
" ("
PACKAGE
" "
VERSION
")
\n
"
);
exit
(
EXIT_SUCCESS
);
break
;
int
main
(
int
argc
,
char
**
argv
)
{
int
c
;
default:
exit
(
EXIT_FAILURE
);
}
}
mu_create_argcv
(
argc
,
argv
,
&
argc
,
&
argv
);
argp_parse
(
&
argp
,
argc
,
argv
,
0
,
0
,
&
daemon_param
);
maildir
=
mu_normalize_maildir
(
maildir
);
if
(
!
maildir
)
...
...
@@ -149,7 +136,7 @@ main(int argc, char **argv)
exit
(
1
);
}
if
(
timeout
>
0
&&
mode
==
MODE_DAEMON
)
if
(
daemon_param
.
timeout
>
0
&&
daemon_param
.
mode
==
MODE_DAEMON
)
{
fprintf
(
stderr
,
"--timeout and --daemon are incompatible
\n
"
);
exit
(
EXIT_FAILURE
);
...
...
@@ -157,7 +144,7 @@ main(int argc, char **argv)
comsat_init
();
if
(
mode
==
MODE_DAEMON
)
if
(
daemon_param
.
mode
==
MODE_DAEMON
)
{
/* Preserve invocation arguments */
xargc
=
argc
;
...
...
@@ -174,8 +161,8 @@ main(int argc, char **argv)
chdir
(
"/"
);
if
(
mode
==
MODE_DAEMON
)
comsat_daemon
(
port
);
if
(
daemon_param
.
mode
==
MODE_DAEMON
)
comsat_daemon
(
daemon_param
.
port
);
else
c
=
comsat_main
(
0
);
...
...
imap4d/imap4d.c
View file @
a436f9a
...
...
@@ -16,112 +16,87 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "imap4d.h"
#ifdef HAVE_MYSQL
# include "../MySql/MySql.h"
#endif
FILE
*
ofile
;
unsigned
int
timeout
=
1800
;
/* RFC2060: 30 minutes, if enable. */
mailbox_t
mbox
;
char
*
homedir
;
char
*
maildir
=
MU_PATH_MAILDIR
;
int
state
=
STATE_NONAUTH
;
struct
daemon_param
daemon_param
=
{
MODE_INTERACTIVE
,
/* Start in interactive (inetd) mode */
20
,
/* Default maximum number of children */
143
,
/* Standard IMAP4 port */
1800
/* RFC2060: 30 minutes. */
};
/* Number of child processes. */
volatile
size_t
children
;
static
struct
option
long_options
[]
=
const
char
*
argp_program_version
=
"imap4d ("
PACKAGE
") "
VERSION
;
const
char
*
argp_program_bug_address
=
"<bug-mailutils@gnu.org>"
;
static
char
doc
[]
=
"GNU imap4d -- the IMAP4D daemon"
;
static
struct
argp_option
options
[]
=
{
{
"daemon"
,
optional_argument
,
0
,
'd'
},
{
"help"
,
no_argument
,
0
,
'h'
},
{
"inetd"
,
no_argument
,
0
,
'i'
},
{
"maildir"
,
required_argument
,
0
,
'm'
},
{
"port"
,
required_argument
,
0
,
'p'
},
{
"other-namespace"
,
required_argument
,
0
,
'O'
},
{
"shared-namespace"
,
required_argument
,
0
,
'S'
},
{
"timeout"
,
required_argument
,
0
,
't'
},
{
"version"
,
no_argument
,
0
,
'v'
},
{
0
,
0
,
0
,
0
}
{
"other-namespace"
,
'O'
,
"PATHLIST"
,
0
,
"set the `other' namespace"
,
0
},
{
"shared-namespace"
,
'S'
,
"PATHLIST"
,
0
,
"set the `shared' namespace"
,
0
},
{
NULL
,
0
,
NULL
,
0
,
NULL
,
0
}
};
const
char
*
short_options
=
"d::him:p:t:vO:P:S:"
;
static
error_t
imap4d_parse_opt
(
int
key
,
char
*
arg
,
struct
argp_state
*
state
);
static
struct
argp
argp
=
{
options
,
imap4d_parse_opt
,
NULL
,
doc
,
mu_daemon_argp_child
,
NULL
,
NULL
};
static
int
imap4d_mainloop
__P
((
int
,
int
));
static
void
imap4d_daemon_init
__P
((
void
));
static
void
imap4d_daemon
__P
((
unsigned
int
,
unsigned
int
));
static
int
imap4d_mainloop
__P
((
int
,
int
));
static
void
imap4d_usage
__P
((
char
*
));
#ifndef DEFMAXCHILDREN
# define DEFMAXCHILDREN 20
/* Default maximum number of children */
#endif
int
main
(
int
argc
,
char
**
argv
)
static
error_t
imap4d_parse_opt
(
int
key
,
char
*
arg
,
struct
argp_state
*
state
)
{
struct
group
*
gr
;
static
int
mode
=
INTERACTIVE
;
size_t
maxchildren
=
DEFMAXCHILDREN
;
int
c
=
0
;
int
status
=
EXIT_SUCCESS
;
unsigned
int
port
;
port
=
143
;
/* Default IMAP4 port. */
timeout
=
1800
;
/* RFC2060: 30 minutes, if enable. */
state
=
STATE_NONAUTH
;
/* Starting state in non-auth. */
while
((
c
=
getopt_long
(
argc
,
argv
,
short_options
,
long_options
,
NULL
))
!=
-
1
)
{
switch
(
c
)
switch
(
key
)
{
case
'd'
:
mode
=
DAEMON
;
if
(
optarg
)
maxchildren
=
strtoul
(
optarg
,
NULL
,
10
);
if
(
maxchildren
==
0
)
maxchildren
=
DEFMAXCHILDREN
;
break
;
case
'h'
:
imap4d_usage
(
argv
[
0
]);
break
;
case
'i'
:
mode
=
INTERACTIVE
;
break
;
case
'm'
:
maildir
=
optarg
;
break
;
case
'p'
:
mode
=
DAEMON
;
port
=
strtoul
(
optarg
,
NULL
,
10
);
case
ARGP_KEY_INIT
:
state
->
child_inputs
[
0
]
=
state
->
input
;
break
;
case
'O'
:
set_namespace
(
NS_OTHER
,
opt
arg
);
set_namespace
(
NS_OTHER
,
arg
);
break
;
case
'S'
:
set_namespace
(
NS_SHARED
,
optarg
);
break
;
case
't'
:
timeout
=
strtoul
(
optarg
,
NULL
,
10
);
break
;
case
'v'
:
printf
(
"GNU imap4 daemon"
"("
PACKAGE
" "
VERSION
")
\n
"
);
exit
(
0
);
set_namespace
(
NS_SHARED
,
arg
);
break
;
default:
break
;
}
return
ARGP_ERR_UNKNOWN
;
}
return
0
;
}
int
main
(
int
argc
,
char
**
argv
)
{
struct
group
*
gr
;
int
status
=
EXIT_SUCCESS
;
state
=
STATE_NONAUTH
;
/* Starting state in non-auth. */
mu_create_argcv
(
argc
,
argv
,
&
argc
,
&
argv
);
argp_parse
(
&
argp
,
argc
,
argv
,
0
,
0
,
&
daemon_param
);
maildir
=
mu_normalize_maildir
(
maildir
);
if
(
!
maildir
)
...
...
@@ -172,7 +147,7 @@ main (int argc, char **argv)
/*signal (SIGPIPE, SIG_IGN); */
signal
(
SIGABRT
,
imap4d_signal
);
if
(
mode
==
DAEMON
)
if
(
daemon_param
.
mode
==
MODE_
DAEMON
)
imap4d_daemon_init
();
else
{
...
...
@@ -181,7 +156,7 @@ main (int argc, char **argv)
}
/* Set up for syslog. */
openlog
(
"gnu-imap4d"
,
LOG_PID
,
LOG_FACILITY
);
openlog
(
"gnu-imap4d"
,
LOG_PID
,
log_facility
);
/* Redirect any stdout error from the library to syslog, they
should not go to the client. */
...
...
@@ -190,8 +165,8 @@ main (int argc, char **argv)
umask
(
S_IROTH
|
S_IWOTH
|
S_IXOTH
);
/* 007 */
/* Actually run the daemon. */
if
(
mode
==
DAEMON
)
imap4d_daemon
(
maxchildren
,
port
);
if
(
daemon_param
.
mode
==
MODE_
DAEMON
)
imap4d_daemon
(
daemon_param
.
maxchildren
,
daemon_param
.
port
);
/* exit (0) -- no way out of daemon except a signal. */
else
status
=
imap4d_mainloop
(
fileno
(
stdin
),
fileno
(
stdout
));
...
...
@@ -353,30 +328,5 @@ imap4d_daemon (unsigned int maxchildren, unsigned int port)
}
}
/* Prints out usage information and exits the program */
static
void
imap4d_usage
(
char
*
argv0
)
{
printf
(
"Usage: %s [OPTIONS]
\n
"
,
argv0
);
printf
(
"Runs the GNU IMAP4 daemon.
\n\n
"
);
printf
(
" -d, --daemon[=MAXCHILDREN] runs in daemon mode with a maximum
\n
"
);
printf
(
" of MAXCHILDREN child processes
\n
"
);
printf
(
" MAXCHILDREN defaults to %d
\n
"
,
DEFMAXCHILDREN
);
printf
(
" -h, --help display this help and exit
\n
"
);
printf
(
" -i, --inetd runs in inetd mode (default)
\n
"
);
printf
(
" -p, --port=PORT specifies port to listen on, implies -d
\n
"
);
printf
(
" defaults to 143, which need not be specified
\n
"
);
printf
(
" -m, --maildir=PATH set path to the mailspool directory
\n
"
);
printf
(
" -O, --other-namespace=PATHLIST sets the `other' namespace
\n
"
);
printf
(
" -S, --shared-namespace=PATHLIST sets the `shared' namespace
\n
"
);
printf
(
" -t, --timeout=TIMEOUT sets idle timeout to TIMEOUT seconds
\n
"
);
printf
(
" TIMEOUT default is 1800 (30 minutes)
\n
"
);
printf
(
" -v, --version display version information and exit
\n
"
);
printf
(
"
\n
Report bugs to bug-mailutils@gnu.org
\n
"
);
exit
(
0
);
}
...
...
mail.local/main.c
View file @
a436f9a
...
...
@@ -22,7 +22,6 @@ int multiple_delivery;
int
ex_quota_tempfail
;
int
exit_code
=
EX_OK
;
uid_t
uid
;
char
*
maildir
=
MU_PATH_MAILDIR
;
char
*
quotadbname
=
NULL
;
int
lock_timeout
=
300
;
...
...
@@ -40,47 +39,72 @@ void guess_retval (int ec);
void
mailer_err
(
char
*
fmt
,
...);
void
notify_biff
(
mailbox_t
mbox
,
char
*
name
,
size_t
size
);
char
short_opts
[]
=
"hf:Llm:q:r:s:x::vW;"
;
static
struct
option
long_opts
[]
=
{
{
"ex-multiple-delivery-success"
,
no_argument
,
&
multiple_delivery
,
1
},
{
"ex-quota-tempfail"
,
no_argument
,
&
ex_quota_tempfail
,
1
},
{
"from"
,
required_argument
,
0
,
'f'
},
{
"help"
,
no_argument
,
0
,
'h'
},
{
"license"
,
no_argument
,
0
,
'L'
},
{
"maildir"
,
required_argument
,
0
,
'm'
},
{
"quota-db"
,
required_argument
,
0
,
'q'
},
{
"source"
,
required_argument
,
0
,
's'
},
{
"timeout"
,
required_argument
,
0
,
't'
},
{
"debug"
,
optional_argument
,
0
,
'x'
},
{
"version"
,
no_argument
,
0
,
'v'
},
{
0
,
0
,
0
,
0
}
};
const
char
*
argp_program_version
=
"mail.local ("
PACKAGE
") "
VERSION
;
const
char
*
argp_program_bug_address
=
"<bug-mailutils@gnu.org>"
;
static
char
doc
[]
=
"GNU mail.local -- the local MDA"
;
static
char
args_doc
[]
=
"recipient [recipient ...]"
;
#define ARG_MULTIPLE_DELIVERY 1
#define ARG_QUOTA_TEMPFAIL 2
int
main
(
int
argc
,
char
*
argv
[])
static
struct
argp_option
options
[]
=
{
int
c
;
FILE
*
fp
;
char
*
from
=
NULL
;
char
*
progfile_pattern
=
NULL
;
char
*
tempfile
=
NULL
;
{
"ex-multiple-delivery-success"
,
ARG_MULTIPLE_DELIVERY
,
NULL
,
0
,
"Don't return errors when delivering to multiple recipients"
,
0
},
{
"ex-quota-tempfail"
,
ARG_QUOTA_TEMPFAIL
,
NULL
,
0
,
"Return temporary failure if disk or mailbox quota is exceeded"
,
0
},
{
"from"
,
'f'
,
"EMAIL"
,
0
,
"Specify the sender's name"
},
{
NULL
,
'r'
,
NULL
,
OPTION_ALIAS
,
NULL
},
#ifdef USE_DBM
{
"quota-db"
,
'q'
,
"FILE"
,
0
,
"Specify path to quota database"
,
0
},
#endif
#ifdef WITH_GUILE
{
"source"
,
's'
,
"PATTERN"
,
0
,
"Set name pattern for user-defined mail filters"
,
0
},
#endif
{
"debug"
,
'x'
,
#ifdef WITH_GUILE
"{NUMBER|guile}"
,
#else
"NUMBER"
,
#endif
0
,
"Enable debugging"
,
0
},
{
"timeout"
,
't'
,
"NUMBER"
,
0
,
"Set timeout for acquiring the lockfile"
},
/* Preparative work: close inherited fds, force a reasonable umask
and prepare a logging. */
close_fds
();
umask
(
0077
);
{
NULL
,
0
,
NULL
,
0
,
NULL
,
0
}
};
openlog
(
"mail.local"
,
LOG_PID
,
LOG_FACILITY
);
mu_error_set_print
(
mu_syslog_error_printer
);
static
error_t
parse_opt
(
int
key
,
char
*
arg
,
struct
argp_state
*
state
);
uid
=
getuid
();
while
((
c
=
getopt_long
(
argc
,
argv
,
short_opts
,
long_opts
,
NULL
))
!=
EOF
)
switch
(
c
)
static
struct
argp
argp
=
{
options
,
parse_opt
,
args_doc
,
doc
,
mu_common_argp_child
,
NULL
,
NULL
};
char
*
from
=
NULL
;
char
*
progfile_pattern
=
NULL
;
static
error_t
parse_opt
(
int
key
,
char
*
arg
,
struct
argp_state
*
state
)
{
switch
(
key
)
{
case
0
:
/* option already handled */
case
ARG_MULTIPLE_DELIVERY
:
multiple_delivery
=
1
;
break
;
case
ARG_QUOTA_TEMPFAIL
:
ex_quota_tempfail
=
1
;
break
;
case
'r'
:
case
'f'
:
if
(
from
!=
NULL
)
...
...
@@ -88,24 +112,12 @@ main (int argc, char *argv[])
mu_error
(
"multiple --from options"
);
return
EX_USAGE
;
}
from
=
optarg
;
break
;
case
'h'
:
print_help
();
break
;
case
'L'
:
print_license
();
break
;
case
'm'
:
maildir
=
optarg
;
from
=
arg
;
break
;
#ifdef USE_DBM
case
'q'
:
quotadbname
=
opt
arg
;
quotadbname
=
arg
;
break
;
#endif
...
...
@@ -138,16 +150,37 @@ main (int argc, char *argv[])
}
break
;
case
'v'
:
print_version
();
break
;
default:
return
EX_USAGE
;
return
ARGP_ERR_UNKNOWN
;
case
ARGP_KEY_ERROR
:
exit
(
EX_USAGE
);
}
return
0
;
}
argc
-=
optind
;
argv
+=
optind
;
int
main
(
int
argc
,
char
*
argv
[])
{
FILE
*
fp
;
char
*
tempfile
=
NULL
;
int
arg_index
;
/* Preparative work: close inherited fds, force a reasonable umask
and prepare a logging. */
close_fds
();
umask
(
0077
);
mu_create_argcv
(
argc
,
argv
,
&
argc
,
&
argv
);
argp_parse
(
&
argp
,
argc
,
argv
,
0
,
&
arg_index
,
NULL
);
openlog
(
"mail.local"
,
LOG_PID
,
log_facility
);
mu_error_set_print
(
mu_syslog_error_printer
);
uid
=
getuid
();
argc
-=
arg_index
;
argv
+=
arg_index
;
if
(
!
argc
)
print_help
();
...
...
@@ -729,31 +762,5 @@ static char help_message[] =
exit
(
0
);
}
void
print_license
()
{
static
char
license_text
[]
=
" This program is free software; you can redistribute it and/or modify
\n
"
" it under the terms of the GNU General Public License as published by
\n
"
" the Free Software Foundation; either version 2, or (at your option)
\n
"
" any later version.
\n
"
"
\n
"
" This program is distributed in the hope that it will be useful,
\n
"
" but WITHOUT ANY WARRANTY; without even the implied warranty of
\n
"
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\n
"
" GNU General Public License for more details.
\n
"
"
\n
"
" You should have received a copy of the GNU General Public License
\n
"
" along with this program; if not, write to the Free Software
\n
"
" Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
\n
"
;
printf
(
"%s"
,
license_text
);
exit
(
0
);
}
void
print_version
()
{
printf
(
"mail.local ("
PACKAGE
" "
VERSION
")
\n
"
);
exit
(
0
);
}
...
...
pop3d/pop3d.c
View file @
a436f9a
...
...
@@ -22,95 +22,49 @@
#endif
mailbox_t
mbox
;
unsigned
int
timeout
;
int
state
;
char
*
username
;
char
*
maildir
=
MU_PATH_MAILDIR
;
FILE
*
ifile
;
FILE
*
ofile
;
char
*
md5shared
;
/* Number of child processes. */
volatile
size_t
children
;
static
struct
option
long_options
[]
=
{
{
"daemon"
,
optional_argument
,
0
,
'd'
},
{
"help"
,
no_argument
,
0
,
'h'
},
{
"inetd"
,
no_argument
,
0
,
'i'
},
{
"maildir"
,
required_argument
,
0
,
'm'
},
{
"port"
,
required_argument
,
0
,
'p'
},
{
"timeout"
,
required_argument
,
0
,
't'
},
{
"version"
,
no_argument
,
0
,
'v'
},
{
0
,
0
,
0
,
0
}
struct
daemon_param
daemon_param
=
{
MODE_INTERACTIVE
,
/* Start in interactive (inetd) mode */
20
,
/* Default maximum number of children */
110
,
/* Standard POP3 port */
600
/* Idle timeout */
};
const
char
*
short_options
=
"d::him:p:t:v"
;
/* Number of child processes. */
volatile
size_t
children
;
static
int
pop3d_mainloop
__P
((
int
,
int
));
static
void
pop3d_daemon_init
__P
((
void
));
static
void
pop3d_daemon
__P
((
unsigned
int
,
unsigned
int
));
static
void
pop3d_usage
__P
((
char
*
));
#ifndef DEFMAXCHILDREN
# define DEFMAXCHILDREN 10
/* Default maximum number of children */
#endif
const
char
*
argp_program_version
=
"pop3d ("
PACKAGE
") "
VERSION
;
const
char
*
argp_program_bug_address
=
"<bug-mailutils@gnu.org>"
;
static
char
doc
[]
=
"GNU pop3d -- the POP3 daemon"
;
static
struct
argp
argp
=
{
NULL
,
NULL
,
NULL
,
doc
,
mu_daemon_argp_child
,
NULL
,
NULL
};
int
main
(
int
argc
,
char
**
argv
)
{
struct
group
*
gr
;
static
int
mode
=
INTERACTIVE
;
size_t
maxchildren
=
DEFMAXCHILDREN
;
int
c
=
0
;
int
status
=
OK
;
unsigned
int
port
;
port
=
110
;
/* Default POP3 port. */
timeout
=
600
;
/* Default timeout of 600. */
while
((
c
=
getopt_long
(
argc
,
argv
,
short_options
,
long_options
,
NULL
))
!=
-
1
)
{
switch
(
c
)
{
case
'd'
:
mode
=
DAEMON
;
if
(
optarg
)
maxchildren
=
strtoul
(
optarg
,
NULL
,
10
);
if
(
maxchildren
==
0
)
maxchildren
=
DEFMAXCHILDREN
;
break
;
case
'h'
:
pop3d_usage
(
argv
[
0
]);
break
;
case
'i'
:
mode
=
INTERACTIVE
;
break
;
case
'm'
:
maildir
=
optarg
;
break
;
case
'p'
:
mode
=
DAEMON
;
port
=
strtoul
(
optarg
,
NULL
,
10
);
break
;
case
't'
:
timeout
=
strtoul
(
optarg
,
NULL
,
10
);
break
;
case
'v'
:
printf
(
IMPL
" ("
PACKAGE
" "
VERSION
")
\n
"
);
exit
(
EXIT_SUCCESS
);
break
;
default:
break
;
}
}
mu_create_argcv
(
argc
,
argv
,
&
argc
,
&
argv
);
argp_parse
(
&
argp
,
argc
,
argv
,
0
,
0
,
&
daemon_param
);
maildir
=
mu_normalize_maildir
(
maildir
);
if
(
!
maildir
)
...
...
@@ -162,7 +116,7 @@ main (int argc, char **argv)
signal
(
SIGPIPE
,
pop3d_signal
);
signal
(
SIGABRT
,
pop3d_signal
);
if
(
mode
==
DAEMON
)
if
(
daemon_param
.
mode
==
MODE_
DAEMON
)
pop3d_daemon_init
();
else
{
...
...
@@ -171,7 +125,7 @@ main (int argc, char **argv)
}
/* Set up for syslog. */
openlog
(
"gnu-pop3d"
,
LOG_PID
,
LOG_FACILITY
);
openlog
(
"gnu-pop3d"
,
LOG_PID
,
log_facility
);
/* Redirect any stdout error from the library to syslog, they
should not go to the client. */
mu_error_set_print
(
mu_syslog_error_printer
);
...
...
@@ -179,8 +133,8 @@ main (int argc, char **argv)
umask
(
S_IROTH
|
S_IWOTH
|
S_IXOTH
);
/* 007 */
/* Actually run the daemon. */
if
(
mode
==
DAEMON
)
pop3d_daemon
(
maxchildren
,
port
);
if
(
daemon_param
.
mode
==
MODE_
DAEMON
)
pop3d_daemon
(
daemon_param
.
maxchildren
,
daemon_param
.
port
);
/* exit (EXIT_SUCCESS) -- no way out of daemon except a signal. */
else
status
=
pop3d_mainloop
(
fileno
(
stdin
),
fileno
(
stdout
));
...
...
@@ -451,26 +405,6 @@ pop3d_daemon (unsigned int maxchildren, unsigned int port)
}
}
/* Prints out usage information and exits the program */
static
void
pop3d_usage
(
char
*
argv0
)
{
printf
(
"Usage: %s [OPTIONS]
\n
"
,
argv0
);
printf
(
"Runs the GNU POP3 daemon.
\n\n
"
);
printf
(
" -d, --daemon=MAXCHILDREN runs in daemon mode with a maximum
\n
"
);
printf
(
" of MAXCHILDREN child processes
\n
"
);
printf
(
" -h, --help display this help and exit
\n
"
);
printf
(
" -i, --inetd runs in inetd mode (default)
\n
"
);
printf
(
" -m, --maildir=PATH sets path to the mailspool directory
\n
"
);
printf
(
" -p, --port=PORT specifies port to listen on, implies -d
\n
"
);
printf
(
" defaults to 110, which need not be specified
\n
"
);
printf
(
" -t, --timeout=TIMEOUT sets idle timeout to TIMEOUT seconds
\n
"
);
printf
(
" TIMEOUT default is 600 (10 minutes)
\n
"
);
printf
(
" -v, --version display version information and exit
\n
"
);
printf
(
"
\n
Report bugs to bug-mailutils@gnu.org
\n
"
);
exit
(
EXIT_SUCCESS
);
}
...
...
Please
register
or
sign in
to post a comment