diff options
Diffstat (limited to 'mactelnetd.c')
-rw-r--r-- | mactelnetd.c | 87 |
1 files changed, 48 insertions, 39 deletions
diff --git a/mactelnetd.c b/mactelnetd.c index d3d462d..a2c0956 100644 --- a/mactelnetd.c +++ b/mactelnetd.c @@ -18,6 +18,8 @@ */ #define _XOPEN_SOURCE 600 #define _BSD_SOURCE +#include <libintl.h> +#include <locale.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> @@ -63,6 +65,9 @@ /* Max ~5 pings per second */ #define MT_MAXPPS MT_MNDP_BROADCAST_INTERVAL * 5 +#define _(String) gettext (String) +#define gettext_noop(String) String + static int sockfd; static int insockfd; static int mndpsockfd; @@ -236,12 +241,12 @@ static void setup_sockets() { memcpy(&(si_me.sin_addr.s_addr), interfaces[i].ipv4_addr, IPV4_ALEN); if (bind(interfaces[i].socketfd, (struct sockaddr *)&si_me, sizeof(si_me))==-1) { - fprintf(stderr, "Error binding to %s:%d, %s\n", inet_ntoa(si_me.sin_addr), sourceport, strerror(errno)); + fprintf(stderr, _("Error binding to %s:%d, %s\n"), inet_ntoa(si_me.sin_addr), sourceport, strerror(errno)); continue; } } - syslog(LOG_NOTICE, "Listening on %s for %s\n", interfaces[i].name, ether_ntoa(mac)); + syslog(LOG_NOTICE, _("Listening on %s for %s\n"), interfaces[i].name, ether_ntoa(mac)); } } @@ -401,9 +406,9 @@ static void user_login(struct mt_connection *curconn, struct mt_mactelnet_hdr *p } if (user == NULL || memcmp(md5sum, curconn->trypassword, 17) != 0) { - syslog(LOG_NOTICE, "(%d) Invalid login by %s.", curconn->seskey, curconn->username); + syslog(LOG_NOTICE, _("(%d) Invalid login by %s."), curconn->seskey, curconn->username); - abort_connection(curconn, pkthdr, "Login failed, incorrect username or password\r\n"); + abort_connection(curconn, pkthdr, _("Login failed, incorrect username or password\r\n")); /* TODO: should wait some time (not with sleep) before returning, to minimalize brute force attacks */ return; @@ -419,7 +424,7 @@ static void user_login(struct mt_connection *curconn, struct mt_mactelnet_hdr *p curconn->ptsfd = posix_openpt(O_RDWR); if (curconn->ptsfd == -1 || grantpt(curconn->ptsfd) == -1 || unlockpt(curconn->ptsfd) == -1) { syslog(LOG_ERR, "posix_openpt: %s", strerror(errno)); - abort_connection(curconn, pkthdr, "Terminal error\r\n"); + abort_connection(curconn, pkthdr, _("Terminal error\r\n")); return; } @@ -430,8 +435,8 @@ static void user_login(struct mt_connection *curconn, struct mt_mactelnet_hdr *p struct stat sb; struct passwd *user = (struct passwd *)getpwnam(curconn->username); if (user == NULL) { - syslog(LOG_WARNING, "(%d) Login ok, but local user not accessible (%s).", curconn->seskey, curconn->username); - abort_connection(curconn, pkthdr, "Local user not accessible\r\n"); + syslog(LOG_WARNING, _("(%d) Login ok, but local user not accessible (%s)."), curconn->seskey, curconn->username); + abort_connection(curconn, pkthdr, _("Local user not accessible\r\n")); return; } @@ -440,8 +445,8 @@ static void user_login(struct mt_connection *curconn, struct mt_mactelnet_hdr *p curconn->slavefd = open(slavename, O_RDWR); if (curconn->slavefd == -1) { - syslog(LOG_ERR, "Error opening %s: %s", slavename, strerror(errno)); - abort_connection(curconn, pkthdr, "Error opening terminal\r\n"); + syslog(LOG_ERR, _("Error opening %s: %s"), slavename, strerror(errno)); + abort_connection(curconn, pkthdr, _("Error opening terminal\r\n")); list_remove_connection(curconn); return; } @@ -452,7 +457,7 @@ static void user_login(struct mt_connection *curconn, struct mt_mactelnet_hdr *p /* Add login information to utmp/wtmp */ uwtmp_login(curconn); - syslog(LOG_INFO, "(%d) User %s logged in.", curconn->seskey, curconn->username); + syslog(LOG_INFO, _("(%d) User %s logged in."), curconn->seskey, curconn->username); /* Initialize terminal environment */ setenv("USER", user->pw_name, 1); @@ -490,14 +495,14 @@ static void user_login(struct mt_connection *curconn, struct mt_mactelnet_hdr *p /* Set user id/group id */ if ((setgid(user->pw_gid) != 0) || (setuid(user->pw_uid) != 0)) { - syslog(LOG_ERR, "(%d) Could not log in %s (%d:%d): setuid/setgid: %s", curconn->seskey, curconn->username, user->pw_uid, user->pw_gid, strerror(errno)); - abort_connection(curconn, pkthdr, "Internal error\r\n"); + syslog(LOG_ERR, _("(%d) Could not log in %s (%d:%d): setuid/setgid: %s"), curconn->seskey, curconn->username, user->pw_uid, user->pw_gid, strerror(errno)); + abort_connection(curconn, pkthdr, _("Internal error\r\n")); exit(0); } /* Abort login if /etc/nologin exists */ if (stat(_PATH_NOLOGIN, &sb) == 0 && getuid() != 0) { - syslog(LOG_NOTICE, "(%d) User %s disconnected with " _PATH_NOLOGIN " message.", curconn->seskey, curconn->username); + syslog(LOG_NOTICE, _("(%d) User %s disconnected with " _PATH_NOLOGIN " message."), curconn->seskey, curconn->username); display_nologin(); curconn->state = STATE_CLOSED; init_packet(&pdata, MT_PTYPE_END, pkthdr->dstaddr, pkthdr->srcaddr, pkthdr->seskey, curconn->outcounter); @@ -590,7 +595,7 @@ static void handle_data_packet(struct mt_connection *curconn, struct mt_mactelne } } else { - syslog(LOG_WARNING, "(%d) Unhandeled control packet type: %d", curconn->seskey, cpkt.cptype); + syslog(LOG_WARNING, _("(%d) Unhandeled control packet type: %d"), curconn->seskey, cpkt.cptype); } /* Parse next control packet */ @@ -636,7 +641,7 @@ static void handle_packet(unsigned char *data, int data_len, const struct sockad break; case MT_PTYPE_SESSIONSTART: - syslog(LOG_DEBUG, "(%d) New connection from %s.", pkthdr.seskey, ether_ntoa((struct ether_addr*)&(pkthdr.srcaddr))); + syslog(LOG_DEBUG, _("(%d) New connection from %s."), pkthdr.seskey, ether_ntoa((struct ether_addr*)&(pkthdr.srcaddr))); curconn = calloc(1, sizeof(struct mt_connection)); curconn->seskey = pkthdr.seskey; curconn->lastdata = time(NULL); @@ -664,7 +669,7 @@ static void handle_packet(unsigned char *data, int data_len, const struct sockad init_packet(&pdata, MT_PTYPE_END, pkthdr.dstaddr, pkthdr.srcaddr, pkthdr.seskey, pkthdr.counter); send_udp(curconn, &pdata); } - syslog(LOG_DEBUG, "(%d) Connection closed.", curconn->seskey); + syslog(LOG_DEBUG, _("(%d) Connection closed."), curconn->seskey); list_remove_connection(curconn); return; @@ -710,7 +715,7 @@ static void handle_packet(unsigned char *data, int data_len, const struct sockad break; default: if (curconn) { - syslog(LOG_WARNING, "(%d) Unhandeled packet type: %d", curconn->seskey, pkthdr.ptype); + syslog(LOG_WARNING, _("(%d) Unhandeled packet type: %d"), curconn->seskey, pkthdr.ptype); init_packet(&pdata, MT_PTYPE_ACK, pkthdr.dstaddr, pkthdr.srcaddr, pkthdr.seskey, pkthdr.counter); send_udp(curconn, &pdata); } @@ -802,14 +807,14 @@ void mndp_broadcast() { void sigterm_handler() { struct mt_connection *p; struct mt_packet pdata; - char message[] = "\r\n\r\nDaemon shutting down.\r\n"; + char message[] = gettext_noop("\r\n\r\nDaemon shutting down.\r\n"); - syslog(LOG_NOTICE, "Daemon shutting down"); + syslog(LOG_NOTICE, _("Daemon shutting down")); for (p = connections_head; p != NULL; p = p->next) { if (p->state == STATE_ACTIVE) { init_packet(&pdata, MT_PTYPE_DATA, p->interface->mac_addr, p->srcmac, p->seskey, p->outcounter); - add_control_packet(&pdata, MT_CPTYPE_PLAINDATA, message, strlen(message)); + add_control_packet(&pdata, MT_CPTYPE_PLAINDATA, _(message), strlen(_(message))); send_udp(p, &pdata); init_packet(&pdata, MT_PTYPE_END, p->interface->mac_addr, p->srcmac, p->seskey, p->outcounter); @@ -835,7 +840,7 @@ void sighup_handler() { int i; struct mt_connection *p; - syslog(LOG_NOTICE, "SIGHUP: Reloading interfaces"); + syslog(LOG_NOTICE, _("SIGHUP: Reloading interfaces")); if (!use_raw_socket) { for (i = 0; i < MAX_INTERFACES; ++i) { @@ -846,7 +851,7 @@ void sighup_handler() { bzero(interfaces, sizeof(interfaces)); if (net_get_interfaces(interfaces, MAX_INTERFACES) <= 0) { - syslog(LOG_ERR, "No devices found! Exiting.\n"); + syslog(LOG_ERR, _("No devices found! Exiting.\n")); exit(1); } @@ -860,7 +865,7 @@ void sighup_handler() { p->interface = interface; } else { struct mt_connection tmp; - syslog(LOG_NOTICE, "(%d) Connection closed because interface %s is gone.", p->seskey, p->interface_name); + syslog(LOG_NOTICE, _("(%d) Connection closed because interface %s is gone."), p->seskey, p->interface_name); tmp.next = p->next; list_remove_connection(p); p = &tmp; @@ -884,6 +889,10 @@ int main (int argc, char **argv) { int foreground = 0; int interface_count = 0; + setlocale(LC_ALL, ""); + bindtextdomain("mactelnet","/usr/share/locale"); + textdomain("mactelnet"); + while ((c = getopt(argc, argv, "fnvh?")) != -1) { switch (c) { case 'f': @@ -909,20 +918,20 @@ int main (int argc, char **argv) { if (print_help) { print_version(); - fprintf(stderr, "Usage: %s [-f|-n|-h]\n", argv[0]); + fprintf(stderr, _("Usage: %s [-f|-n|-h]\n"), argv[0]); if (print_help) { - fprintf(stderr, "\nParameters:\n"); - fprintf(stderr, " -f Run process in foreground.\n"); - fprintf(stderr, " -n Do not use broadcast packets. Just a tad less insecure.\n"); - fprintf(stderr, " -h This help.\n"); - fprintf(stderr, "\n"); + fprintf(stderr, _("\nParameters:\n" + " -f Run process in foreground.\n" + " -n Do not use broadcast packets. Just a tad less insecure.\n" + " -h This help.\n" + "\n")); } return 1; } if (geteuid() != 0) { - fprintf(stderr, "You need to have root privileges to use %s.\n", argv[0]); + fprintf(stderr, _("You need to have root privileges to use %s.\n"), argv[0]); return 1; } @@ -963,7 +972,7 @@ int main (int argc, char **argv) { /* Bind to udp port */ if (bind(insockfd, (struct sockaddr *)&si_me, sizeof(si_me))==-1) { - fprintf(stderr, "Error binding to %s:%d, %s\n", inet_ntoa(si_me.sin_addr), sourceport, strerror(errno)); + fprintf(stderr, _("Error binding to %s:%d, %s\n"), inet_ntoa(si_me.sin_addr), sourceport, strerror(errno)); return 1; } @@ -985,11 +994,11 @@ int main (int argc, char **argv) { /* Bind to udp port */ if (bind(mndpsockfd, (struct sockaddr *)&si_me_mndp, sizeof(si_me_mndp))==-1) { - fprintf(stderr, "MNDP: Error binding to %s:%d, %s\n", inet_ntoa(si_me_mndp.sin_addr), MT_MNDP_PORT, strerror(errno)); + fprintf(stderr, _("MNDP: Error binding to %s:%d, %s\n"), inet_ntoa(si_me_mndp.sin_addr), MT_MNDP_PORT, strerror(errno)); } openlog("mactelnetd", LOG_PID, LOG_DAEMON); - syslog(LOG_NOTICE, "Bound to %s:%d", inet_ntoa(si_me.sin_addr), sourceport); + syslog(LOG_NOTICE, _("Bound to %s:%d"), inet_ntoa(si_me.sin_addr), sourceport); /* Enumerate available interfaces */ net_get_interfaces(interfaces, MAX_INTERFACES); @@ -1015,7 +1024,7 @@ int main (int argc, char **argv) { } if (interface_count == 0) { - syslog(LOG_ERR, "Unable to find any valid network interfaces\n"); + syslog(LOG_ERR, _("Unable to find any valid network interfaces\n")); exit(1); } @@ -1091,9 +1100,9 @@ int main (int argc, char **argv) { init_packet(&pdata, MT_PTYPE_END, p->dstmac, p->srcmac, p->seskey, p->outcounter); send_udp(p, &pdata); if (p->username != NULL) { - syslog(LOG_INFO, "(%d) Connection to user %s closed.", p->seskey, p->username); + syslog(LOG_INFO, _("(%d) Connection to user %s closed."), p->seskey, p->username); } else { - syslog(LOG_INFO, "(%d) Connection closed.", p->seskey); + syslog(LOG_INFO, _("(%d) Connection closed."), p->seskey); } tmp.next = p->next; list_remove_connection(p); @@ -1101,7 +1110,7 @@ int main (int argc, char **argv) { } } else if (p->state == STATE_ACTIVE && p->ptsfd > 0 && p->wait_for_ack == 1 && FD_ISSET(p->ptsfd, &read_fds)) { - printf("(%d) Waiting for ack\n", p->seskey); + printf(_("(%d) Waiting for ack\n"), p->seskey); } } /* Handle select() timeout */ @@ -1117,9 +1126,9 @@ int main (int argc, char **argv) { struct mt_connection *p,tmp; for (p = connections_head; p != NULL; p = p->next) { if (now - p->lastdata >= MT_CONNECTION_TIMEOUT) { - syslog(LOG_INFO, "(%d) Session timed out", p->seskey); + syslog(LOG_INFO, _("(%d) Session timed out"), p->seskey); init_packet(&pdata, MT_PTYPE_DATA, p->dstmac, p->srcmac, p->seskey, p->outcounter); - add_control_packet(&pdata, MT_CPTYPE_PLAINDATA, "Timeout\r\n", 9); + add_control_packet(&pdata, MT_CPTYPE_PLAINDATA, _("Timeout\r\n"), 9); send_udp(p, &pdata); init_packet(&pdata, MT_PTYPE_END, p->dstmac, p->srcmac, p->seskey, p->outcounter); send_udp(p, &pdata); |