Initial revision
This commit is contained in:
commit
f6b4fb7583
30
COPYRIGHT
Normal file
30
COPYRIGHT
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
This is the phoned distribution.
|
||||||
|
|
||||||
|
Copyright (C) 2005, Dan Ponte. All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
3. All advertising materials mentioning features or use of this software
|
||||||
|
must display the following acknowledgement:
|
||||||
|
This product includes software written by Dan Ponte and contributors.
|
||||||
|
4. Neither the name of the Dan Ponte nor the names of his contributors
|
||||||
|
may be used to endorse or promote products derived from this software
|
||||||
|
without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGE.
|
17
Makefile
Normal file
17
Makefile
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# main makefile...
|
||||||
|
# Oh My Fucking God, this is such a big, unportable mess. Oh well.
|
||||||
|
# BSD Make > *
|
||||||
|
APPS=cnd phoned
|
||||||
|
APPSUF=${APPS:S/$/_app/}
|
||||||
|
APPSCLEAN=${APPS:S/$/_cl/}
|
||||||
|
all: ${APPSUF}
|
||||||
|
${APPSUF}:
|
||||||
|
@cd ${@:S/_app$//} && make
|
||||||
|
clean: ${APPSCLEAN} ourclean
|
||||||
|
${APPSCLEAN}:
|
||||||
|
@cd ${@:S/_cl$//} && make clean
|
||||||
|
ourclean:
|
||||||
|
# rm -f .conf
|
||||||
|
#.conf:
|
||||||
|
# @perl -e 'require 5.0001; require Modem::fgetty' \
|
||||||
|
# || echo "Needs Modem::Vgetty and perl 5.0001 at least."
|
28
README
Normal file
28
README
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
+=======================================+
|
||||||
|
| phoned |
|
||||||
|
| (C)2005, Dan Ponte |
|
||||||
|
+=======================================+
|
||||||
|
This is the phoned distribution, version 0.1.
|
||||||
|
phoned is distributed under the license outlined in COPYRIGHT. Please read
|
||||||
|
it before use!
|
||||||
|
|
||||||
|
This is now a hybrid of the older cidserv distribution. I might go to CVS
|
||||||
|
some day.
|
||||||
|
|
||||||
|
To build, simply type 'make'. phoned was written for BSD make (just "make"
|
||||||
|
on regular BSD systems, "pmake" on many linux machines.) For further
|
||||||
|
installation instructions, please see doc/install_guide.txt.
|
||||||
|
|
||||||
|
You will find the following directories in this source archive:
|
||||||
|
|
||||||
|
cnd/ - Caller ID program
|
||||||
|
doc/ - misc. documentation
|
||||||
|
examples/ - example scripts
|
||||||
|
include/ - global include files
|
||||||
|
lib/ - API libraries
|
||||||
|
phonectl/ - command line client to phoned
|
||||||
|
phoned/ - main phone daemon written in C
|
||||||
|
xfone/ - Tcl/Tk interface to phoned
|
||||||
|
|
||||||
|
dcp1990@neptune.atopia.net - http://www.theamigan.net/phoned/index.html
|
||||||
|
vim:tw=76
|
12
cnd/Makefile
Normal file
12
cnd/Makefile
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# cnd Makefile
|
||||||
|
# (C)2005, Dan Ponte
|
||||||
|
include ../global.mk
|
||||||
|
# basic stuff. we append for a reason.
|
||||||
|
CPPFLAGS=-I../include
|
||||||
|
CFLAGS+=-g -Wall -W -ansi ${CPPFLAGS}
|
||||||
|
LDFLAGS=
|
||||||
|
# keep these up to date.
|
||||||
|
MAINBIN=cnd
|
||||||
|
SRCS=cnd.c
|
||||||
|
OBJS=cnd.o
|
||||||
|
include ../main.mk
|
115
cnd/cnd.c
Normal file
115
cnd/cnd.c
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* Caller ID Server mgetty support
|
||||||
|
* (C)2004, Dan Ponte
|
||||||
|
* Licensed under the BSD license, with advertising clause.
|
||||||
|
* Excerpted from the original cidserv distribution. Modified to work
|
||||||
|
* with phoned.
|
||||||
|
*/
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <libutil.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/select.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
|
#include <phoned.h>
|
||||||
|
|
||||||
|
#define VERSION "0.1"
|
||||||
|
#define ADDRS "/usr/local/etc/cidserv.conf"
|
||||||
|
int nhosts = 0;
|
||||||
|
char hosts[10][18];
|
||||||
|
static const char rcsid[] = "$Amigan: phoned/cnd/cnd.c,v 1.1 2005/06/01 00:37:22 dcp1990 Exp $";
|
||||||
|
void send_dgram(char* address, char* datar);
|
||||||
|
void load_addrs(const char* fl);
|
||||||
|
int parse_cid(char* tty, char* phone, char* name, int dist_r, char* called);
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
if(argc < 6) {
|
||||||
|
fprintf(stderr, "Needs 5 args:\n"
|
||||||
|
"<tty> <CallerID> <Name> <dist-ring-nr.> <Called Nr.>\n");
|
||||||
|
exit(-2);
|
||||||
|
}
|
||||||
|
load_addrs(ADDRS);
|
||||||
|
parse_cid(argv[1], argv[2], argv[3], atoi(argv[4]), argv[5]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int parse_cid(tty, phone, name, dist_r, called)
|
||||||
|
char* tty __unused;
|
||||||
|
char* phone;
|
||||||
|
char* name;
|
||||||
|
int dist_r __unused;
|
||||||
|
char* called __unused;
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
char msg[512];
|
||||||
|
char fdate[25];
|
||||||
|
time_t rnow;
|
||||||
|
struct tm *ctm;
|
||||||
|
memset(msg, 0, sizeof msg);
|
||||||
|
memset(fdate, 0, sizeof fdate);
|
||||||
|
rnow = time(NULL);
|
||||||
|
ctm = localtime(&rnow);
|
||||||
|
strftime(fdate, sizeof(fdate) * sizeof(char),
|
||||||
|
"%m%d:%H%M", ctm);
|
||||||
|
sprintf(msg, "%s:0:%s:%s", fdate, name, phone);
|
||||||
|
for(i = 0; i <= nhosts; i++) {
|
||||||
|
send_dgram(hosts[i], msg);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
void send_dgram(char* address, char* datar)
|
||||||
|
{
|
||||||
|
char msg[212];
|
||||||
|
int s;
|
||||||
|
int on = 1;
|
||||||
|
struct sockaddr_in sin;
|
||||||
|
if(strlen(address) < 3) return;
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("send_dgram(%s) %p\n", address, address);
|
||||||
|
#endif
|
||||||
|
strcpy(msg, datar);
|
||||||
|
s = socket(PF_INET, SOCK_DGRAM, 0);
|
||||||
|
bzero(&sin, sizeof sin);
|
||||||
|
sin.sin_family = AF_INET;
|
||||||
|
sin.sin_addr.s_addr = inet_addr(address);
|
||||||
|
sin.sin_port = htons(3890);
|
||||||
|
if(setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*) &on, sizeof(on)) < 0) {
|
||||||
|
perror("setsockopt");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
if (connect(s, (struct sockaddr *)&sin, sizeof sin) < 0) {
|
||||||
|
perror("connect");
|
||||||
|
close(s);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
write(s, msg, strlen(msg) + 1);
|
||||||
|
close(s);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
void load_addrs(const char* fl)
|
||||||
|
{
|
||||||
|
FILE* tfl;
|
||||||
|
char fbuf[128];
|
||||||
|
if(!(tfl = fopen(fl, "r"))) {
|
||||||
|
perror("fopen");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
while(!feof(tfl)) {
|
||||||
|
fgets(fbuf, 126, tfl);
|
||||||
|
if(fbuf[strlen(fbuf)] == '\n') fbuf[strlen(fbuf)] = 0;
|
||||||
|
if(strlen(fbuf) > 4 && fbuf[0] != '#') strcpy(hosts[nhosts++], fbuf);
|
||||||
|
memset(fbuf, 0, sizeof fbuf);
|
||||||
|
}
|
||||||
|
fclose(tfl);
|
||||||
|
}
|
51
doc/install_guide.txt
Normal file
51
doc/install_guide.txt
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
**************************************************************************
|
||||||
|
** phoned installation guide -- it's good **
|
||||||
|
** (C)2005, Dan Ponte **
|
||||||
|
**************************************************************************
|
||||||
|
1.0 Introduction
|
||||||
|
phoned is [supposed to be] a powerful phone answering system, much like
|
||||||
|
VOCP. However, it is more-client-server based.
|
||||||
|
Its power stems from the use of vgetty, part of the mgetty+sendfax
|
||||||
|
distribution. It is available at:
|
||||||
|
http://alpha.greenie.net/mgetty/
|
||||||
|
mgetty+sendfax is also available under FreeBSD ports as comms/mgetty+sendfax/.
|
||||||
|
I will not cover the installation and configuration of mgetty/vgetty here.
|
||||||
|
There are many good docs on the process.
|
||||||
|
|
||||||
|
The phoned distribution consists of the following:
|
||||||
|
*phoned - the main daemon responsible for logging stuff and talking to
|
||||||
|
clients
|
||||||
|
*phonecall - a Perl script called by vgetty when it answers the phone,
|
||||||
|
responsible for talking to phoned and telling vgetty what to do (play sound
|
||||||
|
files, interpret menu options, etc)
|
||||||
|
*xfone - a Tcl/Tk application for checking messages and administering
|
||||||
|
mailboxes
|
||||||
|
*cnd - called by vgetty when the phone rings to tell phoned to log the call,
|
||||||
|
alert network users and either reject or accept the call based on the
|
||||||
|
caller. (based on a tiny bit of code from my old cidserv application, it is
|
||||||
|
compatible with its clients.)
|
||||||
|
|
||||||
|
2.0 Requirements
|
||||||
|
In order to use the base phoned and phonecall, you must have at least the
|
||||||
|
following:
|
||||||
|
*A Unix system capable of running perl, vgetty, and using sockets
|
||||||
|
(tested on FreeBSD) (the phoned suite will NOT run on windows. Get a
|
||||||
|
better OS. It might run on OSX.)
|
||||||
|
*Perl (tested on 5.8.6)
|
||||||
|
*The Modem::Vgetty Perl module, available from CPAN
|
||||||
|
*A properly installed and configured vgetty
|
||||||
|
*A voice modem supported by vgetty. Tested with the Diamond SupraExpress 56i
|
||||||
|
Sp (Rockwell chipset/driver)
|
||||||
|
*Telephone service
|
||||||
|
*A telephone, mic, or other recording device to record the greeting messages
|
||||||
|
*A friend who has a telephone to annoy so he can test the system ;-)
|
||||||
|
|
||||||
|
Optional:
|
||||||
|
*Caller ID service from your phone company in order to use cnd
|
||||||
|
*The Festival Speech Synthesis package, available under FreeBSD ports as
|
||||||
|
audio/festival/, in order to use the speech capabilities (highly
|
||||||
|
recommended.)
|
||||||
|
|
||||||
|
In order to run xfone, you need:
|
||||||
|
*Tcl 8.4
|
||||||
|
*Tk 8.4
|
44
include/phoned.h
Normal file
44
include/phoned.h
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Global stuff for apps in the phoned distribution.
|
||||||
|
* (C)2005, Dan Ponte
|
||||||
|
* BSDL w/ advert.
|
||||||
|
*/
|
||||||
|
#define VERSION "0.1"
|
||||||
|
#define LOGFILE "/var/log/phoned.log"
|
||||||
|
#define SOCKETFILE "/tmp/phoned.sock"
|
||||||
|
#define CONFIGFILE "phoned.conf"
|
||||||
|
#define _unused __attribute__((__unused__))
|
||||||
|
struct conf {
|
||||||
|
char* cfile;
|
||||||
|
char* logfile;
|
||||||
|
int loglevels;
|
||||||
|
};
|
||||||
|
#define LL_DEBUG 0x1
|
||||||
|
#define LL_GARBAGE 0x2
|
||||||
|
#define LL_INFO 0x4
|
||||||
|
#define LL_WARN 0x10
|
||||||
|
#define LL_ERROR 0x20
|
||||||
|
#define LL_CRITICAL 0x40
|
||||||
|
#define LL_FATAL 0x80
|
||||||
|
#define LL_ALL LL_DEBUG | LL_GARBAGE | LL_INFO | LL_WARN | LL_ERROR \
|
||||||
|
| LL_CRITICAL | LL_FATAL /* 247 */
|
||||||
|
enum ltype {
|
||||||
|
debug,
|
||||||
|
garbage,
|
||||||
|
info,
|
||||||
|
warn,
|
||||||
|
error,
|
||||||
|
critical,
|
||||||
|
fatal
|
||||||
|
};
|
||||||
|
|
||||||
|
/* function prottypes */
|
||||||
|
void initialize(void);
|
||||||
|
void open_log(void);
|
||||||
|
void read_config(void);
|
||||||
|
void shutd(void);
|
||||||
|
void network(void);
|
||||||
|
int lprintf(enum ltype logtype, const char* fmt, ...);
|
||||||
|
void handsig(int sig);
|
||||||
|
void install_handlers(void);
|
||||||
|
int parse(FILE** fp);
|
12
main.mk
Normal file
12
main.mk
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
all: .depend ${MAINBIN}
|
||||||
|
# I know, I know, but it's good.
|
||||||
|
.depend: ${SRCS} ${OHDRS}
|
||||||
|
mkdep ${CPPFLAGS} -MM -p ${SRCS}
|
||||||
|
${MAINBIN}: ${OBJS}
|
||||||
|
${CC} ${CFLAGS} ${LDFLAGS} -o ${MAINBIN} ${OBJS}
|
||||||
|
# for this app
|
||||||
|
%.o: %.c
|
||||||
|
${CC} ${CFLAGS} -c ${.SOURCE}
|
||||||
|
# end ours
|
||||||
|
clean:
|
||||||
|
rm -f *.o ${MAINBIN} .depend *~ *.core ${CLEANFILES}
|
12
phonectl/Makefile
Normal file
12
phonectl/Makefile
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# cnd Makefile
|
||||||
|
# (C)2005, Dan Ponte
|
||||||
|
include ../global.mk
|
||||||
|
# basic stuff. we append for a reason.
|
||||||
|
CPPFLAGS=-I../include
|
||||||
|
CFLAGS+=-g -Wall -W -ansi ${CPPFLAGS}
|
||||||
|
LDFLAGS=
|
||||||
|
# keep these up to date.
|
||||||
|
MAINBIN=phonectl
|
||||||
|
SRCS=phonectl.c
|
||||||
|
OBJS=phonectl.o
|
||||||
|
include ../main.mk
|
50
phonectl/phonectl.c
Normal file
50
phonectl/phonectl.c
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2005, Dan Ponte
|
||||||
|
*
|
||||||
|
* phonectl.c - command line client
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
/* system includes */
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <optarg.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <sys/un.h>
|
||||||
|
/* us */
|
||||||
|
#include <phonectl.h>
|
||||||
|
|
||||||
|
int main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char* argv[];
|
||||||
|
{
|
||||||
|
|
21
phoned/Makefile
Normal file
21
phoned/Makefile
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# cnd Makefile
|
||||||
|
# (C)2005, Dan Ponte
|
||||||
|
include ../global.mk
|
||||||
|
# basic stuff. we append for a reason.
|
||||||
|
CPPFLAGS=-I../include -DDEBUG
|
||||||
|
CFLAGS+=-g -Wall -W -ansi ${CPPFLAGS}
|
||||||
|
LDFLAGS=
|
||||||
|
# keep these up to date.
|
||||||
|
MAINBIN=phoned
|
||||||
|
SRCS=main.c init.c log.c cfg.c socket.c y.tab.c lex.yy.c signals.c
|
||||||
|
OBJS=main.o init.o log.o cfg.o socket.o y.tab.o lex.yy.o signals.o
|
||||||
|
OHDRS=y.tab.h
|
||||||
|
CLEANFILES=y.tab.c y.tab.h lex.yy.c
|
||||||
|
|
||||||
|
include ../main.mk
|
||||||
|
|
||||||
|
y.tab.h: y.tab.c
|
||||||
|
y.tab.c: config.y
|
||||||
|
yacc -d config.y
|
||||||
|
lex.yy.c: config.l y.tab.c y.tab.h
|
||||||
|
lex config.l
|
21
phoned/cfg.c
Normal file
21
phoned/cfg.c
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* FUCK....lex overwrote this :-(
|
||||||
|
* (C)2005, Dan Ponte...again.
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <phoned.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
struct conf cf;
|
||||||
|
void read_config(void)
|
||||||
|
{
|
||||||
|
FILE* con;
|
||||||
|
con = fopen(cf.cfile, "r");
|
||||||
|
if(!con) {
|
||||||
|
perror("error opening config file");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
parse(&con);
|
||||||
|
fclose(con);
|
||||||
|
}
|
27
phoned/config.l
Normal file
27
phoned/config.l
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/* configuration lexer */
|
||||||
|
%{
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "y.tab.h"
|
||||||
|
#include <phoned.h>
|
||||||
|
extern int chrcnt, lincnt;
|
||||||
|
%}
|
||||||
|
%%
|
||||||
|
. ++chrcnt; REJECT;
|
||||||
|
notify return NOTIFY;
|
||||||
|
\{ return OBRACE;
|
||||||
|
\} return CBRACE;
|
||||||
|
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} yylval.string = strdup(yytext); return IPADDR;
|
||||||
|
; return SCOLON;
|
||||||
|
\n chrcnt = 0; ++lincnt;/* DONOTHING */
|
||||||
|
[\t ] /* DONOTHING */
|
||||||
|
. /* DO nothing */
|
||||||
|
%%
|
||||||
|
int parse(fp)
|
||||||
|
FILE** fp;
|
||||||
|
{
|
||||||
|
extern int yyparse __P((void));
|
||||||
|
yyin = *fp;
|
||||||
|
if(yyparse())
|
||||||
|
return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
55
phoned/config.y
Normal file
55
phoned/config.y
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
%union
|
||||||
|
{
|
||||||
|
int number;
|
||||||
|
char* string;
|
||||||
|
}
|
||||||
|
|
||||||
|
%{
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <phoned.h>
|
||||||
|
int chrcnt = 0;
|
||||||
|
int lincnt = 0;
|
||||||
|
int yylex(void);
|
||||||
|
void yyerror(str)
|
||||||
|
char* str;
|
||||||
|
{
|
||||||
|
lprintf(fatal, "parser: error: %s at line %d chr %d\n", str, lincnt,
|
||||||
|
chrcnt);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
int yywrap(void)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
%token NOTIFY OBRACE CBRACE SCOLON
|
||||||
|
%token <string> IPADDR
|
||||||
|
%%
|
||||||
|
commands:
|
||||||
|
|
|
||||||
|
command commands SCOLON
|
||||||
|
;
|
||||||
|
command:
|
||||||
|
notify
|
||||||
|
;
|
||||||
|
notify:
|
||||||
|
NOTIFY iplist
|
||||||
|
{
|
||||||
|
lprintf(info, "parser: end notify\n");
|
||||||
|
}
|
||||||
|
;
|
||||||
|
iplist:
|
||||||
|
OBRACE ipaddrs CBRACE
|
||||||
|
;
|
||||||
|
ipaddrs:
|
||||||
|
|
|
||||||
|
ipaddrs ipadr SCOLON
|
||||||
|
;
|
||||||
|
ipadr:
|
||||||
|
IPADDR
|
||||||
|
{
|
||||||
|
lprintf(debug, "Encountered ipaddress %s\n", $1);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
%%
|
28375
phoned/cscope.out
Normal file
28375
phoned/cscope.out
Normal file
File diff suppressed because it is too large
Load Diff
40
phoned/init.c
Normal file
40
phoned/init.c
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* phoned initialization
|
||||||
|
* (C)2005, Dan Ponte
|
||||||
|
* BSD license
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <phoned.h>
|
||||||
|
|
||||||
|
extern FILE* logf;
|
||||||
|
extern short difflog;
|
||||||
|
extern struct conf cf;
|
||||||
|
|
||||||
|
void shutd(void)
|
||||||
|
{
|
||||||
|
lprintf(fatal, "phoned shutting down...\n");
|
||||||
|
fclose(logf);
|
||||||
|
unlink(SOCKETFILE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void open_logs(void)
|
||||||
|
{
|
||||||
|
logf = fopen(difflog ? cf.logfile : LOGFILE, "a");
|
||||||
|
if(!logf) {
|
||||||
|
perror("logf open");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
lprintf(info, "phoned v" VERSION " starting..\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void initialize(void)
|
||||||
|
{
|
||||||
|
open_logs();
|
||||||
|
install_handlers();
|
||||||
|
read_config();
|
||||||
|
}
|
||||||
|
|
138
phoned/log.c
Normal file
138
phoned/log.c
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
/*
|
||||||
|
* log.c - logfile stuff
|
||||||
|
* (C)2005, Dan Ponte.
|
||||||
|
* BSDL with advert.
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <phoned.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
FILE* logf;
|
||||||
|
extern struct conf cf;
|
||||||
|
|
||||||
|
int check_loglevel(lt, ll)
|
||||||
|
enum ltype lt;
|
||||||
|
int ll;
|
||||||
|
{
|
||||||
|
switch(lt) {
|
||||||
|
case debug:
|
||||||
|
if(!(ll & LL_DEBUG))
|
||||||
|
return -1;
|
||||||
|
case garbage:
|
||||||
|
if(!(ll & LL_GARBAGE))
|
||||||
|
return -1;
|
||||||
|
case info:
|
||||||
|
if(!(ll & LL_INFO))
|
||||||
|
return -1;
|
||||||
|
case warn:
|
||||||
|
if(!(ll & LL_WARN))
|
||||||
|
return -1;
|
||||||
|
case error:
|
||||||
|
if(!(ll & LL_ERROR))
|
||||||
|
return -1;
|
||||||
|
case critical:
|
||||||
|
if(!(ll & LL_CRITICAL))
|
||||||
|
return -1;
|
||||||
|
/* we cannot ignore FATAL. Because it's fatal. */
|
||||||
|
default:
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int lprintf(enum ltype logtype, const char* fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
const char* fmtp;
|
||||||
|
char* ofmt;
|
||||||
|
int cnt = 0;
|
||||||
|
int j, i, l;
|
||||||
|
unsigned uns;
|
||||||
|
double dou;
|
||||||
|
char cha;
|
||||||
|
char* str;
|
||||||
|
void* voi;
|
||||||
|
int maxsize;
|
||||||
|
time_t now;
|
||||||
|
char tmt[128];
|
||||||
|
now = time(NULL);
|
||||||
|
l = cf.loglevels;
|
||||||
|
if(!check_loglevel(logtype, l))
|
||||||
|
return -1;
|
||||||
|
strftime(tmt, 128, "%d%b %H:%M:%S: ", localtime(&now));
|
||||||
|
fmtp = fmt;
|
||||||
|
maxsize = strlen(fmt) + 1;
|
||||||
|
ofmt = malloc(sizeof(char) * (strlen(fmt) + 2));
|
||||||
|
fputs(tmt, logf);
|
||||||
|
va_start(ap, fmt);
|
||||||
|
while(*fmtp) {
|
||||||
|
for(i = 0; fmtp[i] && fmtp[i] != '%' && i < maxsize; i++)
|
||||||
|
ofmt[i] = fmtp[i];
|
||||||
|
if(i) {
|
||||||
|
ofmt[i] = '\0';
|
||||||
|
cnt += fprintf(logf, ofmt);
|
||||||
|
fmtp += i;
|
||||||
|
} else {
|
||||||
|
for(i = 0; !isalpha(fmtp[i]) && i < maxsize; i++) {
|
||||||
|
ofmt[i] = fmtp[i];
|
||||||
|
if(i && fmtp[i] == '%') break;
|
||||||
|
}
|
||||||
|
ofmt[i] = fmtp[i];
|
||||||
|
ofmt[i + 1] = '\0';
|
||||||
|
fmtp += i + 1;
|
||||||
|
switch(ofmt[i]) {
|
||||||
|
case 'd':
|
||||||
|
j = va_arg(ap, int);
|
||||||
|
cnt += fprintf(logf, ofmt, j);
|
||||||
|
break;
|
||||||
|
case 'o':
|
||||||
|
case 'x':
|
||||||
|
case 'X':
|
||||||
|
case 'u':
|
||||||
|
uns = va_arg(ap, unsigned);
|
||||||
|
cnt += fprintf(logf, ofmt, uns);
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
cha = (char) va_arg(ap, int);
|
||||||
|
cnt += fprintf(logf, ofmt, cha);
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
str = va_arg(ap, char*);
|
||||||
|
cnt += fprintf(logf, ofmt, str);
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
case 'e':
|
||||||
|
case 'E':
|
||||||
|
case 'G':
|
||||||
|
case 'g':
|
||||||
|
dou = va_arg(ap, double);
|
||||||
|
cnt += fprintf(logf, ofmt, dou);
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
voi = va_arg(ap, void*);
|
||||||
|
cnt += fprintf(logf, ofmt, voi);
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
cnt += fprintf(logf, "%d", cnt);
|
||||||
|
break;
|
||||||
|
case '%':
|
||||||
|
fputc('%', logf);
|
||||||
|
cnt++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Invalid format in log!\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fflush(logf);
|
||||||
|
va_end(ap);
|
||||||
|
free(ofmt); /* MUST do this */
|
||||||
|
return cnt;
|
||||||
|
}
|
50
phoned/main.c
Normal file
50
phoned/main.c
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* main.c - phoned main
|
||||||
|
* (C)2005, Dan Ponte
|
||||||
|
* BSD license with advert. clause.
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <phoned.h>
|
||||||
|
extern struct conf cf;
|
||||||
|
short difflog = 0;
|
||||||
|
|
||||||
|
void usage(argv)
|
||||||
|
const char* argv;
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: usage: %s [-h] [-c config] [-l log]\n", argv, argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char* argv[];
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
cf.cfile = CONFIGFILE;
|
||||||
|
#define OPTSTRING "hc:l:"
|
||||||
|
while((c = getopt(argc, argv, OPTSTRING)) != -1)
|
||||||
|
switch(c) {
|
||||||
|
case 'c':
|
||||||
|
cf.cfile = strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
usage(strdup(*argv));
|
||||||
|
return 0;
|
||||||
|
case 'l':
|
||||||
|
cf.logfile = strdup(optarg);
|
||||||
|
difflog = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage(strdup(*argv));
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
cf.loglevels = LL_ALL;
|
||||||
|
initialize();
|
||||||
|
network();
|
||||||
|
shutd();
|
||||||
|
return 0;
|
||||||
|
}
|
10
phoned/phd
Normal file
10
phoned/phd
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
24Mar 17:05:57: phoned v0.1 starting..
|
||||||
|
24Mar 17:05:57: Encountered ipaddress 10.10.10.13
|
||||||
|
24Mar 17:05:57: Encountered ipaddress 10.10.10.1
|
||||||
|
24Mar 17:05:57: parser: end notify
|
||||||
|
24Mar 17:06:05: phoned v0.1 starting..
|
||||||
|
24Mar 17:06:05: Encountered ipaddress 10.10.10.13
|
||||||
|
24Mar 17:06:05: Encountered ipaddress 10.10.10.1
|
||||||
|
24Mar 17:06:05: parser: end notify
|
||||||
|
24Mar 17:06:51: Received signal 2, cleaning up...
|
||||||
|
24Mar 17:06:51: phoned shutting down...
|
4
phoned/phoned.conf
Normal file
4
phoned/phoned.conf
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
notify {
|
||||||
|
10.10.10.13;
|
||||||
|
10.10.10.1;
|
||||||
|
};
|
63
phoned/signals.c
Normal file
63
phoned/signals.c
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2005, Dan Ponte
|
||||||
|
*
|
||||||
|
* signals.c - signal handlers
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
/* system includes */
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <phoned.h>
|
||||||
|
|
||||||
|
void handsig(sig)
|
||||||
|
int sig;
|
||||||
|
{
|
||||||
|
signal(sig, handsig);
|
||||||
|
switch(sig) {
|
||||||
|
case SIGINT:
|
||||||
|
case SIGQUIT:
|
||||||
|
case SIGTERM:
|
||||||
|
lprintf(fatal, "Received signal %d, cleaning up...\n", sig);
|
||||||
|
shutd();
|
||||||
|
exit(0);
|
||||||
|
break;
|
||||||
|
case SIGHUP:
|
||||||
|
lprintf(info, "Received HUP, rereading configuration files...\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
lprintf(warn, "Received signal %d!\n", sig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void install_handlers(void)
|
||||||
|
{
|
||||||
|
signal(SIGINT, handsig);
|
||||||
|
signal(SIGQUIT, handsig);
|
||||||
|
signal(SIGHUP, handsig);
|
||||||
|
signal(SIGTERM, handsig);
|
||||||
|
}
|
111
phoned/socket.c
Normal file
111
phoned/socket.c
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2005, Dan Ponte
|
||||||
|
*
|
||||||
|
* socket.c - sockets.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
/* system includes */
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <sys/select.h>
|
||||||
|
/* network stuff */
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <sys/un.h>
|
||||||
|
|
||||||
|
#include <phoned.h>
|
||||||
|
|
||||||
|
void handclient(sk)
|
||||||
|
int sk;
|
||||||
|
{
|
||||||
|
char buffer[1024];
|
||||||
|
int rlen;
|
||||||
|
rlen = recv(sk, buffer, sizeof(buffer), 0);
|
||||||
|
lprintf(debug, "Client said %s.", buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void network(void)
|
||||||
|
{
|
||||||
|
int s, us, sn;
|
||||||
|
fd_set fds;
|
||||||
|
struct timeval tv;
|
||||||
|
int si = 1;
|
||||||
|
int sin_size, ilen;
|
||||||
|
struct sockaddr_un it;
|
||||||
|
if((s = socket(AF_LOCAL, SOCK_STREAM, 0)) == -1) {
|
||||||
|
perror("socket");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
strcpy(it.sun_path, SOCKETFILE);
|
||||||
|
it.sun_family = AF_LOCAL;
|
||||||
|
if(bind(s, (struct sockaddr *)&it, 1 + strlen(it.sun_path) +
|
||||||
|
sizeof(it.sun_family)) == -1) {
|
||||||
|
perror("bind");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
if(listen(s, 5) == -1) {
|
||||||
|
perror("listen");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
sin_size = sizeof(struct sockaddr_in);
|
||||||
|
for(;;) {
|
||||||
|
FD_ZERO(&fds);
|
||||||
|
FD_SET(s, &fds);
|
||||||
|
switch(select(s + 1, &fds, NULL, NULL, NULL)) {
|
||||||
|
case -1:
|
||||||
|
perror("select");
|
||||||
|
exit(-1);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
/* NOTREACHED */
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if(FD_ISSET(s, &fds) != 0) {
|
||||||
|
ilen = sizeof(it);
|
||||||
|
if((sn = accept(s,
|
||||||
|
(struct sockaddr *)&it, &ilen))
|
||||||
|
== -1) {
|
||||||
|
perror("s accept");
|
||||||
|
exit(-3);
|
||||||
|
}
|
||||||
|
handclient(sn);
|
||||||
|
close(sn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(s);
|
||||||
|
unlink(SOCKETFILE);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user