Initial revision

This commit is contained in:
dcp1990 2004-12-23 21:44:39 +00:00
commit 2b469a7d85
21 changed files with 1607 additions and 0 deletions

6
Makefile Normal file
View file

@ -0,0 +1,6 @@
all:
cd src && make
cd xcid && make
clean:
cd src && make clean
cd xcid && make clean

4
README Normal file
View file

@ -0,0 +1,4 @@
(C)2004, Dan Ponte. Under the BSD license.
xcid requires X, obviously (pure Xt).
Edit the makefile if not on FreeBSD to comment out -DSPEAKER.
This is pretty hackish. For some debug stuff in either xcid or cidserv, use -DDEBUG in CPPFLAGS.

15
src/Makefile Normal file
View file

@ -0,0 +1,15 @@
CFLAGS=-g -Wall -DSPEAKER
# -DDEBUG
all: cidserv bcast hex
cidserv: cidserv.c
gcc ${CFLAGS} -lutil -o cidserv cidserv.c
bcast: bcast.c
gcc ${CFLAGS} -o bcast bcast.c
hex: hex.c
gcc ${CFLAGS} -o hex hex.c
clean:
rm -f *.o *.core hex bcast cidserv
strip: cidserv bcast hex
strip cidserv
strip bcast
strip hex

5
src/addrs.conf Normal file
View file

@ -0,0 +1,5 @@
# lines beginning with # are comments
# if you simply put subnet.whatever.thing.255, broadcast will be used if we have permission
10.10.10.255
192.168.1.255
# this is a test

BIN
src/bcast Executable file

Binary file not shown.

22
src/bcast.c Normal file
View file

@ -0,0 +1,22 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
char msg[212];
int s;
struct sockaddr_in sin;
strcpy(msg, "1230:1234:3:DAN PONTE:2123456789");
s = socket(PF_INET, SOCK_DGRAM, 0);
bzero(&sin, sizeof sin);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr("10.10.10.1");
sin.sin_port = htons(3890);
if (connect(s, (struct sockaddr *)&sin, sizeof sin) < 0) {
perror("connect");
close(s);
return 2;
}
write(s, msg, sizeof(msg));
close(s);
return 0;
}

BIN
src/cidserv Executable file

Binary file not shown.

518
src/cidserv.c Normal file
View file

@ -0,0 +1,518 @@
/*
* Caller ID Server
* (C)2004, Dan Ponte
* Licensed under the GPL v2
*/
#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>
#define VERSION "0.1"
#ifdef SPEAKER
#include <machine/speaker.h>
int wantspkr = 1;
#else
int wantspkr = 0;
#endif
int usespkr = 0;
int ring = 0, nhosts = 0;
char hosts[10][18];
FILE* logfh;
char* devi;
int modemfd, sfd;
struct tm *ct;
time_t now;
short error = 0;
int evalrc(char* result);
void send_dgram(char* address, char* datar);
int parse_cid(char* cidstring);
void load_addrs(char* fl);
char* logtime(void)
{
static char tstring[12];
bzero(tstring, sizeof tstring);
now = time(NULL);
ct = localtime(&now);
sprintf(tstring, "%02d:%02d:%02d:",
ct->tm_hour, ct->tm_min, ct->tm_sec);
return tstring;
}
#ifdef SPEAKER
void brring(void)
{
tone_t tstr;
int ctr;
for(ctr = 0; ctr <= 4; ctr++) {
tstr.frequency = 1000;
tstr.duration = 10;
ioctl(sfd, SPKRTONE, &tstr);
tstr.frequency = 900;
ioctl(sfd, SPKRTONE, &tstr);
}
}
#endif
static void trap_signal(int nused)
{
fprintf(stderr, "Caught signal %d, cleaning up...\n", nused);
fprintf(logfh, "%s Caught signal %d, cleaning up...\n",
logtime(), nused);
fflush(logfh);
uu_unlock((devi+(sizeof("/dev/")-1)));
close(modemfd);
close(sfd);
fclose(logfh);
exit(0);
}
void usage(char* pname)
{
fprintf(stderr, "Usage: %s %s[-D] -d device -l logfile -a addresses\n"
"-D to run as daemon (detach)\n%s", pname,
wantspkr ? "[-s] " : "",
wantspkr ? "-s uses speaker(4) (FreeBSD) when the"
" phone rings.\n" : "");
}
int main(int argc, char* argv[])
{
char buffer[512], hipad[50];
char cbuf[1];
char *dev, *logfle, *addres;
int cou = 0, ch;
int runasd = 0;
int deset = 0, logset = 0, addrset = 0;
int doing_cid = 0, lres;
struct timeval tv;
fd_set fds_read;
FILE* modem;
int s;
int length;
struct sockaddr_in sin;
struct sockaddr_in from;
char netbuf[256];
FD_ZERO(&fds_read);
#ifdef SPEAKER
while ((ch = getopt(argc, argv, "sDd:l:a:")) != -1) {
#else
while ((ch = getopt(argc, argv, "Dd:l:a:")) != -1) {
#endif
switch(ch) {
case 'd':
dev = strdup(optarg);
deset = 1;
break;
case 'l':
logfle = strdup(optarg);
logset = 1;
break;
case 'a':
addres = strdup(optarg);
addrset = 1;
break;
#ifdef SPEAKER
case 's':
usespkr = 1;
break;
#endif
case 'D':
runasd = 1;
break;
default:
usage(argv[0]);
exit(-1);
}
}
if(!deset || !logset || !addrset) {
usage(argv[0]);
exit(-1);
} else {
if(!(dev[0] == '/' && dev[3] == 'v')) {
fprintf(stderr, "Must be a device!\n");
exit(-1);
}
}
memset(netbuf, 0, sizeof(netbuf));
load_addrs(addres);
if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
return 1;
}
bzero(&sin, sizeof sin);
sin.sin_family = AF_INET;
sin.sin_port = htons(1450);
if(INADDR_ANY)
sin.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(s, (struct sockaddr *)&sin, sizeof sin) < 0) {
perror("bind");
return 2;
}
/* end socket */
devi = dev;
if(!(logfh = fopen(logfle, "a"))) {
perror("logf open");
exit(-1);
}
now = time(NULL);
ct = localtime(&now);
fprintf(logfh, "%s CIDServ v%s started, opening modem...\n"
, logtime(), VERSION);
fflush(logfh);
modemfd = open(dev, O_RDWR);
lres = uu_lock((dev+(sizeof("/dev/")-1)));
signal(SIGTERM, trap_signal);
signal(SIGHUP, trap_signal);
signal(SIGINT, trap_signal);
if(lres != 0) {
fprintf(stderr, "%s\n", uu_lockerr(lres));
exit(-1);
}
modem = fdopen(modemfd, "w+");
if(runasd) {
daemon(1, 0);
}
fprintf(modem, "ATZ\r\nAT E0 #CID=2 V0\r\n");
fflush(modem);
#ifdef SPEAKER
if(usespkr) {
sfd = open("/dev/speaker", O_RDWR);
if(sfd == -1) {
perror("speaker open");
exit(-1);
}
}
#endif
while(1)
{
FD_ZERO(&fds_read);
FD_SET(modemfd, &fds_read);
#ifdef DEBUG
FD_SET(fileno(stdin), &fds_read);
#endif
FD_SET(s, &fds_read);
tv.tv_sec = 3;
tv.tv_usec = 0;
length = sizeof from;
switch(select(modemfd + 1, &fds_read, NULL, NULL, NULL))
{
case -1:
perror("cidserv");
exit(-1);
break;
case 0:
fprintf(modem, "AT#CID=?\r\n");
fflush(modem);
break;
default:
{
if(FD_ISSET(modemfd, &fds_read) != 0)
{
read(modemfd, cbuf, 1);
#ifdef DEBUG
printf("%c", cbuf[0]);
#endif
if(cou < sizeof(buffer) - 2)
buffer[cou] = cbuf[0];
if(buffer[0] == '8' && buffer[1] == '0')
doing_cid = 1;
if(cbuf[0] == '\n') {
if(doing_cid) {
parse_cid(buffer);
memset(buffer, 0, sizeof(buffer));
doing_cid = 0;
cou = 0;
} else {
evalrc(buffer);
memset(buffer, 0, sizeof(buffer));
cbuf[0] = 0;
cou = 0;
}
} else {
cbuf[0] = 0;
cou++;
}
}
if(FD_ISSET(fileno(stdin), &fds_read) != 0)
{
switch(getc(stdin)) {
case 'q':
trap_signal(SIGTERM);
break;
case 's':
parse_cid("802701083039303532303130070F574952454C4553532043414C4C2020020A30303332303532363239AF\n");
break;
case 'l':
parse_cid("802701083132323130383234070F5354414E444953482048454154494E020A343031333937333337325C\n");
break;
case 'o':
parse_cid("80190108313232313135303508014F020A3430313437343737343063\n");
break;
}
}
if(FD_ISSET(s, &fds_read) != 0) {
recvfrom(s, netbuf, 255, 0, (struct sockaddr*)&from, &length);
/* strcpy(hipad, inet_ntoa(from.sin_addr));
if(!((hipad[0] == '1' && hipad[1] == '0' && hipad[2]
== '.') ||
(hipad[0] == '1' && hipad[1] == '9' &&
hipad[2] == '2') || (hipad[0] == '1' &&
hipad[1] == '2' && hipad[3] == '7'))) {
memset(hipad, 0, sizeof(hipad));
fprintf(logfh, "Unauthorized access attempt"
" from %s.\n",
inet_ntoa(from.sin_addr));
break;
}*/
#ifdef DEBUG
printf("client sent %s\n", netbuf);
#endif
memset(hipad, 0, sizeof(hipad));
if((netbuf[0] == 'A' && netbuf[1] ==
'T')) {
if(netbuf[strlen(netbuf)] == '\n')
netbuf[strlen(netbuf)] = 0;
fprintf(modem, "%s\r\n", netbuf);
fflush(modem);
now = time(NULL);
ct = localtime(&now);
fprintf(logfh,
"%02d:%02d:%02d: Remote (%s) sent %s, sending to modem...\n",
ct->tm_hour, ct->tm_min, ct->tm_sec,
inet_ntoa(from.sin_addr), netbuf);
fflush(logfh);
} else {
if(strcmp(netbuf, "AHU\n") ==
0) {
now = time(NULL);
ct = localtime(&now);
fprintf(logfh, "%02d:%02d:%02d: Telemarketers Suck!\n",
ct->tm_hour, ct->tm_min, ct->tm_sec);
fflush(logfh);
fprintf(modem, "ATH1\r\n");
fflush(modem);
sleep(2);
fprintf(modem, "ATH\r\n");
fflush(modem);
}
#ifdef SPEAKER
if(strcmp(netbuf, "RNG\n") == 0) {
brring();
}
#endif
}
memset(&from, 0, sizeof(from));
memset(netbuf, 0, sizeof(netbuf));
}
}
}
}
close(modemfd);
return 0;
}
int evalrc(char* result)
{
int rescode, i;
for(i = 0; i <= strlen(result); i++) {
if(result[i] == '\r' || result[i] == '\n') result[i] = '\0';
}
rescode = atoi(result);
switch(rescode) {
case 0:
/* OK */
return 0;
break;
case 2:
now = time(NULL);
ct = localtime(&now);
fprintf(logfh, "%02d:%02d:%02d: Brrrring!!!!!!\n",
ct->tm_hour, ct->tm_min, ct->tm_sec);
fflush(logfh);
for(i = 0; i <= nhosts; i++) {
send_dgram(hosts[i], "RING");
}
#ifdef SPEAKER
if(usespkr) brring();
#endif
break;
case 4:
error = 1;
return -1;
break;
default:
return 0;
break;
}
return 0;
}
int parse_cid(char* cidstring)
{
char *p, *datep;
int len = 0, i;
char finalbuf[1024], msg[512];
unsigned char cch;
char cbyte, cbyte2;
char bytebuf[10];
char date[7];
time_t rnow;
struct tm *ctm;
char cidtime[7];
char name[128];
char phone[128];
int cur = 0, sz, fbcou = 0;
short int finl = 0;
memset(msg, 0, sizeof msg);
memset(bytebuf, 0, sizeof bytebuf);
memset(date, 0, sizeof date);
memset(finalbuf, 0, sizeof(finalbuf));
if(cidstring[strlen(cidstring)] == '\n')
cidstring[strlen(cidstring)] = 0;
sz = strlen(cidstring);
finl = (sz / 2) - 2;
#ifdef DEBUG
printf("Size of %s is %d\n", cidstring, sz);
#endif
rnow = time(NULL);
ctm = localtime(&rnow);
for(cur = 0; cur <= sz; cur++) {
cbyte = cidstring[cur++];
cbyte2 = cidstring[cur];
sprintf(bytebuf, "0x%c%c", cbyte, cbyte2);
sscanf(bytebuf, "%X", &cch);
if(cch == 0) continue;
if(fbcou <= finl) {
finalbuf[fbcou] = cch;
fbcou++;
} else break;
memset(bytebuf, 0, sizeof(bytebuf));
cbyte = 0;
cbyte2 = 0;
}
sz = fbcou;
p = finalbuf;
len = sz;
while(len && !(*p >= 0x30 && *p <= 0x39)) {
p++;
len--;
}
datep = p;
date[0] = datep[0];
date[1] = datep[1];
date[2] = datep[2];
date[3] = datep[3];
date[4] = 0;
datep += 4;
cidtime[0] = datep[0];
cidtime[1] = datep[1];
cidtime[2] = datep[2];
cidtime[3] = datep[3];
cidtime[4] = 0;
p += 8;
len -= 8;
fprintf(logfh, "Date: %s (local %02d/%02d)\nTime: %s (local %02d:%02d)\n",
date, ctm->tm_mon+1, ctm->tm_mday, cidtime,
ctm->tm_hour, ctm->tm_min);
fflush(logfh);
while(len && !isprint(*p)) {
p++;
len--;
}
i = 0;
while(len && (i < sizeof(finalbuf)) && isprint(*p)) {
name[i++] = *p++;
len--;
}
name[i] = 0;
if(name[0] == 'P' && !(isalpha(name[1]) || (name[1] >= '0' && name[1] <= '9'))) {
strcpy(name, "PRIVATE");
}
if(name[0] == 'O' && !(isalpha(name[1]) || (name[1] >= '1' && name[1] <= '9'))) {
strcpy(name, "UNAVAILABLE");
}
while(len && !isprint(*p)) {
p++;
len--;
}
i = 0;
while(len && (i < sizeof(finalbuf)) && isprint(*p) &&
(p[0] >= 0x20 && p[0] <= 0x7e)) {
if(!((p[0] >= '0' && p[0] <= '9') || p[0] == 'O' || p[0] == 'P'))
{
p++;
len--;
continue;
} else {
phone[i++] = *p++;
len--;
}
}
phone[i] = 0;
if(phone[0] == 'P')
strcpy(phone, "PRIVATE");
if(phone[0] == 'O')
strcpy(phone, "UNAVAILABLE");
fprintf(logfh, "Name: %s\nPhone Number: %s\n*********\n", name, phone);
fflush(logfh);
sprintf(msg, "%s:%s:0:%s:%s", date, cidtime, name, phone);
#ifdef DEBUG
printf("msg will be %s\n", msg);
#endif
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(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);
}

BIN
src/hex Executable file

Binary file not shown.

86
src/hex.c Normal file
View file

@ -0,0 +1,86 @@
#include <string.h>
#include <stdio.h>
int main()
{
char buf[512];
char* p;
char* datep;
int len = 0;
int i;
char cch;
char finalbuf[512];
char cbyte;
char cbyte2;
char bytebuf[10];
char date[7];
char time[7];
char name[128];
char phone[128];
int waitingsec = 0;
int cur = 0;
int sz;
int fbcou = 0;
memset(finalbuf, 0, sizeof(finalbuf));
memset(buf, 0, sizeof(buf));
scanf("%s", buf);
sz = strlen(buf);
printf("Size of %s is %d\n", buf, sz);
for(cur = 0; cur <= sz; cur++) {
cbyte = buf[cur++];
cbyte2 = buf[cur];
sprintf(bytebuf, "0x%c%c", cbyte, cbyte2);
sscanf(bytebuf, "%X", &cch);
if(cch == 0) continue;
finalbuf[fbcou] = cch;
fbcou++;
memset(bytebuf, 0, sizeof(bytebuf));
cbyte = 0;
cbyte2 = 0;
}
sz = fbcou;
p = finalbuf;
len = sz;
while(len && !(*p >= 0x30 && *p <= 0x39)) {
p++;
len--;
}
datep = p;
date[0] = datep[0];
date[1] = datep[1];
date[2] = '/';
date[3] = datep[2];
date[4] = datep[3];
date[5] = 0;
datep += 4;
time[0] = datep[0];
time[1] = datep[1];
time[2] = ':';
time[3] = datep[2];
time[4] = datep[3];
time[5] = 0;
p += 8;
len -= 8;
printf("Date: %s\nTime: %s\n", date, time);
while(len && !isprint(*p)) {
p++;
len--;
}
i = 0;
while(len && (i < sizeof(finalbuf)) && isprint(*p)) {
name[i++] = *p++;
len--;
}
name[i] = 0;
while(len && !isprint(*p)) {
p++;
len--;
}
i = 0;
while(len && (i < sizeof(finalbuf)) && isprint(*p)) {
phone[i++] = *p++;
len--;
}
phone[i] = 0;
printf("Name: %s\nPhone Number: %s\n", name, phone);
return 0;
}

12
src/myl Normal file
View file

@ -0,0 +1,12 @@
15:22:42: CIDServ v0.1 started, opening modem...
Date: 0905 (local 12/21)
Time: 2010 (local 15:22)
Name: WIRELESS CALL
Phone Number: 0032052629
*********
Date: 1221 (local 12/21)
Time: 1505 (local 15:23)
Name: UNAVAILABLE
Phone Number: 4014747740
*********
15:23:12: Caught signal 2, cleaning up...

BIN
src/pcid Executable file

Binary file not shown.

125
src/pcid.c Normal file
View file

@ -0,0 +1,125 @@
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
int parse_cid(char* cidstring)
{
char *p, *datep;
int len = 0, i;
char finalbuf[256], msg[512];
unsigned char cch;
char cbyte, cbyte2;
char bytebuf[10];
char date[7];
time_t rnow;
struct tm *ctm;
char cidtime[7];
char name[128];
char phone[128];
int cur = 0, sz, fbcou = 0;
memset(msg, 0, sizeof msg);
memset(bytebuf, 0, sizeof bytebuf);
memset(date, 0, sizeof date);
memset(finalbuf, 0, sizeof(finalbuf));
sz = strlen(cidstring);
#ifdef DEBUG
printf("Size of %s is %d\n", cidstring, sz);
#endif
rnow = time(NULL);
ctm = localtime(&rnow);
for(cur = 0; cur <= sz; cur++) {
cbyte = cidstring[cur++];
cbyte2 = cidstring[cur];
sprintf(bytebuf, "0x%c%c", cbyte, cbyte2);
sscanf(bytebuf, "%X", &cch);
if(cch == 0) continue;
printf("fc = %d\n", fbcou);
if(fbcou < 41)
{
finalbuf[fbcou] = cch;
fbcou++;
} else break;
memset(bytebuf, 0, sizeof(bytebuf));
cbyte = 0;
cbyte2 = 0;
}
sz = fbcou;
p = finalbuf;
len = sz;
while(len && !(*p >= 0x30 && *p <= 0x39)) {
p++;
len--;
}
datep = p;
date[0] = datep[0];
date[1] = datep[1];
date[2] = datep[2];
date[3] = datep[3];
date[4] = 0;
datep += 4;
cidtime[0] = datep[0];
cidtime[1] = datep[1];
cidtime[2] = datep[2];
cidtime[3] = datep[3];
cidtime[4] = 0;
p += 8;
len -= 8;
fprintf(stdout, "Date: %s (local %02d/%02d)\nTime: %s (local %02d:%02d)\n",
date, ctm->tm_mon+1, ctm->tm_mday, cidtime,
ctm->tm_hour, ctm->tm_min);
while(len && !isprint(*p)) {
p++;
len--;
}
i = 0; /* bounds checking */
while(len && p - finalbuf < sizeof(finalbuf) /* && (i < sizeof(finalbuf) - 1) */&& isprint(*p)) {
printf("%p, %p, %d, %c\n", p, finalbuf, p - finalbuf, *p);
name[i++] = *p++;
len--;
printf("next one will be %c\n", *p);
}
name[i] = 0;
if(name[0] == 'P' && !(isalpha(name[1]) || (name[1] >= '0' && name[1] <= '9'))) {
strcpy(name, "PRIVATE");
}
if(name[0] == 'O' && !(isalpha(name[1]) || (name[1] >= '1' && name[1] <= '9'))) {
strcpy(name, "UNAVAILABLE");
}
while(len && !isprint(*p)) {
p++;
len--;
}
i = 0;
while(len && (p - finalbuf < sizeof(finalbuf) - 1) && isprint(*p) &&
(p[0] >= 0x20 && p[0] <= 0x7e)) {
if(!((p[0] >= '0' && p[0] <= '9') || p[0] == 'O' || p[0] == 'P'))
{
++p;
continue;
} else {
phone[i++] = *p++;
len--;
}
}
phone[i] = 0;
if(phone[0] == 'P')
strcpy(phone, "PRIVATE");
if(phone[0] == 'O')
strcpy(phone, "UNAVAILABLE");
fprintf(stdout, "Name: %s\nPhone Number: %s\n*********\n", name, phone);
fflush(stdout);
sprintf(msg, "%s:%s:0:%s:%s", date, cidtime, name, phone);
#ifdef DEBUG
printf("msg will be %s\n", msg);
#endif
return 0;
}
int main(int argc, char* argv[])
{
char* avb;
avb = strdup(argv[1]);
parse_cid(avb);
free(avb);
return 0;
}

56
src/testserv.c Normal file
View file

@ -0,0 +1,56 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/select.h>
int main()
{
int s, c;
int b, len;
fd_set fds;
struct sockaddr_in sin;
FILE* client;
struct sockaddr_in from;
char cbuf[64];
FD_ZERO(&fds);
memset(cbuf,0,sizeof(cbuf));
if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
return 1;
}
bzero(&sin, sizeof sin);
sin.sin_family = AF_INET;
sin.sin_port = htons(1450);
if(INADDR_ANY)
sin.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(s, (struct sockaddr *)&sin, sizeof sin) < 0) {
perror("bind");
return 2;
}
while(1) {
b = sizeof sin;
FD_ZERO(&fds);
FD_SET(s, &fds);
switch(select(s+1, &fds, NULL, NULL, NULL)) {
case -1:
perror("select");
return 3;
break;
case 0:
break;
default:
{
len = sizeof from;
if(FD_ISSET(s, &fds) != 0) {
printf("here\n");
recvfrom(s, cbuf, 63, 0, (struct sockaddr*)&from, &len);
printf("%s", cbuf);
memset(cbuf,0,sizeof(cbuf));
}
}
}
}
return 0;
}

4
xcid/Makefile Normal file
View file

@ -0,0 +1,4 @@
all:
cd src && make
clean:
cd src && make clean

BIN
xcid/src/.wind.c.swp Normal file

Binary file not shown.

19
xcid/src/Makefile Normal file
View file

@ -0,0 +1,19 @@
#gcc -g -I/usr/X11R6/include -L/usr/X11R6/lib -lXt -lX11 -lXaw -o xcid xcid.c network.c wind.c
CFLAGS=-g -Wall
CC=gcc
CPPFLAGS=-I/usr/X11R6/include
#-DDEBUG
LDFLAGS=-L/usr/X11R6/lib -lXt -lX11 -lXaw
OBJS=xcid.o network.o wind.o
SRCS=xcid.c network.c wind.c
all: xcid
xcid: ${OBJS}
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -o xcid
xcid.o: xcid.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c xcid.c
network.o: network.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c network.c
wind.o: wind.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c wind.c
clean:
rm -f *.o core.* *.core *~ xcid

123
xcid/src/network.c Normal file
View file

@ -0,0 +1,123 @@
/*
* XCid - network stuff
* (C)2004, Dan Ponte
*
* 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. Neither the name of 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 DAN PONTE 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 DAN PONTE 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.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 3890
#define BUFFERL 256
struct sockaddr_in servsad;
extern char* servaddr;
void telluser(char* buf);
void sendtoser(char* txt)
{
int s;
struct sockaddr_in sin;
s = socket(PF_INET, SOCK_DGRAM, 0);
bzero(&sin, sizeof sin);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(servaddr);
#ifdef DEBUG
printf("it is %s\n", inet_ntoa(sin.sin_addr));
#endif
sin.sin_port = htons(1450);
if(connect(s, (struct sockaddr *)&sin, sizeof sin) < 0) {
perror("Connect");
exit(-1);
}
write(s, txt, strlen(txt) + 1);
close(s);
return;
}
int start_netloop(void)
{
int sockfd, addr_len, nbytes;
struct sockaddr_in ouraddr;
struct sockaddr_in* bcasaddr;
struct timeval tv;
bcasaddr = &servsad;
bzero(&servsad, sizeof servsad);
fd_set fds_read;
FD_ZERO(&fds_read);
char buffer[BUFFERL];
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("sock");
exit(-1);
}
ouraddr.sin_family = AF_INET;
ouraddr.sin_port = htons(PORT);
ouraddr.sin_addr.s_addr = INADDR_ANY;
memset(&(ouraddr.sin_zero), 0, 8);
if(bind(sockfd, (struct sockaddr*)&ouraddr, sizeof(struct sockaddr)) == -1) {
perror("bind");
exit(-2);
}
addr_len = sizeof(struct sockaddr);
while(1)
{
FD_ZERO(&fds_read);
FD_SET(sockfd, &fds_read);
tv.tv_sec = 3; tv.tv_usec = 0;
switch(select(sockfd + 1, &fds_read, NULL, NULL, NULL))
{
case -1:
perror("select");
exit(-1);
break;
default:
if(FD_ISSET(sockfd, &fds_read) != 0)
{
if((nbytes = recvfrom(sockfd, buffer, BUFFERL - 1, 0, (struct sockaddr*)&bcasaddr, &addr_len
)) == -1) {
perror("recv");
exit(-3);
}
buffer[nbytes] = 0;
#ifdef DEBUG
printf("got %s\n", buffer);
#endif
telluser(buffer);
memset(buffer, 0, BUFFERL);
}
}
}
close(sockfd);
return 0;
}

381
xcid/src/pixmap.c Normal file
View file

@ -0,0 +1,381 @@
/* GIMP RGB C-Source image dump (pixmap.c) */
static const struct {
unsigned int width;
unsigned int height;
unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */
unsigned char pixel_data[48 * 48 * 3 + 1];
} gimp_image = {
48, 48, 3,
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376"
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0"
"\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0"
"\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376"
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
"\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0"
"\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0"
"\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22"
"\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\0\22\376\0\22\376"
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0"
"\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376"
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
"\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22"
"\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376"
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
"\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376"
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0"
"\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0"
"\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22"
"\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376"
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376"
"\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376"
"\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22"
"\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22"
"\376\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22"
"\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\0\22\376\0\22"
"\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\0\22\376\0\22\376\0\22\376\0\22\376\0\22"
"\376\0\22\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"
"\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376\376"