summaryrefslogtreecommitdiffstats
path: root/tcpip/ttylinkd.c
diff options
context:
space:
mode:
Diffstat (limited to 'tcpip/ttylinkd.c')
-rw-r--r--tcpip/ttylinkd.c206
1 files changed, 103 insertions, 103 deletions
diff --git a/tcpip/ttylinkd.c b/tcpip/ttylinkd.c
index 792969e..c4399d5 100644
--- a/tcpip/ttylinkd.c
+++ b/tcpip/ttylinkd.c
@@ -7,13 +7,13 @@
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
- * This program is distributed in the hope that it will be useful,
+ * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have recieved a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
+ * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge. MA 02139, USA.
*/
/*
@@ -80,7 +80,7 @@ void read_config_file(int dummy);
"look-up",
"delete",
"announce" };
-*/
+*/
static char *Responses[] = {
"success",
"sysop not logged on",
@@ -112,18 +112,18 @@ int main(int argc, char *argv[])
struct sockaddr_rose *peer_srose;
socklen_t sa_len, length;
int i;
-
+
/* Open up the system logger */
openlog(argv[0], LOG_PID, LOG_DAEMON);
-
+
write(STDOUT_FILENO, version, strlen(version));
-
+
/* Work out who is calling us */
userfamily = AF_UNSPEC;
memset(user, 0, NAME_SIZE);
strcpy(sysop_addr, SYSOP_USER);
strcpy(config_file, CONF_TTYLINKD_FILE);
- for(i=1 ; i < argc ; i++)
+ for (i=1 ; i < argc ; i++)
{
if (argv[i][0] == '-')
{
@@ -163,60 +163,60 @@ int main(int argc, char *argv[])
break;
} /*switch */
} /* - */
- } /* for */
+ } /* for */
if (user[0] == '\0')
{
sa_len = sizeof(sa);
- if (getpeername(STDOUT_FILENO, &sa, &sa_len) < 0)
+ if (getpeername(STDOUT_FILENO, &sa, &sa_len) < 0)
{
fprintf(stderr, "%s: getpeername() failed, you must specify a callsign in stdin mode.\n", argv[0]);
syslog(LOG_CRIT | LOG_DAEMON, "main(): getpeername() failed.");
return 0;
} else {
userfamily = sa.sa_family;
- switch(sa.sa_family) {
- case AF_INET:
- peer_sin = (struct sockaddr_in*)&sa;
- write(STDOUT_FILENO, buf, strlen(buf));
- sprintf(buf, "Please enter your callsign: ");
- write(STDOUT_FILENO, buf, strlen(buf));
- fflush(stdout);
- if (fgets(user, NAME_SIZE-1, stdin) == NULL)
- return 0;
- for (i = 0; user[i] != '\0' && user[i] != '\n' && user[i] != '\r'; i++)
- ;
- user[i] = '\0';
- if (strlen(user) < 1)
- return 0;
- userfamily = AF_INET;
- break;
- case AF_AX25:
- case AF_NETROM:
- peer_sax = (struct sockaddr_ax25*)&sa;
- for(i=0 ; i < 6 ; i++)
- {
- user[i] = tolower(((peer_sax->sax25_call.ax25_call[i]) >>1)&0x7f);
- if (user[i] == ' ')
- break;
- }
- user[i] = '\0';
+ switch (sa.sa_family) {
+ case AF_INET:
+ peer_sin = (struct sockaddr_in*)&sa;
+ write(STDOUT_FILENO, buf, strlen(buf));
+ sprintf(buf, "Please enter your callsign: ");
+ write(STDOUT_FILENO, buf, strlen(buf));
+ fflush(stdout);
+ if (fgets(user, NAME_SIZE-1, stdin) == NULL)
+ return 0;
+ for (i = 0; user[i] != '\0' && user[i] != '\n' && user[i] != '\r'; i++)
+ ;
+ user[i] = '\0';
+ if (strlen(user) < 1)
+ return 0;
+ userfamily = AF_INET;
+ break;
+ case AF_AX25:
+ case AF_NETROM:
+ peer_sax = (struct sockaddr_ax25*)&sa;
+ for (i=0 ; i < 6 ; i++)
+ {
+ user[i] = tolower(((peer_sax->sax25_call.ax25_call[i]) >>1)&0x7f);
+ if (user[i] == ' ')
break;
- case AF_ROSE:
- peer_srose = (struct sockaddr_rose*)&sa;
- for(i=0 ; i < 6 ; i++)
- {
- user[i] = tolower(((peer_srose->srose_call.ax25_call[i]) >>1)&0x7f);
- if (user[i] == ' ')
- break;
- }
- user[i] = '\0';
+ }
+ user[i] = '\0';
+ break;
+ case AF_ROSE:
+ peer_srose = (struct sockaddr_rose*)&sa;
+ for (i=0 ; i < 6 ; i++)
+ {
+ user[i] = tolower(((peer_srose->srose_call.ax25_call[i]) >>1)&0x7f);
+ if (user[i] == ' ')
break;
- default:
- syslog(LOG_DAEMON | LOG_CRIT, "Unsupported address family.");
- exit(1);
+ }
+ user[i] = '\0';
+ break;
+ default:
+ syslog(LOG_DAEMON | LOG_CRIT, "Unsupported address family.");
+ exit(1);
}
-
- }
+
+ }
} /* argc */
/* Read the configuration file to find the System Operator. */
@@ -265,22 +265,22 @@ int main(int argc, char *argv[])
memset((char*)&msg_sa, 0, sizeof(msg_sa));
msg_sa.sa_family = AF_INET;
- msg_sin = (struct sockaddr_in*)&msg_sa;
+ msg_sin = (struct sockaddr_in*)&msg_sa;
msg_sin->sin_port = htons(0);
memcpy((char*)&(msg_sin->sin_addr), phe->h_addr, phe->h_length);
-
+
if ((skt = socket(PF_INET, SOCK_STREAM, 0)) < 0)
{
syslog(LOG_DAEMON | LOG_CRIT, "main(): socket() failed.");
exit(1);
}
-
+
if (bind( skt, &msg_sa, sizeof(msg_sa)) != 0)
{
syslog(LOG_DAEMON | LOG_CRIT, "main(): bind() failed.");
exit(1);
}
-
+
length = sizeof(msg_sa);
if (getsockname(skt, &msg_sa, &length) < 0)
{
@@ -294,21 +294,21 @@ int main(int argc, char *argv[])
ctl_sin.sin_family = AF_INET;
memcpy((char*)&ctl_sin.sin_addr, phe->h_addr, phe->h_length);
ctl_sin.sin_port = htons(0);
-
+
if ((ctl_skt = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
{
syslog(LOG_DAEMON | LOG_CRIT, "main(): socket() while attempting to create control socket.");
close(skt);
exit(1);
}
-
+
if (bind(ctl_skt, (struct sockaddr*)&ctl_sin, sizeof(ctl_sin)) != 0)
{
syslog(LOG_DAEMON | LOG_CRIT, "main(): Error when trying to bind() control socket.");
close(skt);
exit(1);
}
-
+
length = sizeof(ctl_sin);
if (getsockname(ctl_skt, (struct sockaddr*)&ctl_sin, &length) < 0)
{
@@ -317,21 +317,21 @@ int main(int argc, char *argv[])
close(ctl_skt);
exit(1);
}
-
+
/* Start talking to the talk daemon */
memset((char*)&msg, 0, sizeof(msg));
msg.vers = TALK_VERSION;
msg.id_num = htonl(0);
msg.addr.sa_family = ntohs(AF_INET);
- memcpy(&(msg.ctl_addr), &msg_sa, sizeof(struct osockaddr));
+ memcpy(&(msg.ctl_addr), &msg_sa, sizeof(struct osockaddr));
/*msg.ctl_addr = *(struct sockaddr*)&ctl_sin;
msg.ctl_addr = *(struct sockaddr*)&ctl_sin;*/
msg.ctl_addr.sa_family = ntohs(AF_INET);
msg.pid = htonl(getpid());
strncpy(msg.l_name, user, NAME_SIZE-1);
strncpy(msg.r_name, sysop_user, NAME_SIZE-1);
-
-
+
+
/* Now look for an invite */
msg.type = LOOK_UP;
(void) send_control(ctl_skt, rem_addr, msg, &resp);
@@ -348,7 +348,7 @@ int main(int argc, char *argv[])
printf("Cannot talk to sysop errno=%d.\n",i);
else
printf("Cannot talk to sysop, reason: %s.\n",Responses[i]);
-
+
close(skt);
close(ctl_skt);
return 0;
@@ -362,7 +362,7 @@ int main(int argc, char *argv[])
syslog(LOG_DAEMON | LOG_CRIT, "main(): Error when trying to listen() on socket.");
exit(1);
}
-
+
/* Now we have to make an invitation for the other user */
msg.type = LEAVE_INVITE;
if (send_control(ctl_skt, my_addr, msg, &resp) != SUCCESS)
@@ -374,14 +374,14 @@ int main(int argc, char *argv[])
return 0;
}
local_id = resp.id_num;
-
+
sprintf(buf, "Paging sysop.\n");
write(STDOUT_FILENO, buf, strlen(buf));
-
+
/* Wait for the sysop to connect to us */
signal(SIGALRM, alarm_handle);
alarm(30);
-
+
if ((new_skt = accept(skt, 0, 0)) < 0)
{
if (errno == EINTR)
@@ -401,21 +401,21 @@ int main(int argc, char *argv[])
}
alarm(0);
signal(SIGALRM, SIG_DFL);
-
+
close(skt);
skt = new_skt;
-
+
/* Delete invitations from both daemons */
msg.type = DELETE;
msg.id_num = htonl(local_id);
send_control(ctl_skt, my_addr, msg, &resp);
msg.id_num = htonl(remote_id);
send_control(ctl_skt, rem_addr, msg, &resp);
-
- sprintf(buf, "Sysop has responded.\n");
+
+ sprintf(buf, "Sysop has responded.\n");
write(STDOUT_FILENO, buf, strlen(buf));
-
- /*
+
+ /*
* A little thing that they don't mention anywhere is the fact that the
* first three characters on a connection are used to work out to erase,
* kill and word erase characters. Nice to know eh?
@@ -443,7 +443,7 @@ int main(int argc, char *argv[])
erasec = buf[0];
killc = buf[1];
werasec = buf[2];
-
+
/* Tell the sysop who this person is */
if (sa.sa_family == AF_AX25)
{
@@ -455,26 +455,26 @@ int main(int argc, char *argv[])
sprintf(buf, "Incoming ttylink from %s@%s.\n", user, inet_ntoa(peer_sin->sin_addr));
write(skt, buf, strlen(buf));
}
-
-
+
+
do_talk(skt);
close(skt);
- close(ctl_skt);
+ close(ctl_skt);
return 0;
}
/*
* Used to send control messages to our friendly local talk daemon
- */
+ */
int send_control(int skt, struct in_addr addr, CTL_MSG msg, CTL_RESPONSE *resp)
{
fd_set fdvar;
struct timeval timeout;
struct sockaddr_in sin;
- static int talk_port = 0;
+ static int talk_port;
struct servent *pse;
-
+
/* Look up talk port once only */
if (talk_port == 0)
{
@@ -492,7 +492,7 @@ int send_control(int skt, struct in_addr addr, CTL_MSG msg, CTL_RESPONSE *resp)
sin.sin_addr = addr;
sin.sin_family = AF_INET;
sin.sin_port = talk_port;
-
+
if (sendto(skt, (char*)&msg, sizeof(msg), 0, (struct sockaddr*)&sin, sizeof(sin)) != sizeof(msg))
{
syslog(LOG_DAEMON | LOG_ERR, "send_control(): sendto failed (%m).");
@@ -504,23 +504,23 @@ int send_control(int skt, struct in_addr addr, CTL_MSG msg, CTL_RESPONSE *resp)
FD_SET(skt, &fdvar);
timeout.tv_sec = RING_WAIT;
timeout.tv_usec = 0;
-
+
if (select(32, &fdvar, NULL, NULL, &timeout) < 0)
syslog(LOG_DAEMON | LOG_ERR, "send_control(): select failed. (%m)");
-
+
/*
* The server is ignoring us, see ya later
- */
+ */
if (!(FD_ISSET(skt, &fdvar)))
{
printf("Talk server not responding after %d seconds, aborting.\n", RING_WAIT);
return -1;
}
-
+
/* Get the message */
- if(recv(skt, resp, sizeof(resp),0) ==0)
+ if (recv(skt, resp, sizeof(resp),0) ==0)
syslog(LOG_DAEMON | LOG_ERR, "send_control(): recv failed. (%m)");
-
+
return resp->answer;
}
@@ -530,8 +530,8 @@ int send_sysop_data(char *buf, int len)
static char outbuf[82];
static char *bptr = outbuf;
int i;
-
- for(i = 0; i < len; i++)
+
+ for (i = 0; i < len; i++)
{
/* Check for erase character */
if (buf[i] == erasec)
@@ -540,18 +540,18 @@ int send_sysop_data(char *buf, int len)
bptr--;
continue;
}
-
+
/* Check for kill character */
if (buf[i] == killc)
{
bptr = outbuf;
continue;
}
-
+
/* Check for word-erase character */
if (buf[i] == werasec)
{
- while( (bptr > outbuf) && (*bptr != ' ') )
+ while ( (bptr > outbuf) && (*bptr != ' ') )
bptr--;
continue;
}
@@ -573,7 +573,7 @@ int send_sysop_data(char *buf, int len)
*bptr = buf[i];
bptr++;
}
-
+
/* Check for carriage return, which means send it */
/* We also send if we have more than 80 characters */
if (buf[i] == '\n' || (bptr - outbuf) > 80 )
@@ -587,7 +587,7 @@ int send_sysop_data(char *buf, int len)
} /* for */
return 0;
}
-
+
/* Used to process the data from the user - len must not exceed 256 */
int send_user_data(int skt, char *buf, int len)
{
@@ -595,7 +595,7 @@ int send_user_data(int skt, char *buf, int len)
char *bptr = outbuf;
int i;
- for(i = 0; i < len; i++)
+ for (i = 0; i < len; i++)
{
if (buf[i] == '\r')
{
@@ -637,14 +637,14 @@ void do_talk(int skt)
char inbuf[256], outbuf[256];
struct timeval timeout;
int i;
-
-
- while(1)
+
+
+ while (1)
{
FD_ZERO(&fdvar);
FD_SET(skt, &fdvar);
FD_SET(STDIN_FILENO, &fdvar);
-
+
timeout.tv_sec = 30;
timeout.tv_usec = 0;
if (select(32, &fdvar, NULL, NULL, &timeout) == 0)
@@ -654,7 +654,7 @@ void do_talk(int skt)
if (ioctl(skt, FIONREAD, (struct sgttyb*)&i) < 0)
return;
}
-
+
if (FD_ISSET(skt, &fdvar))
{
if ((i = read(skt, inbuf, 256)) <= 0)
@@ -686,12 +686,12 @@ void do_talk(int skt)
}
}
}
-}
+}
void alarm_handle(int i)
{
char buf[256];
-
+
strcpy(buf, "Sysop not responding.\n");
write(STDOUT_FILENO, buf, strlen(buf));
}
@@ -701,13 +701,13 @@ void read_config_file(int dummy)
char buf[128];
char param[20], value[108];
FILE *fp;
-
+
if ( (fp = fopen(config_file, "r")) == NULL) {
- syslog(LOG_DAEMON | LOG_ERR, "Cannot find configuration file: %s (%m)\n",config_file);
+ syslog(LOG_DAEMON | LOG_ERR, "Cannot find configuration file: %s (%m)\n",config_file);
return;
}
/* Reset any variables here */
-
+
while ( fgets(buf, 128, fp) != NULL) {
if ( buf[0] == '#')
continue;