diff -crB a/CHANGES b/CHANGES
*** a/CHANGES 1999-01-02 16:15:03.000000000 +1300
--- b/CHANGES 2011-01-27 09:56:40.202300708 +1300
***************
*** 1,4 ****
--- 1,15 ----
+ Changes to QuickPage from v3.3 to v3.3.1-unleash
+ ------------------------------------------------
+ Patch by Michael Fincham <michael@unleash.co.nz>
+ - The new "-b" option has been added to specify a bind address
+ for the qpage daemon.
+
+ - The default user the daemon runs as is now "qpage" instead
+ of "nobody".
+
+ - To be honest, the "-b" option doesn't sanitise input very well
+ so don't setuid root the qpage binary or anything dumb like that.
Changes to QuickPage from v3.2 to v3.3
---------------------------------------
diff -crB a/qpage.c b/qpage.c
*** a/qpage.c 1999-05-09 09:47:23.000000000 +1200
--- b/qpage.c 2011-01-21 14:50:55.995162759 +1300
***************
*** 17,22 ****
--- 17,23 ----
static char sccsid[] = "@(#)qpage.c 3.36 07/26/98 tomiii@qpage.org";
#endif
char *ConfigFile = NULL;
+ char *BindAddress = NULL;
int Debug = 0;
int Interactive = FALSE;
int Silent = FALSE;
***************
*** 29,35 ****
do_version(void)
{
printf("\n");
! printf("QuickPage v%s, Copyright 1995-98 by Thomas Dwyer III\n",
VERSION);
printf("\n");
}
--- 30,36 ----
do_version(void)
{
printf("\n");
! printf("QuickPage v%s, Copyright 1995-98 by Thomas Dwyer III. Modified for Unleash by Michael Fincham <michael@unleash.co.nz>.\n",
VERSION);
printf("\n");
}
***************
*** 46,51 ****
--- 47,55 ----
printf("\n");
printf("Options:\n");
printf(" -a [+]hhmm send the page at the specified time\n");
+ #ifndef CLIENT_ONLY
+ printf(" -b address bind only to this address (default: 0.0.0.0)\n");
+ #endif
printf(" -c coverage coverage area (service name) for pager\n");
printf(" -C config use an alternate configuration file\n");
printf(" -d debug mode\n");
***************
*** 339,345 ****
(void)memset((char *)&p, 0, sizeof(p));
! while ((c = getopt(argc, argv, "a:c:C:df:hil:mp:P:q:Qs:t:v")) != -1) {
switch (c) {
case 'a':
case 't':
--- 343,349 ----
(void)memset((char *)&p, 0, sizeof(p));
! while ((c = getopt(argc, argv, "a:b:c:C:df:hil:mp:P:q:Qs:t:v")) != -1) {
switch (c) {
case 'a':
case 't':
***************
*** 353,358 ****
--- 357,367 ----
needpager = TRUE;
break;
+ #ifndef CLIENT_ONLY
+ case 'b':
+ BindAddress = strdup(optarg);
+ break;
+ #endif
case 'c':
my_free(coverage);
coverage = strdup(optarg);
***************
*** 503,509 ****
if (optind < argc)
port = atoi(argv[optind]);
! (void)become_daemon(sleeptime, port);
/* NOT REACHED */
return(-1);
--- 512,518 ----
if (optind < argc)
port = atoi(argv[optind]);
! (void)become_daemon(sleeptime, port, BindAddress);
/* NOT REACHED */
return(-1);
diff -crB a/qpage.h b/qpage.h
*** a/qpage.h 1998-10-26 08:55:02.000000000 +1300
--- b/qpage.h 2011-01-21 14:51:22.682302352 +1300
***************
*** 26,32 ****
#define fprintf (void)fprintf
#endif
! #define VERSION "3.3"
#define COMMENTS_ANYWHERE
#ifndef QPAGE_CONFIG
--- 26,32 ----
#define fprintf (void)fprintf
#endif
! #define VERSION "3.3.1-unleash"
#define COMMENTS_ANYWHERE
#ifndef QPAGE_CONFIG
***************
*** 51,57 ****
#endif
#ifndef DAEMON_USER
! #define DAEMON_USER "nobody"
#endif
#define SNPP_SVC_NAME "snpp"
--- 51,57 ----
#endif
#ifndef DAEMON_USER
! #define DAEMON_USER "qpage"
#endif
#define SNPP_SVC_NAME "snpp"
***************
*** 278,284 ****
extern void qpage_log(int pri, char *fmt, ...);
extern time_t snpptime(char *arg);
extern time_t parse_time(char *str);
! extern int become_daemon(int sleeptime, short port);
extern int submit_page(PAGE *p, char *server);
extern int lock_file(int fd, int mode, int block);
extern int lock_queue(void);
--- 278,284 ----
extern void qpage_log(int pri, char *fmt, ...);
extern time_t snpptime(char *arg);
extern time_t parse_time(char *str);
! extern int become_daemon(int sleeptime, short port, char *BindAddress);
extern int submit_page(PAGE *p, char *server);
extern int lock_file(int fd, int mode, int block);
extern int lock_queue(void);
diff -crB a/qpage.man b/qpage.man
*** a/qpage.man 1999-05-09 10:07:31.000000000 +1200
--- b/qpage.man 2011-01-27 09:51:44.894302942 +1300
***************
*** 34,39 ****
--- 34,42 ----
] [
.BI \-C " config
]
+ ] [
+ .BI \-b " address
+ ]
.BI \-q " interval
.SH DESCRIPTION
.B QuickPage
***************
*** 91,96 ****
--- 94,104 ----
century. Otherwise assume the specified time is in the current
century.
.TP
+ .BI \-b
+ Specify an address for the qpage daemon to bind to. The default is
+ to bind to INETADDR_ANY and listen on all interfaces (the old
+ behaviour)
+ .TP
.BI \-c
Use a different coverage area or paging service. This option is
only useful if the recipient has more than one pager and/or more
diff -crB a/srvrsnpp.c b/srvrsnpp.c
*** a/srvrsnpp.c 1998-10-26 08:55:05.000000000 +1300
--- b/srvrsnpp.c 2011-01-21 14:49:17.647300794 +1300
***************
*** 1156,1162 ****
** -1 on error, otherwise never
*/
int
! become_daemon(int sleeptime, short port)
{
struct sockaddr_in addr;
struct servent *svc;
--- 1156,1162 ----
** -1 on error, otherwise never
*/
int
! become_daemon(int sleeptime, short port, char *BindAddress)
{
struct sockaddr_in addr;
struct servent *svc;
***************
*** 1221,1227 ****
len = sizeof(on);
(void)setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&on, len);
! addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_family = AF_INET;
addr.sin_port = port;
--- 1221,1227 ----
len = sizeof(on);
(void)setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&on, len);
! addr.sin_addr.s_addr = BindAddress != NULL ? inet_addr(BindAddress) : INADDR_ANY;
addr.sin_family = AF_INET;
addr.sin_port = port;