.BI \-k
]
[
+.BI \-u
+]
+[
.BI \-2 " outfile"
]
[
.BI \-k
if someone else is connected to your country, kill their connection
.TP
+.BI \-u
+use UTF-8 rather than ASCII character set
+.IP
+This requires server version 4.2.21 or later, and a terminal that
+understands UTF-8.
+.TP
.BI \-2 " outfile"
redirect output to
.I outfile
#endif
int
-expect(int s, int match, char *buf)
+recvline(int s, char *buf)
{
int size;
char *p;
ptr = buf;
n = recv(s, ptr, size, MSG_PEEK);
if (n <= 0) {
- fprintf(stderr, "Expecting code %d\n", match);
#ifdef _WIN32
errno = WSAGetLastError();
#endif
}
ptr += n;
if ((n = recv(s, ptr, size, MSG_PEEK)) <= 0) {
- fprintf(stderr, "Expecting %d, got %s\n", match, buf);
+#ifdef _WIN32
+ errno = WSAGetLastError();
+#endif
+ perror("recv");
return 0;
}
size -= n;
(void)alarm(0);
#endif
if (!isxdigit(*buf)) {
- fprintf(stderr, "Expecting %d, got %s\n", match, buf);
+ fprintf(stderr, "Malformed line %s\n", buf);
return 0;
}
if (isdigit(*buf))
*buf = tolower(*buf);
code = 10 + *buf - 'a';
}
- if (code == match)
- return 1;
- return 0;
+ return code;
+}
+
+int
+expect(int s, int match, char *buf)
+{
+ int code = recvline(s, buf);
+ return code == match;
}
void
#endif
int
-login(int s, char *uname, char *cname, char *cpass, int kill_proc)
+login(int s, char *uname, char *cname, char *cpass, int kill_proc, int utf8)
{
char tmp[128];
char buf[1024];
char *ptr;
char *p;
- int len;
+ int len, code;
if (!expect(s, C_INIT, buf))
return 0;
(void)sendcmd(s, "user", uname);
if (!expect(s, C_CMDOK, buf))
return 0;
+ if (utf8) {
+ sendcmd(s, "options", "utf-8");
+ for (;;) {
+ code = recvline(s, buf);
+ if (code == C_CMDOK)
+ break;
+ if (code != C_DATA) {
+ fprintf(stderr, "Server doesn't support UTF-8\n");
+ return 0;
+ }
+ }
+ }
if (cname == NULL) {
(void)printf("Country name? ");
cname = fgets(tmp, sizeof(tmp), stdin);
#define RETRY 3
+int eight_bit_clean;
int interrupt;
int sock;
char *pname;
char *uname;
int send_kill = 0;
+ int utf8 = 0;
#ifdef _WIN32
err = WSAStartup(0x0101, &WsaData);
} else if (strcmp(ptr, "-k") == 0) {
send_kill = 1;
continue;
+ } else if (strcmp(ptr, "-u") == 0) {
+ utf8 = eight_bit_clean = 1;
+ continue;
}
argv[j] = argv[i];
++j;
uname = "nobody";
#endif
}
- if (!login(sock, uname, cname, pname, send_kill)) {
+ if (!login(sock, uname, cname, pname, send_kill, utf8)) {
close(sock);
exit(1);
}
extern char empirehost[];
extern char empireport[];
+extern int eight_bit_clean;
extern int interrupt;
extern char num_teles[];
extern int sock;
#endif
void getsose(void);
+int recvline(int s, char *buf);
int expect(int s, int match, char *buf);
int handleintr(int);
int hostaddr(char *name, struct sockaddr_in *addr);
int hostconnect(struct sockaddr_in *addr);
int hostport(char *name, struct sockaddr_in *addr);
-int login(int s, char *uname, char *cname, char *cpass, int kill_proc);
+int login(int s, char *uname, char *cname, char *cpass, int kill_proc, int);
void saveargv(int ac, char **src, char **dst);
void sendcmd(int s, char *cmd, char *arg);
int sendeof(int sock);
char c;
while ((c = *buf++)) {
- if (c & 0x80) {
- for (sop = SO; putc(*sop, stdout); sop++) ;
- (void)putc(c & 0x7f, stdout);
- for (sop = SE; putc(*sop, stdout); sop++) ;
+ if (eight_bit_clean) {
+ if (c == 14) fputs(SO, stdout);
+ else if (c == 15) fputs(SE, stdout);
+ else putchar(c);
+ } else if (c & 0x80) {
+ fputs(SO, stdout);
+ putchar(c & 0x7f);
+ fputs(SE, stdout);
} else
- (void)putc(c, stdout);
+ putchar(c);
}
}