From 0eb707fdcf1b87e71bb3a9eaa8472d0b05799a3d Mon Sep 17 00:00:00 2001 From: Terry Dawson VK2KTJ Date: Wed, 12 Sep 2001 13:18:43 +0000 Subject: updated libtool, uniformly indented source, corrected small ax25mond Makefile bug --- call/call.c | 3491 +++++++++++++++++++++++++++++++---------------------------- 1 file changed, 1858 insertions(+), 1633 deletions(-) (limited to 'call/call.c') diff --git a/call/call.c b/call/call.c index 6139990..aa0412d 100644 --- a/call/call.c +++ b/call/call.c @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -91,22 +92,22 @@ int paclen = 0; int fd; typedef struct { - char file_name[255]; - long dwn_cnt; - int dwn_file; - int file_crc; - int calc_crc; - struct utimbuf ut; - int new_header; + char file_name[255]; + long dwn_cnt; + int dwn_file; + int file_crc; + int calc_crc; + struct utimbuf ut; + int new_header; } t_gp; typedef struct { - WINDOW *ptr; - int max_y; - int max_x; - char string[MAX_BUFLEN]; - int bytes; - int curs_pos; + WINDOW *ptr; + int max_y; + int max_x; + char string[MAX_BUFLEN]; + int bytes; + int curs_pos; } t_win; #define TALKMODE 001 /* two windows (outgoing and incoming) with menu */ @@ -114,1847 +115,2071 @@ typedef struct { #define RAWMODE 004 /* mode used by earlier versions */ WINDOW *win; -const char *key_words[] = -{"//", - "#BIN#", - " go_7+. ", - " stop_7+. ", - "\0" +const char *key_words[] = { "//", + "#BIN#", + " go_7+. ", + " stop_7+. ", + "\0" }; #define MAXCMDLEN 10 void convert_cr_lf(char *buf, int len) { - while (len--) { - if (*buf == '\r') - *buf = '\n'; - buf++; - } + while (len--) { + if (*buf == '\r') + *buf = '\n'; + buf++; + } } void convert_lf_cr(char *buf, int len) { - while (len--) { - if (*buf == '\n') - *buf = '\r'; - buf++; - } + while (len--) { + if (*buf == '\n') + *buf = '\r'; + buf++; + } } void convert_upper_lower(char *buf, int len) { - while (len--) { - *buf = tolower(*buf); - buf++; - } + while (len--) { + *buf = tolower(*buf); + buf++; + } } static int nr_convert_call(char *address, struct full_sockaddr_ax25 *addr) { - char buffer[100], *call, *alias; - FILE *fp; - int addrlen; + char buffer[100], *call, *alias; + FILE *fp; + int addrlen; - for (call = address; *call != '\0'; call++) - *call = toupper(*call); + for (call = address; *call != '\0'; call++) + *call = toupper(*call); - if ((fp = fopen(PROC_NR_NODES_FILE, "r")) == NULL) { - fprintf(stderr, "call: NET/ROM not included in the kernel\n"); - return -1; - } - fgets(buffer, 100, fp); - - while (fgets(buffer, 100, fp) != NULL) { - call = strtok(buffer, " \t\n\r"); - alias = strtok(NULL, " \t\n\r"); - - if (strcmp(address, call) == 0 || strcmp(address, alias) == 0) { - addrlen = ax25_aton(call, addr); - fclose(fp); - return (addrlen == -1) ? -1 : sizeof(struct sockaddr_ax25); + if ((fp = fopen(PROC_NR_NODES_FILE, "r")) == NULL) { + fprintf(stderr, + "call: NET/ROM not included in the kernel\n"); + return -1; + } + fgets(buffer, 100, fp); + + while (fgets(buffer, 100, fp) != NULL) { + call = strtok(buffer, " \t\n\r"); + alias = strtok(NULL, " \t\n\r"); + + if (strcmp(address, call) == 0 + || strcmp(address, alias) == 0) { + addrlen = ax25_aton(call, addr); + fclose(fp); + return (addrlen == + -1) ? -1 : sizeof(struct sockaddr_ax25); + } } - } - fclose(fp); + fclose(fp); - fprintf(stderr, "call: NET/ROM callsign or alias not found\n"); + fprintf(stderr, "call: NET/ROM callsign or alias not found\n"); - return -1; + return -1; } static int connect_to(char *address[]) { - int fd = 0; - int addrlen = 0; - union { - struct full_sockaddr_ax25 ax25; - struct sockaddr_rose rose; - } sockaddr; - char *digi; - int one = debug; - - switch (af_mode) { - case AF_ROSE: - if (address[0] == NULL || address[1] == NULL) { - fprintf(stderr, "call: too few arguments for Rose\n"); - return (-1); - } - if ((fd = socket(AF_ROSE, SOCK_SEQPACKET, 0)) < 0) { - perror("socket"); - return (-1); - } - break; + int fd = 0; + int addrlen = 0; + union { + struct full_sockaddr_ax25 ax25; + struct sockaddr_rose rose; + } sockaddr; + char *digi; + int one = debug; + + switch (af_mode) { + case AF_ROSE: + if (address[0] == NULL || address[1] == NULL) { + fprintf(stderr, + "call: too few arguments for Rose\n"); + return (-1); + } + if ((fd = socket(AF_ROSE, SOCK_SEQPACKET, 0)) < 0) { + perror("socket"); + return (-1); + } + break; - case AF_NETROM: - if (address[0] == NULL) { - fprintf(stderr, "call: too few arguments for NET/ROM\n"); - return (-1); - } - if ((fd = socket(AF_NETROM, SOCK_SEQPACKET, 0)) < 0) { - perror("socket"); - return (-1); - } - ax25_aton(nr_config_get_addr(port), &sockaddr.ax25); - sockaddr.ax25.fsa_ax25.sax25_family = AF_NETROM; - addrlen = sizeof(struct full_sockaddr_ax25); - break; - - case AF_AX25: - if (address[0] == NULL) { - fprintf(stderr, "call: too few arguments for AX.25\n"); - return (-1); - } - if ((fd = socket(AF_AX25, SOCK_SEQPACKET, 0)) < 0) { - perror("socket"); - return (-1); - } - ax25_aton(ax25_config_get_addr(port), &sockaddr.ax25); - if (sockaddr.ax25.fsa_ax25.sax25_ndigis == 0) { - ax25_aton_entry(ax25_config_get_addr(port), - sockaddr.ax25.fsa_digipeater[0].ax25_call); - sockaddr.ax25.fsa_ax25.sax25_ndigis = 1; - } - sockaddr.ax25.fsa_ax25.sax25_family = AF_AX25; - addrlen = sizeof(struct full_sockaddr_ax25); + case AF_NETROM: + if (address[0] == NULL) { + fprintf(stderr, + "call: too few arguments for NET/ROM\n"); + return (-1); + } + if ((fd = socket(AF_NETROM, SOCK_SEQPACKET, 0)) < 0) { + perror("socket"); + return (-1); + } + ax25_aton(nr_config_get_addr(port), &sockaddr.ax25); + sockaddr.ax25.fsa_ax25.sax25_family = AF_NETROM; + addrlen = sizeof(struct full_sockaddr_ax25); + break; - if (setsockopt(fd, SOL_AX25, AX25_WINDOW, &window, sizeof(window)) == -1) { - perror("AX25_WINDOW"); - close(fd); - return (-1); - } - if (setsockopt(fd, SOL_AX25, AX25_PACLEN, &paclen, sizeof(paclen)) == -1) { - perror("AX25_PACLEN"); - close(fd); - return (-1); + case AF_AX25: + if (address[0] == NULL) { + fprintf(stderr, + "call: too few arguments for AX.25\n"); + return (-1); + } + if ((fd = socket(AF_AX25, SOCK_SEQPACKET, 0)) < 0) { + perror("socket"); + return (-1); + } + ax25_aton(ax25_config_get_addr(port), &sockaddr.ax25); + if (sockaddr.ax25.fsa_ax25.sax25_ndigis == 0) { + ax25_aton_entry(ax25_config_get_addr(port), + sockaddr.ax25.fsa_digipeater[0]. + ax25_call); + sockaddr.ax25.fsa_ax25.sax25_ndigis = 1; + } + sockaddr.ax25.fsa_ax25.sax25_family = AF_AX25; + addrlen = sizeof(struct full_sockaddr_ax25); + + if (setsockopt + (fd, SOL_AX25, AX25_WINDOW, &window, + sizeof(window)) == -1) { + perror("AX25_WINDOW"); + close(fd); + return (-1); + } + if (setsockopt + (fd, SOL_AX25, AX25_PACLEN, &paclen, + sizeof(paclen)) == -1) { + perror("AX25_PACLEN"); + close(fd); + return (-1); + } + if (backoff != -1) { + if (setsockopt + (fd, SOL_AX25, AX25_BACKOFF, &backoff, + sizeof(backoff)) == -1) { + perror("AX25_BACKOFF"); + close(fd); + return (-1); + } + } + if (ax25mode != -1) { + if (setsockopt + (fd, SOL_AX25, AX25_EXTSEQ, &ax25mode, + sizeof(ax25mode)) == -1) { + perror("AX25_EXTSEQ"); + close(fd); + return (-1); + } + } + break; } - if (backoff != -1) { - if (setsockopt(fd, SOL_AX25, AX25_BACKOFF, &backoff, sizeof(backoff)) == -1) { - perror("AX25_BACKOFF"); + + if (debug + && setsockopt(fd, SOL_SOCKET, SO_DEBUG, &one, + sizeof(one)) == -1) { + perror("SO_DEBUG"); close(fd); return (-1); - } } - if (ax25mode != -1) { - if (setsockopt(fd, SOL_AX25, AX25_EXTSEQ, &ax25mode, sizeof(ax25mode)) == -1) { - perror("AX25_EXTSEQ"); - close(fd); - return (-1); - } + if (af_mode != AF_ROSE) { /* Let Rose autobind */ + if (bind(fd, (struct sockaddr *) &sockaddr, addrlen) == -1) { + perror("bind"); + close(fd); + return (-1); + } } - break; - } + switch (af_mode) { + case AF_ROSE: + memset(&sockaddr.rose, 0x00, sizeof(struct sockaddr_rose)); + + if (ax25_aton_entry + (address[0], + sockaddr.rose.srose_call.ax25_call) == -1) { + close(fd); + return (-1); + } + if (rose_aton + (address[1], + sockaddr.rose.srose_addr.rose_addr) == -1) { + close(fd); + return (-1); + } + if (address[2] != NULL) { + digi = address[2]; + if (strcasecmp(address[2], "VIA") == 0) { + if (address[3] == NULL) { + fprintf(stderr, + "call: callsign must follow 'via'\n"); + close(fd); + return (-1); + } + digi = address[3]; + } + if (ax25_aton_entry + (digi, + sockaddr.rose.srose_digi.ax25_call) == -1) { + close(fd); + return (-1); + } + sockaddr.rose.srose_ndigis = 1; + } + sockaddr.rose.srose_family = AF_ROSE; + addrlen = sizeof(struct sockaddr_rose); + break; - if (debug && setsockopt(fd, SOL_SOCKET, SO_DEBUG, &one, sizeof(one)) == -1) { - perror("SO_DEBUG"); - close(fd); - return (-1); - } - if (af_mode != AF_ROSE) { /* Let Rose autobind */ - if (bind(fd, (struct sockaddr *) &sockaddr, addrlen) == -1) { - perror("bind"); - close(fd); - return (-1); - } - } - switch (af_mode) { - case AF_ROSE: - memset(&sockaddr.rose, 0x00, sizeof(struct sockaddr_rose)); - - if (ax25_aton_entry(address[0], sockaddr.rose.srose_call.ax25_call) == -1) { - close(fd); - return (-1); - } - if (rose_aton(address[1], sockaddr.rose.srose_addr.rose_addr) == -1) { - close(fd); - return (-1); - } - if (address[2] != NULL) { - digi = address[2]; - if (strcasecmp(address[2], "VIA") == 0) { - if (address[3] == NULL) { - fprintf(stderr, "call: callsign must follow 'via'\n"); - close(fd); - return (-1); + case AF_NETROM: + if (nr_convert_call(address[0], &sockaddr.ax25) == -1) { + close(fd); + return (-1); } - digi = address[3]; - } - if (ax25_aton_entry(digi, sockaddr.rose.srose_digi.ax25_call) == -1) { - close(fd); - return (-1); - } - sockaddr.rose.srose_ndigis = 1; - } - sockaddr.rose.srose_family = AF_ROSE; - addrlen = sizeof(struct sockaddr_rose); - break; - - case AF_NETROM: - if (nr_convert_call(address[0], &sockaddr.ax25) == -1) { - close(fd); - return (-1); - } - sockaddr.rose.srose_family = AF_NETROM; - addrlen = sizeof(struct sockaddr_ax25); - break; - - case AF_AX25: - if (ax25_aton_arglist((const char**)address, &sockaddr.ax25) == -1) { - close(fd); - return (-1); + sockaddr.rose.srose_family = AF_NETROM; + addrlen = sizeof(struct sockaddr_ax25); + break; + + case AF_AX25: + if (ax25_aton_arglist + ((const char **) address, &sockaddr.ax25) == -1) { + close(fd); + return (-1); + } + sockaddr.rose.srose_family = AF_AX25; + addrlen = sizeof(struct full_sockaddr_ax25); + break; } - sockaddr.rose.srose_family = AF_AX25; - addrlen = sizeof(struct full_sockaddr_ax25); - break; - } - printf("Trying...\r"); - fflush(stdout); + printf("Trying...\r"); + fflush(stdout); - if (connect(fd, (struct sockaddr *) &sockaddr, addrlen)) { - printf("\n"); - perror("connect"); - close(fd); - return (-1); - } - printf("*** Connected to %s\n", address[0]); + if (connect(fd, (struct sockaddr *) &sockaddr, addrlen)) { + printf("\n"); + perror("connect"); + close(fd); + return (-1); + } + printf("*** Connected to %s\n", address[0]); - return (fd); + return (fd); } void cmd_intr(int sig) { - signal(SIGQUIT, cmd_intr); - interrupted = TRUE; + signal(SIGQUIT, cmd_intr); + interrupted = TRUE; } void statline(int mode, char *s) { - static int oldlen = 0; - int l, cnt; + static int oldlen = 0; + int l, cnt; + + if (*s == '\0') { + if (mode == RAWMODE) + return; + if (oldlen > 0) { + move(0, STATW_STAT); + attron(A_REVERSE); + for (cnt = 0; cnt < oldlen; cnt++) + addch(' '); + oldlen = 0; + attroff(A_REVERSE); + refresh(); + } + return; + } + if (mode == RAWMODE) { + printf(">>%s\n", s); + return; + } + if (strlen(s) > 80 - STATW_STAT) + s[80 - STATW_STAT] = '\0'; - if (*s == '\0') { - if (mode == RAWMODE) - return; - if (oldlen > 0) { - move(0, STATW_STAT); - attron(A_REVERSE); - for (cnt = 0; cnt < oldlen; cnt++) - addch(' '); - oldlen = 0; - attroff(A_REVERSE); - refresh(); + move(0, STATW_STAT); + + attron(A_REVERSE); + addstr(s); + + if (oldlen > strlen(s)) { + l = oldlen - strlen(s); + for (cnt = 0; cnt < l; cnt++) + addch(' '); } - return; - } - if (mode == RAWMODE) { - printf(">>%s\n", s); - return; - } - if (strlen(s) > 80 - STATW_STAT) - s[80 - STATW_STAT] = '\0'; - - move(0, STATW_STAT); - - attron(A_REVERSE); - addstr(s); - - if (oldlen > strlen(s)) { - l = oldlen - strlen(s); - for (cnt = 0; cnt < l; cnt++) - addch(' '); - } - attroff(A_REVERSE); - oldlen = strlen(s); - refresh(); + attroff(A_REVERSE); + oldlen = strlen(s); + refresh(); } -WINDOW * - opnstatw(int mode, wint * wintab, char *s, int lines, int cols) +WINDOW *opnstatw(int mode, wint * wintab, char *s, int lines, int cols) { - WINDOW *win; + WINDOW *win; - if (mode == RAWMODE) { - printf(">>%s\n", s); - return NULL; - } - win = winopen(wintab, lines, cols, ((LINES - 1) - lines) / 2, ((COLS) - cols) / 2, TRUE); - mvwaddstr(win, 1, 1 + (cols - strlen(s)) / 2, s); - wmove(win, 3, 2); + if (mode == RAWMODE) { + printf(">>%s\n", s); + return NULL; + } + win = + winopen(wintab, lines, cols, ((LINES - 1) - lines) / 2, + ((COLS) - cols) / 2, TRUE); + mvwaddstr(win, 1, 1 + (cols - strlen(s)) / 2, s); + wmove(win, 3, 2); - return win; + return win; } void wrdstatw(WINDOW * win, char s[]) { - int y, x; + int y, x; - if (win == NULL) { - printf(" %s\n", s); - return; - } - waddstr(win, s); - getyx(win, y, x); - wmove(win, y + 1, 2); - wrefresh(win); + if (win == NULL) { + printf(" %s\n", s); + return; + } + waddstr(win, s); + getyx(win, y, x); + wmove(win, y + 1, 2); + wrefresh(win); } void dupdstatw(WINDOW * win, char *s, int add) { - static char infostr[80]; - static int y, x; - static int oldlen; - int l, cnt; - - if (add) { - oldlen = 0; - strcpy(infostr, s); + static char infostr[80]; + static int y, x; + static int oldlen; + int l, cnt; + + if (add) { + oldlen = 0; + strcpy(infostr, s); + + if (win == NULL) { + printf(" %s", s); + return; + } + waddstr(win, s); + getyx(win, y, x); + wrefresh(win); + return; + } if (win == NULL) { - printf(" %s", s); - return; + printf("\r %s%s", infostr, s); + } else { + mvwaddstr(win, y, x, s); } - waddstr(win, s); - getyx(win, y, x); - wrefresh(win); - return; - } - if (win == NULL) { - printf("\r %s%s", infostr, s); - } else { - mvwaddstr(win, y, x, s); - } - - if (oldlen > strlen(s)) { - l = oldlen - strlen(s); - for (cnt = 0; cnt < l; cnt++) - if (win == NULL) - printf(" "); - else - waddch(win, ' '); - } - if (win == NULL) { - fflush(stdout); - } else { - wrefresh(win); - } + if (oldlen > strlen(s)) { + l = oldlen - strlen(s); + for (cnt = 0; cnt < l; cnt++) + if (win == NULL) + printf(" "); + else + waddch(win, ' '); + } + if (win == NULL) { + fflush(stdout); + } else { + wrefresh(win); + } - oldlen = strlen(s); + oldlen = strlen(s); } -int start_ab_download(int mode, WINDOW ** swin, wint * wintab, char parms[], int parmsbytes, char buf[], int bytes, t_gp * gp, char *address[]) +int start_ab_download(int mode, WINDOW ** swin, wint * wintab, + char parms[], int parmsbytes, char buf[], int bytes, + t_gp * gp, char *address[]) { - int crcst; /* startposition crc-field */ - int datest = 0; /* startposition date-field */ - int namest = 0; /* startposition name-field */ - int cnt; - int date = 0; - struct tm ft; - char s[80]; - - for (crcst = 2; (!(parms[crcst - 2] == '#' - && parms[crcst - 1] == '|') - && crcst < parmsbytes - 1); crcst++); - - if (crcst < parmsbytes - 1) { - gp->file_crc = atoi(parms + crcst); - - for (datest = crcst; (!(parms[datest - 2] == '#' - && parms[datest - 1] == '$')); datest++); - - date = (int) strtol(parms + datest, NULL, 16); - ft.tm_sec = (date & 0x1F) * 2; - date >>= 5; - ft.tm_min = date & 0x3F; - date >>= 6; - ft.tm_hour = date & 0x1F; - date >>= 5; - ft.tm_mday = date & 0x1F; - date >>= 5; - ft.tm_mon = date & 0x0F; - date >>= 4; - ft.tm_year = (date & 0x7F) + 70; - ft.tm_isdst = 0; - ft.tm_yday = 0; - ft.tm_wday = 0; - gp->ut.actime = mktime(&ft); - gp->ut.modtime = gp->ut.actime; - - for (namest = datest; (parms[namest - 1] != '#' && - namest < parmsbytes - 1); namest++); - } else { - gp->ut.actime = 0; - gp->ut.modtime = 0; - } - - gp->dwn_cnt = atol(parms); - strcpy(gp->file_name, STD_DWN_DIR); - - if (crcst == parmsbytes - 1 || datest - crcst > 7 || namest - datest > 10) { - *swin = opnstatw(mode, wintab, "Remote starts AutoBin transfer", 6, 52); - gp->new_header = FALSE; - wrdstatw(*swin, "old styled Header (no filename)"); - strcat(gp->file_name, address[0]); - strcat(gp->file_name, ".dwnfile"); - } else { - *swin = opnstatw(mode, wintab, "Remote starts AutoBin transfer", 10, 52); - gp->new_header = TRUE; - for (cnt = parmsbytes - namest; !(parms[cnt + namest - 1] == '\\' || parms[cnt + namest - 1] == '/') && cnt > 0; cnt--); - strncpy(s, &parms[namest + cnt], parmsbytes - namest - cnt); - convert_upper_lower(s, parmsbytes - namest - cnt); - strncat(gp->file_name, s, parmsbytes - namest - cnt); - gp->file_name[strlen(gp->file_name) + parmsbytes - namest - cnt - 1] = 0; - - sprintf(s, "size of file : %u", (unsigned int) gp->dwn_cnt); - wrdstatw(*swin, s); - sprintf(s, "filename : %s", gp->file_name); - wrdstatw(*swin, s); - sprintf(s, "last mod. date : %02i.%02i.%04i", ft.tm_mday, ft.tm_mon, ft.tm_year + 1900); - wrdstatw(*swin, s); - sprintf(s, "last mod. time : %02i:%02i:%02i", ft.tm_hour, ft.tm_min, ft.tm_sec); - wrdstatw(*swin, s); - } - - dupdstatw(*swin, "Bytes to receive: ", TRUE); - - if ((gp->dwn_file = open(gp->file_name, O_RDWR | O_CREAT, 0666)) == -1) { - sprintf(s, "Unable to open %s", gp->file_name); - statline(mode, s); - if (write(fd, "#ABORT#\r", 8) == -1) { - perror("write"); - gp->dwn_cnt = 0; - gp->file_name[0] = '\0'; - return -1; - } - } - if (bytes == 1) { - if (write(fd, "#OK#\r", 5) == -1) { - perror("write"); - gp->dwn_cnt = 0; - gp->file_name[0] = '\0'; - return -1; + int crcst; /* startposition crc-field */ + int datest = 0; /* startposition date-field */ + int namest = 0; /* startposition name-field */ + int cnt; + int date = 0; + struct tm ft; + char s[80]; + + for (crcst = 2; (!(parms[crcst - 2] == '#' + && parms[crcst - 1] == '|') + && crcst < parmsbytes - 1); crcst++); + + if (crcst < parmsbytes - 1) { + gp->file_crc = atoi(parms + crcst); + + for (datest = crcst; (!(parms[datest - 2] == '#' + && parms[datest - 1] == '$')); + datest++); + + date = (int) strtol(parms + datest, NULL, 16); + ft.tm_sec = (date & 0x1F) * 2; + date >>= 5; + ft.tm_min = date & 0x3F; + date >>= 6; + ft.tm_hour = date & 0x1F; + date >>= 5; + ft.tm_mday = date & 0x1F; + date >>= 5; + ft.tm_mon = date & 0x0F; + date >>= 4; + ft.tm_year = (date & 0x7F) + 70; + ft.tm_isdst = 0; + ft.tm_yday = 0; + ft.tm_wday = 0; + gp->ut.actime = mktime(&ft); + gp->ut.modtime = gp->ut.actime; + + for (namest = datest; (parms[namest - 1] != '#' && + namest < parmsbytes - 1); namest++); + } else { + gp->ut.actime = 0; + gp->ut.modtime = 0; } - gp->calc_crc = 0; - } else { - write(gp->dwn_file, buf, bytes); - gp->calc_crc = calc_crc(buf, bytes, 0); - gp->dwn_cnt -= bytes; - } - - return 0; -} -int ab_down(int mode, WINDOW * swin, wint * wintab, char buf[], int *bytes, t_gp * gp) -{ - int extrach = 0; - char s[80]; - - if (strncmp(buf, "#ABORT#\r", 8) == 0 && *bytes == 8) { - gp->dwn_cnt = 0; - close(gp->dwn_file); - statline(mode, "Remote aborts AutoBin transfer!"); - *bytes = 0; - if (mode != RAWMODE) { - delwin(swin); - winclose(wintab); + gp->dwn_cnt = atol(parms); + strcpy(gp->file_name, STD_DWN_DIR); + + if (crcst == parmsbytes - 1 || datest - crcst > 7 + || namest - datest > 10) { + *swin = + opnstatw(mode, wintab, + "Remote starts AutoBin transfer", 6, 52); + gp->new_header = FALSE; + wrdstatw(*swin, "old styled Header (no filename)"); + strcat(gp->file_name, address[0]); + strcat(gp->file_name, ".dwnfile"); } else { - printf("\n"); + *swin = + opnstatw(mode, wintab, + "Remote starts AutoBin transfer", 10, 52); + gp->new_header = TRUE; + for (cnt = parmsbytes - namest; + !(parms[cnt + namest - 1] == '\\' + || parms[cnt + namest - 1] == '/') && cnt > 0; + cnt--); + strncpy(s, &parms[namest + cnt], + parmsbytes - namest - cnt); + convert_upper_lower(s, parmsbytes - namest - cnt); + strncat(gp->file_name, s, parmsbytes - namest - cnt); + gp->file_name[strlen(gp->file_name) + parmsbytes - namest - + cnt - 1] = 0; + + sprintf(s, "size of file : %u", + (unsigned int) gp->dwn_cnt); + wrdstatw(*swin, s); + sprintf(s, "filename : %s", gp->file_name); + wrdstatw(*swin, s); + sprintf(s, "last mod. date : %02i.%02i.%04i", ft.tm_mday, + ft.tm_mon, ft.tm_year + 1900); + wrdstatw(*swin, s); + sprintf(s, "last mod. time : %02i:%02i:%02i", ft.tm_hour, + ft.tm_min, ft.tm_sec); + wrdstatw(*swin, s); } - return 0; - } - if (gp->dwn_cnt < *bytes) { - extrach = *bytes - gp->dwn_cnt; - *bytes = gp->dwn_cnt; - } - if (write(gp->dwn_file, buf, *bytes) != *bytes) { - close(gp->dwn_file); - gp->dwn_cnt = 0; - statline(mode, "Error while writing download file. Download aborted."); - - if (mode != RAWMODE) { - delwin(swin); - winclose(wintab); + dupdstatw(*swin, "Bytes to receive: ", TRUE); + + if ((gp->dwn_file = + open(gp->file_name, O_RDWR | O_CREAT, 0666)) == -1) { + sprintf(s, "Unable to open %s", gp->file_name); + statline(mode, s); + if (write(fd, "#ABORT#\r", 8) == -1) { + perror("write"); + gp->dwn_cnt = 0; + gp->file_name[0] = '\0'; + return -1; + } + } + if (bytes == 1) { + if (write(fd, "#OK#\r", 5) == -1) { + perror("write"); + gp->dwn_cnt = 0; + gp->file_name[0] = '\0'; + return -1; + } + gp->calc_crc = 0; } else { - printf("\n"); + write(gp->dwn_file, buf, bytes); + gp->calc_crc = calc_crc(buf, bytes, 0); + gp->dwn_cnt -= bytes; } - } else { - gp->calc_crc = calc_crc(buf, *bytes, gp->calc_crc); - gp->dwn_cnt -= *bytes; - - if (gp->dwn_cnt == 0) { - if (mode != RAWMODE) { - delwin(swin); - winclose(wintab); - } else - printf("\n"); - strcpy(s, "AutoBin download finished "); - if (gp->new_header) - if (gp->calc_crc == gp->file_crc) - strcat(s, "CRC check ok"); - else { - strcat(s, "CRC check failed!"); - } else { - sprintf(s + strlen(s), "CRC=%u", gp->calc_crc); - } - statline(mode, s); - close(gp->dwn_file); - utime(gp->file_name, &gp->ut); - if (extrach != 0) { - memmove(buf, buf + *bytes, extrach); - *bytes = extrach; - } else + return 0; +} + +int ab_down(int mode, WINDOW * swin, wint * wintab, char buf[], int *bytes, + t_gp * gp) +{ + int extrach = 0; + char s[80]; + + if (strncmp(buf, "#ABORT#\r", 8) == 0 && *bytes == 8) { + gp->dwn_cnt = 0; + close(gp->dwn_file); + statline(mode, "Remote aborts AutoBin transfer!"); *bytes = 0; + if (mode != RAWMODE) { + delwin(swin); + winclose(wintab); + } else { + printf("\n"); + } + + return 0; + } + if (gp->dwn_cnt < *bytes) { + extrach = *bytes - gp->dwn_cnt; + *bytes = gp->dwn_cnt; + } + if (write(gp->dwn_file, buf, *bytes) != *bytes) { + close(gp->dwn_file); + gp->dwn_cnt = 0; + statline(mode, + "Error while writing download file. Download aborted."); + + if (mode != RAWMODE) { + delwin(swin); + winclose(wintab); + } else { + printf("\n"); + } } else { - sprintf(s, "%u", (unsigned int) gp->dwn_cnt); - dupdstatw(swin, s, FALSE); - *bytes = 0; + gp->calc_crc = calc_crc(buf, *bytes, gp->calc_crc); + gp->dwn_cnt -= *bytes; + + if (gp->dwn_cnt == 0) { + if (mode != RAWMODE) { + delwin(swin); + winclose(wintab); + } else + printf("\n"); + + strcpy(s, "AutoBin download finished "); + if (gp->new_header) + if (gp->calc_crc == gp->file_crc) + strcat(s, "CRC check ok"); + else { + strcat(s, "CRC check failed!"); + } else { + sprintf(s + strlen(s), "CRC=%u", + gp->calc_crc); + } + statline(mode, s); + close(gp->dwn_file); + utime(gp->file_name, &gp->ut); + if (extrach != 0) { + memmove(buf, buf + *bytes, extrach); + *bytes = extrach; + } else + *bytes = 0; + } else { + sprintf(s, "%u", (unsigned int) gp->dwn_cnt); + dupdstatw(swin, s, FALSE); + *bytes = 0; + } } - } - return 0; + return 0; } int start_screen(char *call[]) { - int cnt; - char idString[11]; - sprintf(idString, " %8s ", call[0]); + int cnt; + char idString[11]; + sprintf(idString, " %8s ", call[0]); + + if ((win = initscr()) == NULL) + return -1; + + attron(A_REVERSE); + move(0, 0); + addstr(idString); + addch(ACS_VLINE); + addstr("--------"); + addch(ACS_VLINE); + for (cnt = STATW_STAT; cnt <= 80; cnt++) + addch(' '); + attroff(A_REVERSE); - if ((win = initscr()) == NULL) - return -1; + noecho(); + raw(); + nodelay(win, TRUE); + keypad(win, TRUE); + refresh(); - attron(A_REVERSE); - move(0, 0); - addstr(idString); - addch(ACS_VLINE); - addstr("--------"); - addch(ACS_VLINE); - for (cnt = STATW_STAT; cnt <= 80; cnt++) - addch(' '); - attroff(A_REVERSE); - - noecho(); - raw(); - nodelay(win, TRUE); - keypad(win, TRUE); - refresh(); - - return 0; + return 0; } int start_slave_mode(wint * wintab, t_win * win_in, t_win * win_out) { - win_in->max_y = LINES - 2; - win_in->max_x = COLS; - win_in->ptr = winopen(wintab, win_in->max_y + 1, win_in->max_x, 1, 0, FALSE); - win_out->ptr = win_in->ptr; + win_in->max_y = LINES - 2; + win_in->max_x = COLS; + win_in->ptr = + winopen(wintab, win_in->max_y + 1, win_in->max_x, 1, 0, FALSE); + win_out->ptr = win_in->ptr; - scrollok(win_in->ptr, TRUE); + scrollok(win_in->ptr, TRUE); - wclear(win_out->ptr); - wrefresh(win_out->ptr); + wclear(win_out->ptr); + wrefresh(win_out->ptr); - win_out->bytes = 0; - win_out->curs_pos = 0; - win_in->bytes = 0; - win_in->curs_pos = 0; + win_out->bytes = 0; + win_out->curs_pos = 0; + win_in->bytes = 0; + win_in->curs_pos = 0; - return 0; + return 0; } int start_talk_mode(wint * wintab, t_win * win_in, t_win * win_out) { - int cnt; - WINDOW *win; - - win_out->max_y = 4; /* TXLINES */ - win_out->max_x = COLS; - win_in->max_y = (LINES - 4) - win_out->max_y; - win_in->max_x = COLS; - - win_out->ptr = winopen(wintab, win_out->max_y + 1, win_out->max_x, (win_in->max_y + 3), 0, FALSE); - win_in->ptr = winopen(wintab, win_in->max_y + 1, win_in->max_x, 1, 0, FALSE); - win = winopen(wintab, 1, win_out->max_x, win_in->max_y + 2, 0, FALSE); - - for (cnt = 0; cnt < COLS; cnt++) - waddch(win, '-'); - wrefresh(win); + int cnt; + WINDOW *win; + + win_out->max_y = 4; /* TXLINES */ + win_out->max_x = COLS; + win_in->max_y = (LINES - 4) - win_out->max_y; + win_in->max_x = COLS; + + win_out->ptr = + winopen(wintab, win_out->max_y + 1, win_out->max_x, + (win_in->max_y + 3), 0, FALSE); + win_in->ptr = + winopen(wintab, win_in->max_y + 1, win_in->max_x, 1, 0, FALSE); + win = + winopen(wintab, 1, win_out->max_x, win_in->max_y + 2, 0, + FALSE); + + for (cnt = 0; cnt < COLS; cnt++) + waddch(win, '-'); + wrefresh(win); - scrollok(win_in->ptr, TRUE); - scrollok(win_out->ptr, TRUE); + scrollok(win_in->ptr, TRUE); + scrollok(win_out->ptr, TRUE); - wclear(win_out->ptr); - wrefresh(win_out->ptr); - wclear(win_in->ptr); - wrefresh(win_in->ptr); + wclear(win_out->ptr); + wrefresh(win_out->ptr); + wclear(win_in->ptr); + wrefresh(win_in->ptr); - win_out->bytes = 0; - win_out->curs_pos = 0; - win_in->bytes = 0; - win_out->curs_pos = 0; + win_out->bytes = 0; + win_out->curs_pos = 0; + win_in->bytes = 0; + win_out->curs_pos = 0; - return 0; + return 0; } -int change_mode(int oldmode, int newmode, wint * wintab, t_win * win_in, t_win * win_out, char *call[]) +int change_mode(int oldmode, int newmode, wint * wintab, t_win * win_in, + t_win * win_out, char *call[]) { - switch (oldmode) { - case RAWMODE: - if (newmode == TALKMODE) { - start_screen(call); - start_talk_mode(wintab, win_in, win_out); - } - if (newmode == SLAVEMODE) { - start_screen(call); - start_slave_mode(wintab, win_in, win_out); - } - break; - - case TALKMODE: - if (newmode == RAWMODE) { - wclear(win_out->ptr); - wrefresh(win_out->ptr); - wclear(win_in->ptr); - wrefresh(win_in->ptr); - wintab->next = 0; - endwin(); - } - if (newmode == SLAVEMODE) { - delwin(win_out->ptr); - delwin(win_in->ptr); - wintab->next = 0; - start_slave_mode(wintab, win_in, win_out); - } - break; - - case SLAVEMODE: - if (newmode == RAWMODE) { - wclear(win_out->ptr); - wrefresh(win_out->ptr); - wintab->next = 0; - endwin(); - } - if (newmode == TALKMODE) { - delwin(win_out->ptr); - wintab->next = 0; - start_talk_mode(wintab, win_in, win_out); + switch (oldmode) { + case RAWMODE: + if (newmode == TALKMODE) { + start_screen(call); + start_talk_mode(wintab, win_in, win_out); + } + if (newmode == SLAVEMODE) { + start_screen(call); + start_slave_mode(wintab, win_in, win_out); + } + break; + + case TALKMODE: + if (newmode == RAWMODE) { + wclear(win_out->ptr); + wrefresh(win_out->ptr); + wclear(win_in->ptr); + wrefresh(win_in->ptr); + wintab->next = 0; + endwin(); + } + if (newmode == SLAVEMODE) { + delwin(win_out->ptr); + delwin(win_in->ptr); + wintab->next = 0; + start_slave_mode(wintab, win_in, win_out); + } + break; + + case SLAVEMODE: + if (newmode == RAWMODE) { + wclear(win_out->ptr); + wrefresh(win_out->ptr); + wintab->next = 0; + endwin(); + } + if (newmode == TALKMODE) { + delwin(win_out->ptr); + wintab->next = 0; + start_talk_mode(wintab, win_in, win_out); + } + break; } - break; - } - return newmode; + return newmode; } void writeincom(int mode, t_win * win_in, unsigned char buf[], int bytes) { - int cnt; + int cnt; - if (mode & RAWMODE) { - write(STDOUT_FILENO, buf, bytes); - return; - } - for (cnt = 0; cnt < bytes; cnt++) { - switch (buf[cnt]) { - case 201: - case 218: - waddch(win_in->ptr, ACS_ULCORNER); - break; - case 187: - case 191: - waddch(win_in->ptr, ACS_URCORNER); - break; - case 200: - case 192: - waddch(win_in->ptr, ACS_LLCORNER); - break; - case 188: - case 217: - waddch(win_in->ptr, ACS_LRCORNER); - break; - case 204: - case 195: - waddch(win_in->ptr, ACS_LTEE); - break; - case 185: - case 180: - waddch(win_in->ptr, ACS_RTEE); - break; - case 203: - case 194: - waddch(win_in->ptr, ACS_TTEE); - break; - case 202: - case 193: - waddch(win_in->ptr, ACS_BTEE); - break; - case 205: - case 196: - waddch(win_in->ptr, ACS_HLINE); - break; - case 186: - case 179: - waddch(win_in->ptr, ACS_VLINE); - break; - case 129: - waddch(win_in->ptr, 252); /*u umlaut */ - break; - case 132: - waddch(win_in->ptr, 228); /*a umlaut */ - break; - case 142: - waddch(win_in->ptr, 196); /*A umlaut */ - break; - case 148: - waddch(win_in->ptr, 246); /*o umlaut */ - break; - case 153: - waddch(win_in->ptr, 214); /*O umlaut */ - break; - case 154: - waddch(win_in->ptr, 220); /*U umlaut */ - break; - case 225: - waddch(win_in->ptr, 223); /*sz */ - break; - default: - { - if (buf[cnt] > 127) - waddch(win_in->ptr, '.'); - else - waddch(win_in->ptr, buf[cnt]); - } + if (mode & RAWMODE) { + write(STDOUT_FILENO, buf, bytes); + return; + } + for (cnt = 0; cnt < bytes; cnt++) { + switch (buf[cnt]) { + case 201: + case 218: + waddch(win_in->ptr, ACS_ULCORNER); + break; + case 187: + case 191: + waddch(win_in->ptr, ACS_URCORNER); + break; + case 200: + case 192: + waddch(win_in->ptr, ACS_LLCORNER); + break; + case 188: + case 217: + waddch(win_in->ptr, ACS_LRCORNER); + break; + case 204: + case 195: + waddch(win_in->ptr, ACS_LTEE); + break; + case 185: + case 180: + waddch(win_in->ptr, ACS_RTEE); + break; + case 203: + case 194: + waddch(win_in->ptr, ACS_TTEE); + break; + case 202: + case 193: + waddch(win_in->ptr, ACS_BTEE); + break; + case 205: + case 196: + waddch(win_in->ptr, ACS_HLINE); + break; + case 186: + case 179: + waddch(win_in->ptr, ACS_VLINE); + break; + case 129: + waddch(win_in->ptr, 252); /*u umlaut */ + break; + case 132: + waddch(win_in->ptr, 228); /*a umlaut */ + break; + case 142: + waddch(win_in->ptr, 196); /*A umlaut */ + break; + case 148: + waddch(win_in->ptr, 246); /*o umlaut */ + break; + case 153: + waddch(win_in->ptr, 214); /*O umlaut */ + break; + case 154: + waddch(win_in->ptr, 220); /*U umlaut */ + break; + case 225: + waddch(win_in->ptr, 223); /*sz */ + break; + default: + { + if (buf[cnt] > 127) + waddch(win_in->ptr, '.'); + else + waddch(win_in->ptr, buf[cnt]); + } + } } - } /* waddnstr(win_in->ptr, buf, bytes); */ - wrefresh(win_in->ptr); + wrefresh(win_in->ptr); - return; + return; } int getstring(wint * wintab, char text[], char buf[]) { - int c; - int ypos = 0, xpos = 0; - int bytes = 0; + int c; + int ypos = 0, xpos = 0; + int bytes = 0; - WINDOW *win = winopen(wintab, 3, COLS, 10, 0, TRUE); + WINDOW *win = winopen(wintab, 3, COLS, 10, 0, TRUE); - wmove(win, 1, 2); - waddstr(win, text); - wrefresh(win); + wmove(win, 1, 2); + waddstr(win, text); + wrefresh(win); - do { - c = getch(); - if (c != ERR) { - switch (c) { - case KEY_BACKSPACE: - case 127: - { - getyx(win, ypos, xpos); - if (xpos > 0 && bytes > 0) { - wmove(win, ypos, --xpos); - waddch(win, ' '); - wmove(win, ypos, xpos); - bytes--; - } - } - break; - case (int) '\n': - case (int) '\r': - case KEY_ENTER: - { - waddch(win, '\n'); - buf[bytes++] = (char) '\n'; - wrefresh(win); - buf[bytes] = 0; - } - break; - default: - { - waddch(win, (char) c); - buf[bytes++] = (char) c; + do { + c = getch(); + if (c != ERR) { + switch (c) { + case KEY_BACKSPACE: + case 127: + { + getyx(win, ypos, xpos); + if (xpos > 0 && bytes > 0) { + wmove(win, ypos, --xpos); + waddch(win, ' '); + wmove(win, ypos, xpos); + bytes--; + } + } + break; + case (int) '\n': + case (int) '\r': + case KEY_ENTER: + { + waddch(win, '\n'); + buf[bytes++] = (char) '\n'; + wrefresh(win); + buf[bytes] = 0; + } + break; + default: + { + waddch(win, (char) c); + buf[bytes++] = (char) c; + } + } + wrefresh(win); } - } - wrefresh(win); } - } - while (c != '\n' && c != '\r' && c != KEY_ENTER); - delwin(win); - winclose(wintab); - return 0; + while (c != '\n' && c != '\r' && c != KEY_ENTER); + delwin(win); + winclose(wintab); + return 0; } -int readoutg(t_win * win_out, wint * wintab, menuitem * top, char buf[], int keyesc) +int readoutg(t_win * win_out, wint * wintab, menuitem * top, char buf[], + int keyesc) { - int out_cnt; - int c; - int ypos = 0, xpos = 0; - int value; + int out_cnt; + int c; + int ypos = 0, xpos = 0; + int value; - c = getch(); - if (c == ERR) - return 0; + c = getch(); + if (c == ERR) + return 0; - if (c == keyesc) { - if ((value = top_menu(wintab, top, 1)) == 0) - return 0; - buf[0] = '~'; - switch (value) { - case 0x01: - { - buf[1] = 'r'; - return 2; - } - case 0x02: - { - buf[1] = '.'; - return 2; - } - case 0x11: - { - buf[1] = 'o'; - getstring(wintab, "Please enter filename: ", &buf[2]); - return strlen(buf); - } - case 0x12: - { - buf[1] = 'c'; - return 2; - } - case 0x13: - case 0x14: - case 0x15: - { + if (c == keyesc) { + if ((value = top_menu(wintab, top, 1)) == 0) + return 0; + buf[0] = '~'; switch (value) { + case 0x01: + { + buf[1] = 'r'; + return 2; + } + case 0x02: + { + buf[1] = '.'; + return 2; + } + case 0x11: + { + buf[1] = 'o'; + getstring(wintab, + "Please enter filename: ", + &buf[2]); + return strlen(buf); + } + case 0x12: + { + buf[1] = 'c'; + return 2; + } case 0x13: - buf[1] = 'u'; - break; case 0x14: - buf[1] = 'b'; - break; case 0x15: - buf[1] = 'a'; + { + switch (value) { + case 0x13: + buf[1] = 'u'; + break; + case 0x14: + buf[1] = 'b'; + break; + case 0x15: + buf[1] = 'a'; + } + getstring(wintab, + "Please enter filename: ", + buf + 2); + return strlen(buf); + } + case 0x21: + { + buf[1] = '1'; + return 2; + } + case 0x22: + { + buf[1] = '2'; + return 2; + } + case 0x23: + { + buf[1] = '0'; + return 2; + } + case 0x31: + return -1; } - getstring(wintab, "Please enter filename: ", buf + 2); - return strlen(buf); - } - case 0x21: - { - buf[1] = '1'; - return 2; - } - case 0x22: - { - buf[1] = '2'; - return 2; - } - case 0x23: - { - buf[1] = '0'; + wrefresh(win_out->ptr); return 2; - } - case 0x31: - return -1; } - wrefresh(win_out->ptr); - return 2; - } - switch (c) { - case KEY_BACKSPACE: - case 127: - { - getyx(win_out->ptr, ypos, xpos); - if (win_out->bytes > 0) { + switch (c) { + case KEY_BACKSPACE: + case 127: + { + getyx(win_out->ptr, ypos, xpos); + if (win_out->bytes > 0) { + if (win_out->curs_pos < win_out->bytes) { + mvwaddnstr(win_out->ptr, ypos, + --xpos, + &win_out-> + string[win_out-> + curs_pos], + win_out->bytes - + win_out->curs_pos); + waddch(win_out->ptr, ' '); + memmove(&win_out-> + string[win_out->curs_pos - + 1], + &win_out->string[win_out-> + curs_pos], + win_out->bytes - + win_out->curs_pos); + } else + mvwaddch(win_out->ptr, ypos, + --xpos, ' '); + + wmove(win_out->ptr, ypos, xpos); + win_out->bytes--; + win_out->curs_pos--; + } + } + break; + case KEY_LEFT: + if (win_out->curs_pos > 0) { + win_out->curs_pos--; + getyx(win_out->ptr, ypos, xpos); + wmove(win_out->ptr, ypos, xpos - 1); + } + break; + case KEY_RIGHT: if (win_out->curs_pos < win_out->bytes) { - mvwaddnstr(win_out->ptr, ypos, --xpos, &win_out->string[win_out->curs_pos], win_out->bytes - win_out->curs_pos); - waddch(win_out->ptr, ' '); - memmove(&win_out->string[win_out->curs_pos - 1], &win_out->string[win_out->curs_pos], win_out->bytes - win_out->curs_pos); - } else - mvwaddch(win_out->ptr, ypos, --xpos, ' '); - - wmove(win_out->ptr, ypos, xpos); - win_out->bytes--; - win_out->curs_pos--; - } - } - break; - case KEY_LEFT: - if (win_out->curs_pos > 0) { - win_out->curs_pos--; - getyx(win_out->ptr, ypos, xpos); - wmove(win_out->ptr, ypos, xpos - 1); - } - break; - case KEY_RIGHT: - if (win_out->curs_pos < win_out->bytes) { - win_out->curs_pos++; - getyx(win_out->ptr, ypos, xpos); - wmove(win_out->ptr, ypos, xpos + 1); - } - break; - case KEY_ENTER: - case (int) '\n': - case (int) '\r': - { - if (win_out->curs_pos < win_out->bytes) { - getyx(win_out->ptr, ypos, xpos); - wmove(win_out->ptr, ypos, xpos + win_out->bytes - win_out->curs_pos); - } - waddch(win_out->ptr, '\n'); - win_out->string[win_out->bytes++] = (char) '\n'; - wrefresh(win_out->ptr); - strncpy(buf, win_out->string, win_out->bytes); - wrefresh(win_out->ptr); - out_cnt = win_out->bytes; - win_out->bytes = 0; - win_out->curs_pos = 0; - return out_cnt; - } - break; - default: - { - waddch(win_out->ptr, (char) c); - if (win_out->curs_pos < win_out->bytes) { - getyx(win_out->ptr, ypos, xpos); - waddnstr(win_out->ptr, &win_out->string[win_out->curs_pos], win_out->bytes - win_out->curs_pos); - memmove(&win_out->string[win_out->curs_pos + 1], &win_out->string[win_out->curs_pos], win_out->bytes - win_out->curs_pos); - win_out->string[win_out->curs_pos] = (char) c; - wmove(win_out->ptr, ypos, xpos); - } else - win_out->string[win_out->bytes] = (char) c; - - win_out->bytes++; - win_out->curs_pos++; + win_out->curs_pos++; + getyx(win_out->ptr, ypos, xpos); + wmove(win_out->ptr, ypos, xpos + 1); + } + break; + case KEY_ENTER: + case (int) '\n': + case (int) '\r': + { + if (win_out->curs_pos < win_out->bytes) { + getyx(win_out->ptr, ypos, xpos); + wmove(win_out->ptr, ypos, + xpos + win_out->bytes - + win_out->curs_pos); + } + waddch(win_out->ptr, '\n'); + win_out->string[win_out->bytes++] = (char) '\n'; + wrefresh(win_out->ptr); + strncpy(buf, win_out->string, win_out->bytes); + wrefresh(win_out->ptr); + out_cnt = win_out->bytes; + win_out->bytes = 0; + win_out->curs_pos = 0; + return out_cnt; + } + break; + default: + { + waddch(win_out->ptr, (char) c); + if (win_out->curs_pos < win_out->bytes) { + getyx(win_out->ptr, ypos, xpos); + waddnstr(win_out->ptr, + &win_out->string[win_out-> + curs_pos], + win_out->bytes - + win_out->curs_pos); + memmove(&win_out-> + string[win_out->curs_pos + 1], + &win_out->string[win_out-> + curs_pos], + win_out->bytes - + win_out->curs_pos); + win_out->string[win_out->curs_pos] = + (char) c; + wmove(win_out->ptr, ypos, xpos); + } else + win_out->string[win_out->bytes] = (char) c; + + win_out->bytes++; + win_out->curs_pos++; + } } - } - wrefresh(win_out->ptr); - return 0; + wrefresh(win_out->ptr); + return 0; } void writemsg(char fname[], char caller[]) { - char text_row[255]; - char *text_ptr; - char buf[255]; - FILE *f = fopen(fname, "r"); - - if (f == NULL) { - perror(fname); - return; - } - do { - if (fgets(text_row, 255, f) != 0) { - text_row[strlen(text_row) - 1] = '\r'; - text_ptr = strchr(text_row, '$'); - if (text_ptr != NULL) { - strcpy(buf, text_ptr + 2); - switch (*(text_ptr + 1)) { - case 'c': - { - strcpy(text_ptr, caller); - strcat(text_ptr, buf); - } + char text_row[255]; + char *text_ptr; + char buf[255]; + FILE *f = fopen(fname, "r"); + + if (f == NULL) { + perror(fname); + return; + } + do { + if (fgets(text_row, 255, f) != 0) { + text_row[strlen(text_row) - 1] = '\r'; + text_ptr = strchr(text_row, '$'); + if (text_ptr != NULL) { + strcpy(buf, text_ptr + 2); + switch (*(text_ptr + 1)) { + case 'c': + { + strcpy(text_ptr, caller); + strcat(text_ptr, buf); + } + } + } + write(fd, text_row, strlen(text_row)); } - } - write(fd, text_row, strlen(text_row)); } - } - while (!feof(f)); + while (!feof(f)); } void remotecommand(char buf[], int bytes) { - int firstchar; - if (bytes == 0) - return; + int firstchar; + if (bytes == 0) + return; - switch (buf[0]) { - case 'e': - case 'E': - { - for (firstchar = 0; buf[firstchar] != ' '; firstchar++); - firstchar++; - buf[bytes] = '\n'; - convert_lf_cr(buf + firstchar, bytes - firstchar + 1); - write(fd, buf + firstchar, bytes - firstchar + 1); + switch (buf[0]) { + case 'e': + case 'E': + { + for (firstchar = 0; buf[firstchar] != ' '; + firstchar++); + firstchar++; + buf[bytes] = '\n'; + convert_lf_cr(buf + firstchar, + bytes - firstchar + 1); + write(fd, buf + firstchar, bytes - firstchar + 1); + } + break; + default: + write(fd, "Unknown command\r", 16); } - break; - default: - write(fd, "Unknown command\r", 16); - } } int compstr(const char st1[], char st2[], int maxbytes) { - int cnt; - for (cnt = 0; st1[cnt] == st2[cnt] && cnt + 1 < maxbytes && st1[cnt + 1] != 0; cnt++); - if (st1[cnt] != st2[cnt]) - return -1; + int cnt; + for (cnt = 0; + st1[cnt] == st2[cnt] && cnt + 1 < maxbytes + && st1[cnt + 1] != 0; cnt++); + if (st1[cnt] != st2[cnt]) + return -1; + + if (st1[cnt + 1] == 0) + return 0; + if (cnt == maxbytes - 1) + return -2; - if (st1[cnt + 1] == 0) - return 0; - if (cnt == maxbytes - 1) - return -2; - - return -1; + return -1; } int eol(char c) { - if (c == '\r' || c == '\n' || c == 0x1A) - return TRUE; - else - return FALSE; + if (c == '\r' || c == '\n' || c == 0x1A) + return TRUE; + else + return FALSE; } -int searche_key_words(char buf[], int *bytes, char *parms, int *parmsbytes, char restbuf[], int *restbytes) +int searche_key_words(char buf[], int *bytes, char *parms, int *parmsbytes, + char restbuf[], int *restbytes) { - static char cmpstr[MAX_CMPSTRLEN]; - static int cmpstrbyte = 0; - static int command = -1; - - int cmdstpos = 0; - int cnt = 0; - int t = 0; - - if (cmpstrbyte != 0) { - memmove(buf + cmpstrbyte, buf, *bytes); - *bytes += cmpstrbyte; - strncpy(buf, cmpstr, cmpstrbyte); - cmpstrbyte = 0; - for (cnt = 0; !eol(buf[cnt]) && cnt < *bytes - 1; cnt++); - if (cnt == *bytes - 1 && !eol(buf[cnt])) { - printf("Problem!!!\n"); - command = -1; - *restbytes = 0; - *parmsbytes = 0; - return -1; + static char cmpstr[MAX_CMPSTRLEN]; + static int cmpstrbyte = 0; + static int command = -1; + + int cmdstpos = 0; + int cnt = 0; + int t = 0; + + if (cmpstrbyte != 0) { + memmove(buf + cmpstrbyte, buf, *bytes); + *bytes += cmpstrbyte; + strncpy(buf, cmpstr, cmpstrbyte); + cmpstrbyte = 0; + for (cnt = 0; !eol(buf[cnt]) && cnt < *bytes - 1; cnt++); + if (cnt == *bytes - 1 && !eol(buf[cnt])) { + printf("Problem!!!\n"); + command = -1; + *restbytes = 0; + *parmsbytes = 0; + return -1; + } } - } - if (command == -1) { - cnt = 0; - do { - command = 0; - cmdstpos = cnt; - - do { - if ((t = compstr(key_words[command], &buf[cnt], *bytes - cnt)) != -1) - break; - } - while (*key_words[++command] != '\0'); + if (command == -1) { + cnt = 0; + do { + command = 0; + cmdstpos = cnt; + + do { + if ((t = + compstr(key_words[command], &buf[cnt], + *bytes - cnt)) != -1) + break; + } + while (*key_words[++command] != '\0'); - for (; !eol(buf[cnt]) && cnt < *bytes - 1; cnt++); + for (; !eol(buf[cnt]) && cnt < *bytes - 1; cnt++); - if (cnt < *bytes - 1) - cnt++; - else - break; + if (cnt < *bytes - 1) + cnt++; + else + break; + } + while (t == -1); + if (t < 0) + command = -1; } - while (t == -1); - if (t < 0) - command = -1; - } - if (t == -2 || (command != -1 && cnt == *bytes - 1 && !eol(buf[*bytes - 1]))) { - cmpstrbyte = *bytes - cmdstpos; - strncpy(cmpstr, &buf[cmdstpos], cmpstrbyte); - cmpstr[cmpstrbyte] = 0; - *bytes -= cmpstrbyte; - *restbytes = 0; - return -1; - } - if (t == -1) { + if (t == -2 + || (command != -1 && cnt == *bytes - 1 + && !eol(buf[*bytes - 1]))) { + cmpstrbyte = *bytes - cmdstpos; + strncpy(cmpstr, &buf[cmdstpos], cmpstrbyte); + cmpstr[cmpstrbyte] = 0; + *bytes -= cmpstrbyte; + *restbytes = 0; + return -1; + } + if (t == -1) { + command = -1; + cmpstrbyte = 0; + *restbytes = 0; + return -1; + } + t = cmdstpos + strlen(key_words[command]); + *restbytes = *bytes - cnt; + strncpy(parms, &buf[t], cnt - t); + *parmsbytes = cnt - t; + strncpy(restbuf, buf + cnt, *restbytes); + *bytes = cmdstpos; + + t = command; command = -1; - cmpstrbyte = 0; - *restbytes = 0; - return -1; - } - t = cmdstpos + strlen(key_words[command]); - *restbytes = *bytes - cnt; - strncpy(parms, &buf[t], cnt - t); - *parmsbytes = cnt - t; - strncpy(restbuf, buf + cnt, *restbytes); - *bytes = cmdstpos; - - t = command; - command = -1; - return t; + return t; } -int sevenplname(int mode, WINDOW ** swin, wint * wintab, int *f, int* logfile, char parms[], int parmsbytes, char buf[], int bytes) +int sevenplname(int mode, WINDOW ** swin, wint * wintab, int *f, + int *logfile, char parms[], int parmsbytes, char buf[], + int bytes) { - int cnt; - int part; - int nrparts; - int lines; - char orgn[13]; - char prtn[13]; - char strn[255]; - char v[20]; - char s[80]; - if (parmsbytes >= 40) - if (strcmp(" of ", &parms[3]) == 0 - || parmsbytes < 41 - || parms[10] != ' ' - || parms[23] != ' ' - || parms[31] != ' ' - || parms[36] != ' ' - || parms[40] != ' ') { - return -1; + int cnt; + int part; + int nrparts; + int lines; + char orgn[13]; + char prtn[13]; + char strn[255]; + char v[20]; + char s[80]; + if (parmsbytes >= 40) + if (strcmp(" of ", &parms[3]) == 0 + || parmsbytes < 41 + || parms[10] != ' ' + || parms[23] != ' ' + || parms[31] != ' ' + || parms[36] != ' ' || parms[40] != ' ') { + return -1; + } + part = atof(parms); + lines = (int) strtol(parms + 37, NULL, 16); + nrparts = (int) strtol(parms + 7, NULL, 10); + + strncpy(orgn, &parms[11], 12); + convert_upper_lower(orgn, 12); + for (cnt = 11; orgn[cnt] == ' '; cnt--); + orgn[cnt + 1] = 0; + if (orgn[cnt - 3] == '.') { + strncpy(prtn, orgn, cnt - 2); + if (nrparts == 1) + sprintf(prtn + cnt - 2, "7pl"); + else + sprintf(prtn + cnt - 2, "p%02x", part); + } else { + strcpy(prtn, orgn); + if (nrparts == 1) + sprintf(prtn + cnt, ".7pl"); + else + sprintf(prtn + cnt, ".p%02x", part); } - part = atof(parms); - lines = (int) strtol(parms + 37, NULL, 16); - nrparts = (int) strtol(parms + 7, NULL, 10); - - strncpy(orgn, &parms[11], 12); - convert_upper_lower(orgn, 12); - for (cnt = 11; orgn[cnt] == ' '; cnt--); - orgn[cnt + 1] = 0; - if (orgn[cnt - 3] == '.') { - strncpy(prtn, orgn, cnt - 2); - if (nrparts == 1) - sprintf(prtn + cnt - 2, "7pl"); - else - sprintf(prtn + cnt - 2, "p%02x", part); - } else { - strcpy(prtn, orgn); - if (nrparts == 1) - sprintf(prtn + cnt, ".7pl"); - else - sprintf(prtn + cnt, ".p%02x", part); - } - strcpy(strn, STD_DWN_DIR); - strcat(strn, prtn); + strcpy(strn, STD_DWN_DIR); + strcat(strn, prtn); - for (cnt = 0; parms[cnt + 41] != ')' && cnt + 41 != parmsbytes; cnt++); - if (parms[cnt + 41] != ')') { - return -1; - } - strncpy(v, &parms[41], cnt + 1); - v[cnt + 1] = 0; - *swin = opnstatw(mode, wintab, "Remote starts 7+ Download", 11, 55); - sprintf(s, "7plus version : %s", v); - wrdstatw(*swin, s); - sprintf(s, "Name of decoded file : %s", orgn); - wrdstatw(*swin, s); - sprintf(s, "Storagename : %s", strn); - wrdstatw(*swin, s); - sprintf(s, "Parts : %i", nrparts); - wrdstatw(*swin, s); - sprintf(s, "Number of this Part : %i", part); - wrdstatw(*swin, s); - sprintf(s, "Lines : %i", lines); - wrdstatw(*swin, s); - dupdstatw(*swin, "Outstanding lines : ", TRUE); - - if (*f != -1) { - close(*f); - } - if ((*f = open(strn, O_RDWR | O_APPEND | O_CREAT, 0666)) == -1) { - sprintf(s, "Unable to open %s", strn); - statline(mode, s); - } - else - if (*logfile != -1) - { + for (cnt = 0; parms[cnt + 41] != ')' && cnt + 41 != parmsbytes; + cnt++); + if (parms[cnt + 41] != ')') { + return -1; + } + strncpy(v, &parms[41], cnt + 1); + v[cnt + 1] = 0; + *swin = + opnstatw(mode, wintab, "Remote starts 7+ Download", 11, 55); + sprintf(s, "7plus version : %s", v); + wrdstatw(*swin, s); + sprintf(s, "Name of decoded file : %s", orgn); + wrdstatw(*swin, s); + sprintf(s, "Storagename : %s", strn); + wrdstatw(*swin, s); + sprintf(s, "Parts : %i", nrparts); + wrdstatw(*swin, s); + sprintf(s, "Number of this Part : %i", part); + wrdstatw(*swin, s); + sprintf(s, "Lines : %i", lines); + wrdstatw(*swin, s); + dupdstatw(*swin, "Outstanding lines : ", TRUE); + + if (*f != -1) { + close(*f); + } + if ((*f = open(strn, O_RDWR | O_APPEND | O_CREAT, 0666)) == -1) { + sprintf(s, "Unable to open %s", strn); + statline(mode, s); + } else if (*logfile != -1) { sprintf(s, "*** 7plus download into file: %s ***\n", strn); write(*logfile, s, strlen(s)); } - write(*f, key_words[2], strlen(key_words[2])); - convert_cr_lf(parms, parmsbytes); - write(*f, parms, parmsbytes); + write(*f, key_words[2], strlen(key_words[2])); + convert_cr_lf(parms, parmsbytes); + write(*f, parms, parmsbytes); - return lines; + return lines; } void statbits(int mode, char stat, int m) { - if (mode == RAWMODE) + if (mode == RAWMODE) + return; + move(0, STATW_BITS + m); + attron(A_REVERSE); + addch(stat); + attroff(A_REVERSE); + refresh(); return; - move(0, STATW_BITS + m); - attron(A_REVERSE); - addch(stat); - attroff(A_REVERSE); - refresh(); - return; } int cmd_call(char *call[], int mode) { - menuitem con[] = - { - {"~Reconnect", 'R', M_ITEM, (void *) 0x01}, - {"~Exit", 'E', M_ITEM, (void *) 0x02}, - {"\0", 0, M_END, 0} - }; - - menuitem fil[] = - { - {"~Open Logfile", 'O', M_ITEM, 0}, - {"~Close Logfile", 'C', M_ITEM, 0}, - {"Send ~Textfile", 'T', M_ITEM, 0}, - {"Send ~Binary", 'B', M_ITEM, 0}, - {"Send ~AutoBin", 'A', M_ITEM, 0}, - {"\0", 0, M_END, 0} - }; - - menuitem mod[] = - { - {"~Slavemode", 'S', M_ITEM, 0}, - {"~Talkmode", 'T', M_ITEM, 0}, - {"~Rawmode", 'R', M_ITEM, 0}, - {"\0", 0, M_END, 0} - }; - - menuitem win[] = - { - {"~Clear", 'C', M_ITEM, 0}, - {"~Resize", 'R', M_ITEM, 0}, - {"\0", 0, M_END, 0} - }; - - menuitem top[] = - { - {"~Connect", 'C', M_P_DWN, con}, - {"~File", 'F', M_P_DWN, fil}, - {"~Mode", 'M', M_P_DWN, mod}, - {"~Window", 'W', M_P_DWN, win}, - {"\0", 0, M_END, 0} - }; - - wint wintab; - fd_set sock_read; - fd_set sock_write; - char buf[MAX_BUFLEN]; - char restbuf[MAX_PACKETLEN]; - char parms[256]; - int sevenplus = FALSE; - int sevenplcnt = 0; - int bytes; - int restbytes; - int parmsbytes; - int com_num; - int logfile = -1; - int uploadfile = -1; - int downloadfile = -1; - int binup = FALSE; - long uplsize = 0; - long uplpos = 0; - char uplbuf[128]; /* Upload buffer */ - int upldp = 0; - int upllen = 0; - char *c, *t; - int extrach = 0; - t_gp gp; - t_win win_in; - t_win win_out; - WINDOW *swin = 0; - int cnt; - int crc = 0; - char s[80]; - int flags = 0; - - init_crc(); - - gp.dwn_cnt = 0; - wintab.next = 0; - - if ((fd = connect_to(call)) == -1) - return FALSE; - - interrupted = FALSE; - signal(SIGQUIT, cmd_intr); - signal(SIGINT, SIG_IGN); - signal(SIGTSTP, SIG_IGN); - - fcntl(fd, F_SETFL, O_NONBLOCK); - fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); - - if (mode != RAWMODE) - start_screen(call); - switch (mode) { - case TALKMODE: - start_talk_mode(&wintab, &win_in, &win_out); - break; - case SLAVEMODE: - start_slave_mode(&wintab, &win_in, &win_out); - break; - case RAWMODE: - printf("Rawmode\n"); - } - - while (TRUE) { - FD_ZERO(&sock_read); - FD_SET(STDIN_FILENO, &sock_read); - FD_SET(fd, &sock_read); - FD_ZERO(&sock_write); - - if (uploadfile != -1) - FD_SET(fd, &sock_write); - - if (select(fd + 1, &sock_read, &sock_write, NULL, NULL) == -1) { - if (!interrupted && errno == EAGAIN) - continue; - if (!interrupted) - perror("select"); - break; - } - if (FD_ISSET(fd, &sock_read)) { - bytes = read(fd, buf, 511); - if (bytes == -1 && errno != EWOULDBLOCK && errno != EAGAIN) { - if (errno != ENOTCONN) - perror("read"); + menuitem con[] = { + {"~Reconnect", 'R', M_ITEM, (void *) 0x01}, + {"~Exit", 'E', M_ITEM, (void *) 0x02}, + {"\0", 0, M_END, 0} + }; + + menuitem fil[] = { + {"~Open Logfile", 'O', M_ITEM, 0}, + {"~Close Logfile", 'C', M_ITEM, 0}, + {"Send ~Textfile", 'T', M_ITEM, 0}, + {"Send ~Binary", 'B', M_ITEM, 0}, + {"Send ~AutoBin", 'A', M_ITEM, 0}, + {"\0", 0, M_END, 0} + }; + + menuitem mod[] = { + {"~Slavemode", 'S', M_ITEM, 0}, + {"~Talkmode", 'T', M_ITEM, 0}, + {"~Rawmode", 'R', M_ITEM, 0}, + {"\0", 0, M_END, 0} + }; + + menuitem win[] = { + {"~Clear", 'C', M_ITEM, 0}, + {"~Resize", 'R', M_ITEM, 0}, + {"\0", 0, M_END, 0} + }; + + menuitem top[] = { + {"~Connect", 'C', M_P_DWN, con}, + {"~File", 'F', M_P_DWN, fil}, + {"~Mode", 'M', M_P_DWN, mod}, + {"~Window", 'W', M_P_DWN, win}, + {"\0", 0, M_END, 0} + }; + + wint wintab; + fd_set sock_read; + fd_set sock_write; + char buf[MAX_BUFLEN]; + char restbuf[MAX_PACKETLEN]; + char parms[256]; + int sevenplus = FALSE; + int sevenplcnt = 0; + int bytes; + int restbytes; + int parmsbytes; + int com_num; + int logfile = -1; + int uploadfile = -1; + int downloadfile = -1; + int binup = FALSE; + long uplsize = 0; + long uplpos = 0; + char uplbuf[128]; /* Upload buffer */ + int upldp = 0; + int upllen = 0; + char *c, *t; + int extrach = 0; + t_gp gp; + t_win win_in; + t_win win_out; + WINDOW *swin = 0; + int cnt; + int crc = 0; + char s[80]; + int flags = 0; + + init_crc(); + + gp.dwn_cnt = 0; + wintab.next = 0; + + if ((fd = connect_to(call)) == -1) + return FALSE; + + interrupted = FALSE; + signal(SIGQUIT, cmd_intr); + signal(SIGINT, SIG_IGN); + signal(SIGTSTP, SIG_IGN); + + fcntl(fd, F_SETFL, O_NONBLOCK); + fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); + + if (mode != RAWMODE) + start_screen(call); + switch (mode) { + case TALKMODE: + start_talk_mode(&wintab, &win_in, &win_out); break; - } - if (gp.dwn_cnt != 0) { - ab_down(mode, swin, &wintab, buf, &bytes, &gp); - if (bytes == 0) - continue; - } - do { - com_num = searche_key_words(buf, &bytes, parms, &parmsbytes, restbuf, &restbytes); - - if (bytes != 0) { - convert_cr_lf(buf, bytes); - if (!sevenplus) { - - writeincom(mode, &win_in, buf, bytes); - } else { - for (cnt = 0; cnt < bytes; cnt++) - if (eol(buf[cnt])) - sevenplcnt--; - dupdstatw(swin, s, FALSE); - } - if (downloadfile != -1) - { - if (write(downloadfile, buf, bytes) != bytes) - { - close(downloadfile); - downloadfile = -1; - statline(mode, "Error while writing file. Downloadfile closed."); + case SLAVEMODE: + start_slave_mode(&wintab, &win_in, &win_out); + break; + case RAWMODE: + printf("Rawmode\n"); + } + + while (TRUE) { + FD_ZERO(&sock_read); + FD_SET(STDIN_FILENO, &sock_read); + FD_SET(fd, &sock_read); + FD_ZERO(&sock_write); + + if (uploadfile != -1) + FD_SET(fd, &sock_write); + + if (select(fd + 1, &sock_read, &sock_write, NULL, NULL) == + -1) { + if (!interrupted && errno == EAGAIN) + continue; + if (!interrupted) + perror("select"); + break; + } + if (FD_ISSET(fd, &sock_read)) { + bytes = read(fd, buf, 511); + if (bytes == -1 && errno != EWOULDBLOCK + && errno != EAGAIN) { + if (errno != ENOTCONN) + perror("read"); + break; } - } - else - if (logfile != -1) { - if (write(logfile, buf, bytes) != bytes) { - close(logfile); - logfile = -1; - statline(mode, "Error while writing log. Log closed."); + if (gp.dwn_cnt != 0) { + ab_down(mode, swin, &wintab, buf, &bytes, + &gp); + if (bytes == 0) + continue; } - } - } - switch (com_num) { - case 0: - { + do { + com_num = + searche_key_words(buf, &bytes, parms, + &parmsbytes, restbuf, + &restbytes); + + if (bytes != 0) { + convert_cr_lf(buf, bytes); + if (!sevenplus) { + + writeincom(mode, &win_in, + buf, bytes); + } else { + for (cnt = 0; cnt < bytes; + cnt++) + if (eol(buf[cnt])) + sevenplcnt--; + dupdstatw(swin, s, FALSE); + } + if (downloadfile != -1) { + if (write + (downloadfile, buf, + bytes) != bytes) { + close + (downloadfile); + downloadfile = -1; + statline(mode, + "Error while writing file. Downloadfile closed."); + } + } else if (logfile != -1) { + if (write + (logfile, buf, + bytes) != bytes) { + close(logfile); + logfile = -1; + statline(mode, + "Error while writing log. Log closed."); + } + } + } + switch (com_num) { + case 0: + { #if 0 - /* - FIXME! We should, no: WE MUST be able to turn off - all remote commands to avoid mail bombs generating - offensive mails with //e while sucking the BBS - */ - remotecommand(parms, parmsbytes); + /* + FIXME! We should, no: WE MUST be able to turn off + all remote commands to avoid mail bombs generating + offensive mails with //e while sucking the BBS + */ + remotecommand(parms, + parmsbytes); #endif - } - break; - case 1: - { - start_ab_download(mode, &swin, &wintab, parms, parmsbytes, restbuf, restbytes, &gp, call); - restbytes = 0; - extrach = 0; - } - break; - case 2: - { - if ((sevenplcnt = sevenplname(mode, &swin, &wintab, &downloadfile, &logfile, parms, parmsbytes, buf, bytes)) != -1) - sevenplus = TRUE; - } - break; - case 3: - { - if (!sevenplus) - break; - write(downloadfile, key_words[3], strlen(key_words[3])); - convert_cr_lf(parms, parmsbytes); - write(downloadfile, parms, parmsbytes); - if (mode != RAWMODE) { - delwin(swin); - winclose(&wintab); - } else - printf("\n"); - statline(mode, "7+ Download finished."); - sevenplus = FALSE; - close(downloadfile); - downloadfile = -1; - } - break; - } + } + break; + case 1: + { + start_ab_download(mode, + &swin, + &wintab, + parms, + parmsbytes, + restbuf, + restbytes, + &gp, + call); + restbytes = 0; + extrach = 0; + } + break; + case 2: + { + if ((sevenplcnt = + sevenplname(mode, + &swin, + &wintab, + &downloadfile, + &logfile, + parms, + parmsbytes, + buf, + bytes)) != + -1) + sevenplus = TRUE; + } + break; + case 3: + { + if (!sevenplus) + break; + write(downloadfile, + key_words[3], + strlen(key_words + [3])); + convert_cr_lf(parms, + parmsbytes); + write(downloadfile, parms, + parmsbytes); + if (mode != RAWMODE) { + delwin(swin); + winclose(&wintab); + } else + printf("\n"); + statline(mode, + "7+ Download finished."); + sevenplus = FALSE; + close(downloadfile); + downloadfile = -1; + } + break; + } - strncpy(buf, restbuf, restbytes); - bytes = restbytes; - } - while (restbytes != 0); - } - if (FD_ISSET(STDIN_FILENO, &sock_read)) { - if ((mode & RAWMODE) == RAWMODE) - bytes = read(STDIN_FILENO, buf, 511); - else { - bytes = readoutg(&win_out, &wintab, top, buf, 0x1d); - if (bytes == -1) { - wclear(win_in.ptr); - wrefresh(win_in.ptr); - wclear(win_out.ptr); - wrefresh(win_out.ptr); - bytes = 0; + strncpy(buf, restbuf, restbytes); + bytes = restbytes; + } + while (restbytes != 0); } - } - if (bytes > 0) - statline(mode, ""); - - if (bytes > 1 && *buf == '~') { - buf[bytes] = 0; - - switch (buf[1]) { - case '.': - { - bytes = 0; - interrupted = TRUE; - } - break; - case '!': - change_mode(mode, RAWMODE, &wintab, &win_in, &win_out, call); - if (buf[2] != '\0' && buf[2] != '\n') { - c = buf + 2; - if ((t = strchr(c, '\n')) != NULL) - *t = '\0'; - } else { - if ((c = getenv("SHELL")) == NULL) - c = "/bin/sh"; - } - - fcntl(STDIN_FILENO, F_SETFL, 0); - printf("\n[Spawning subshell]\n"); - system(c); - printf("\n[Returned to connect]\n"); - fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); - change_mode(RAWMODE, mode, &wintab, &win_in, &win_out, call); - continue; - case 'z': - case 'Z': - case 'Z' - 64: - fcntl(STDIN_FILENO, F_SETFL, 0); - kill(getpid(), SIGSTOP); - statline(mode, "Resumed"); - fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); - continue; - case '?': - case 'h': - case 'H': - printf("\n\rTilde escapes:\n\r. close\n\r! shell\n\rZ suspend\n\rs Stop upload\n\ro Open log\n\rc Close log\n\ru Upload\n\ryd YAPP Download\n\ryu YAPP Upload\n\r"); - continue; - case 'S': - case 's': - if (uploadfile != -1) { - statline(mode, "Upload file closed"); - close(uploadfile); - uploadfile = -1; - } else { - statline(mode, "No upload in progress"); - } - continue; - case 'A': - case 'a': - case 'b': - case 'B': - case 'u': - case 'U': - if (uploadfile != -1) { - statline(mode, "Already uploading"); - continue; - } - if ((t = strchr(buf, '\n')) != NULL) - *t = '\0'; - t = buf + 2; - while (*t != '\0' && isspace(*t)) - t++; - if (*t == '\0') { - statline(mode, "Upload requires a filename"); - continue; - } - uploadfile = open(t, O_RDONLY); - if (uploadfile == -1) { - statline(mode, "Unable to open upload file"); - continue; - } - if (lseek(uploadfile, 0L, SEEK_END) != -1) - uplsize = lseek(uploadfile, 0L, SEEK_CUR); - else - uplsize = 0; - lseek(uploadfile, 0L, SEEK_SET); - uplpos = 0; - upldp = -1; - upllen = 0; - if (uplsize != -1) { - sprintf(s, "Uploading %ld bytes from %s", uplsize, t); - swin = opnstatw(mode, &wintab, s, 6, 50); - dupdstatw(swin, "bytes sent : ", TRUE); - } else { - sprintf(s, "Uploading from %s", t); - swin = opnstatw(mode, &wintab, s, 6, 50); - dupdstatw(swin, "bytes sent : ", TRUE); - } - switch (buf[1]) { - case 'a': - case 'A': - { - binup = TRUE; - crc = 0; - - do { - upllen = read(uploadfile, uplbuf, 128); - - if (upllen == -1) { - close(uploadfile); - uploadfile = -1; - delwin(swin); - winclose(&wintab); - sprintf(s, "Error reading upload file: upload aborted"); - statline(mode, s); - break; + if (FD_ISSET(STDIN_FILENO, &sock_read)) { + if ((mode & RAWMODE) == RAWMODE) + bytes = read(STDIN_FILENO, buf, 511); + else { + bytes = + readoutg(&win_out, &wintab, top, buf, + 0x1d); + if (bytes == -1) { + wclear(win_in.ptr); + wrefresh(win_in.ptr); + wclear(win_out.ptr); + wrefresh(win_out.ptr); + bytes = 0; } - crc = calc_crc(uplbuf, upllen, crc); - } - while (upllen > 0); - lseek(uploadfile, 0L, SEEK_SET); - sprintf(s, "#BIN#%ld#$%u#|000000#%s\r", uplsize, crc, t); - write(fd, s, strlen(s)); - uplpos = 0; - upldp = -1; - upllen = 0; } - break; - case 'b': - case 'B': - binup = TRUE; - break; - case 'u': - case 'U': - binup = FALSE; - } - continue; - case 'O': - case 'o': - if ((t = strchr(buf, '\n')) != NULL) - *t = '\0'; - if (logfile != -1) { - close(logfile); - logfile = -1; - } - if (downloadfile != -1) - { - close(downloadfile); - downloadfile = -1; - } - t = buf + 2; - while (*t != '\0' && isspace(*t)) - t++; - if (*t == '\0') - t = "logfile.txt"; - if ((logfile = open(t, O_RDWR | O_APPEND | O_CREAT, 0666)) == -1) { - sprintf(s, "Unable to open %s", buf + 2); - statline(mode, s); - } else - statbits(mode, 'L', 1); - continue; - case 'C': - case 'c': - if (logfile != -1) { - close(logfile); - logfile = -1; - statbits(mode, '-', 1); - } else { - statline(mode, "Log file not open"); - } - continue; - case 'Y': - case 'y': - cmd_yapp(buf + 2, bytes - 2); - continue; - case '~': - bytes--; - memmove(buf, buf + 1, strlen(buf)); - break; - case 'R': - case 'r': - flags |= FLAG_RECONNECT; - bytes = 0; - interrupted = TRUE; - continue; - case '0': - mode = change_mode(mode, RAWMODE, &wintab, &win_in, &win_out, call); - continue; - case '1': - mode = change_mode(mode, SLAVEMODE, &wintab, &win_in, &win_out, call); - continue; - case '2': - mode = change_mode(mode, TALKMODE, &wintab, &win_in, &win_out, call); - continue; - default: - statline(mode, "Unknown '~' escape. Type ~h for a list"); - continue; - } - } - /* if (bytes == -1 && errno != EWOULDBLOCK && errno != EAGAIN) */ - /* if ((bytes == 0 && (mode & (TALKMODE|SLAVEMODE)) == 0) || (bytes == -1 && errno != EWOULDBLOCK && errno != EAGAIN)) */ - if (interrupted || (bytes == -1 && errno != EWOULDBLOCK && errno != EAGAIN)) { - if (!interrupted) - perror("input"); - break; - } - if (bytes > 0) { - sevenplus = FALSE; - if (uploadfile != -1) { - statline(mode, "Ignored. Type ~s to stop upload"); - continue; - } - convert_lf_cr(buf, bytes); - - if (write(fd, buf, bytes) == -1) { - perror("write"); - break; - } - } - if (uploadfile != -1) { - if (uplsize == 0) { - close(uploadfile); - uploadfile = -1; - delwin(swin); - winclose(&wintab); - statline(mode, "Upload complete: 0 bytes"); - continue; - } - if (upldp == -1) { - upllen = read(uploadfile, uplbuf, 128); - - if (upllen == 0) { - close(uploadfile); - uploadfile = -1; - delwin(swin); - winclose(&wintab); - sprintf(s, "Upload complete: %ld bytes", uplpos); - statline(mode, s); - continue; - } - if (upllen == -1) { - close(uploadfile); - uploadfile = -1; - delwin(swin); - winclose(&wintab); - sprintf(s, "Error reading upload file: upload aborted at %ld bytes", uplpos); - statline(mode, s); - continue; - } - if (!binup) - convert_lf_cr(uplbuf, upllen); - - upldp = 0; - } - bytes = write(fd, uplbuf + upldp, upllen - upldp); + if (bytes > 0) + statline(mode, ""); + + if (bytes > 1 && *buf == '~') { + buf[bytes] = 0; + + switch (buf[1]) { + case '.': + { + bytes = 0; + interrupted = TRUE; + } + break; + case '!': + change_mode(mode, RAWMODE, &wintab, + &win_in, &win_out, + call); + if (buf[2] != '\0' + && buf[2] != '\n') { + c = buf + 2; + if ((t = + strchr(c, + '\n')) != NULL) + *t = '\0'; + } else { + if ((c = + getenv("SHELL")) == + NULL) + c = "/bin/sh"; + } + + fcntl(STDIN_FILENO, F_SETFL, 0); + printf("\n[Spawning subshell]\n"); + system(c); + printf + ("\n[Returned to connect]\n"); + fcntl(STDIN_FILENO, F_SETFL, + O_NONBLOCK); + change_mode(RAWMODE, mode, &wintab, + &win_in, &win_out, + call); + continue; + case 'z': + case 'Z': + case 'Z' - 64: + fcntl(STDIN_FILENO, F_SETFL, 0); + kill(getpid(), SIGSTOP); + statline(mode, "Resumed"); + fcntl(STDIN_FILENO, F_SETFL, + O_NONBLOCK); + continue; + case '?': + case 'h': + case 'H': + printf + ("\n\rTilde escapes:\n\r. close\n\r! shell\n\rZ suspend\n\rs Stop upload\n\ro Open log\n\rc Close log\n\ru Upload\n\ryd YAPP Download\n\ryu YAPP Upload\n\r"); + continue; + case 'S': + case 's': + if (uploadfile != -1) { + statline(mode, + "Upload file closed"); + close(uploadfile); + uploadfile = -1; + } else { + statline(mode, + "No upload in progress"); + } + continue; + case 'A': + case 'a': + case 'b': + case 'B': + case 'u': + case 'U': + if (uploadfile != -1) { + statline(mode, + "Already uploading"); + continue; + } + if ((t = + strchr(buf, '\n')) != NULL) + *t = '\0'; + t = buf + 2; + while (*t != '\0' && isspace(*t)) + t++; + if (*t == '\0') { + statline(mode, + "Upload requires a filename"); + continue; + } + uploadfile = open(t, O_RDONLY); + if (uploadfile == -1) { + statline(mode, + "Unable to open upload file"); + continue; + } + if (lseek(uploadfile, 0L, SEEK_END) + != -1) + uplsize = + lseek(uploadfile, 0L, + SEEK_CUR); + else + uplsize = 0; + lseek(uploadfile, 0L, SEEK_SET); + uplpos = 0; + upldp = -1; + upllen = 0; + if (uplsize != -1) { + sprintf(s, + "Uploading %ld bytes from %s", + uplsize, t); + swin = + opnstatw(mode, &wintab, + s, 6, 50); + dupdstatw(swin, + "bytes sent : ", + TRUE); + } else { + sprintf(s, + "Uploading from %s", + t); + swin = + opnstatw(mode, &wintab, + s, 6, 50); + dupdstatw(swin, + "bytes sent : ", + TRUE); + } + switch (buf[1]) { + case 'a': + case 'A': + { + binup = TRUE; + crc = 0; + + do { + upllen = + read + (uploadfile, + uplbuf, + 128); + + if (upllen + == + -1) { + close + (uploadfile); + uploadfile + = + -1; + delwin + (swin); + winclose + (&wintab); + sprintf + (s, + "Error reading upload file: upload aborted"); + statline + (mode, + s); + break; + } + crc = + calc_crc + (uplbuf, + upllen, + crc); + } + while (upllen > 0); + lseek(uploadfile, + 0L, + SEEK_SET); + sprintf(s, + "#BIN#%ld#$%u#|000000#%s\r", + uplsize, + crc, t); + write(fd, s, + strlen(s)); + uplpos = 0; + upldp = -1; + upllen = 0; + } + break; + case 'b': + case 'B': + binup = TRUE; + break; + case 'u': + case 'U': + binup = FALSE; + } + continue; + case 'O': + case 'o': + if ((t = + strchr(buf, '\n')) != NULL) + *t = '\0'; + if (logfile != -1) { + close(logfile); + logfile = -1; + } + if (downloadfile != -1) { + close(downloadfile); + downloadfile = -1; + } + t = buf + 2; + while (*t != '\0' && isspace(*t)) + t++; + if (*t == '\0') + t = "logfile.txt"; + if ((logfile = + open(t, + O_RDWR | O_APPEND | + O_CREAT, 0666)) == -1) { + sprintf(s, + "Unable to open %s", + buf + 2); + statline(mode, s); + } else + statbits(mode, 'L', 1); + continue; + case 'C': + case 'c': + if (logfile != -1) { + close(logfile); + logfile = -1; + statbits(mode, '-', 1); + } else { + statline(mode, + "Log file not open"); + } + continue; + case 'Y': + case 'y': + cmd_yapp(buf + 2, bytes - 2); + continue; + case '~': + bytes--; + memmove(buf, buf + 1, strlen(buf)); + break; + case 'R': + case 'r': + flags |= FLAG_RECONNECT; + bytes = 0; + interrupted = TRUE; + continue; + case '0': + mode = + change_mode(mode, RAWMODE, + &wintab, &win_in, + &win_out, call); + continue; + case '1': + mode = + change_mode(mode, SLAVEMODE, + &wintab, &win_in, + &win_out, call); + continue; + case '2': + mode = + change_mode(mode, TALKMODE, + &wintab, &win_in, + &win_out, call); + continue; + default: + statline(mode, + "Unknown '~' escape. Type ~h for a list"); + continue; + } + } + /* if (bytes == -1 && errno != EWOULDBLOCK && errno != EAGAIN) */ + /* if ((bytes == 0 && (mode & (TALKMODE|SLAVEMODE)) == 0) || (bytes == -1 && errno != EWOULDBLOCK && errno != EAGAIN)) */ + if (interrupted + || (bytes == -1 && errno != EWOULDBLOCK + && errno != EAGAIN)) { + if (!interrupted) + perror("input"); + break; + } + if (bytes > 0) { + sevenplus = FALSE; + if (uploadfile != -1) { + statline(mode, + "Ignored. Type ~s to stop upload"); + continue; + } + convert_lf_cr(buf, bytes); - if ((bytes == 0 || bytes == -1) && errno != EWOULDBLOCK && errno != EAGAIN) { - sprintf(s, "Write error during upload. Connection lost"); - statline(mode, s); - perror("write"); - break; - } + if (write(fd, buf, bytes) == -1) { + perror("write"); + break; + } + } + if (uploadfile != -1) { + if (uplsize == 0) { + close(uploadfile); + uploadfile = -1; + delwin(swin); + winclose(&wintab); + statline(mode, + "Upload complete: 0 bytes"); + continue; + } + if (upldp == -1) { + upllen = + read(uploadfile, uplbuf, 128); + + if (upllen == 0) { + close(uploadfile); + uploadfile = -1; + delwin(swin); + winclose(&wintab); + sprintf(s, + "Upload complete: %ld bytes", + uplpos); + statline(mode, s); + continue; + } + if (upllen == -1) { + close(uploadfile); + uploadfile = -1; + delwin(swin); + winclose(&wintab); + sprintf(s, + "Error reading upload file: upload aborted at %ld bytes", + uplpos); + statline(mode, s); + continue; + } + if (!binup) + convert_lf_cr(uplbuf, + upllen); + + upldp = 0; + } + bytes = + write(fd, uplbuf + upldp, + upllen - upldp); + + if ((bytes == 0 || bytes == -1) + && errno != EWOULDBLOCK + && errno != EAGAIN) { + sprintf(s, + "Write error during upload. Connection lost"); + statline(mode, s); + perror("write"); + break; + } /* if (uplpos / 1024 != (uplpos + bytes) / 1024) { */ - /* printf("\r%ld bytes sent ", uplpos + bytes); */ - sprintf(s, "%ld", uplpos + bytes); - dupdstatw(swin, s, FALSE); + /* printf("\r%ld bytes sent ", uplpos + bytes); */ + sprintf(s, "%ld", uplpos + bytes); + dupdstatw(swin, s, FALSE); /* } */ - uplpos += bytes; - upldp += bytes; + uplpos += bytes; + upldp += bytes; - if (upldp >= upllen) - upldp = -1; - } + if (upldp >= upllen) + upldp = -1; + } + } } - } - close(fd); + close(fd); - if (logfile != -1) { - close(logfile); - logfile = -1; - } - if (downloadfile != -1) { - close(downloadfile); - downloadfile = -1; - } - fcntl(STDIN_FILENO, F_SETFL, 0); + if (logfile != -1) { + close(logfile); + logfile = -1; + } + if (downloadfile != -1) { + close(downloadfile); + downloadfile = -1; + } + fcntl(STDIN_FILENO, F_SETFL, 0); - signal(SIGQUIT, SIG_IGN); - signal(SIGINT, SIG_DFL); + signal(SIGQUIT, SIG_IGN); + signal(SIGINT, SIG_DFL); - if (mode != RAWMODE) - endwin(); + if (mode != RAWMODE) + endwin(); - printf("*** Cleared\n"); + printf("*** Cleared\n"); - if (flags & FLAG_RECONNECT) { - return TRUE; - } else { - return FALSE; - } + if (flags & FLAG_RECONNECT) { + return TRUE; + } else { + return FALSE; + } } int main(int argc, char **argv) { - int p; - int mode = TALKMODE; - - while ((p = getopt(argc, argv, "b:dhm:p:rtvw:")) != -1) { - switch (p) { - case 'b': - if (*optarg != 'e' && *optarg != 'l') { - fprintf(stderr, "call: invalid argument for option '-b'\n"); - return 1; - } - backoff = *optarg == 'e'; - break; - case 'd': - debug = TRUE; - break; - case 'h': - mode = SLAVEMODE; - break; - case 'm': - if (*optarg != 's' && *optarg != 'e') { - fprintf(stderr, "call: invalid argument for option '-m'\n"); - return 1; - } - ax25mode = *optarg == 'e'; - break; - case 'p': - if ((paclen = atoi(optarg)) == 0) { - fprintf(stderr, "call: option '-p' requires a numeric argument\n"); - return 1; - } - if (paclen < 1 || paclen > 500) { - fprintf(stderr, "call: paclen must be between 1 and 500\n"); - return 1; - } - break; - case 'r': - mode = RAWMODE; - break; - case 't': - mode = TALKMODE; - break; - case 'v': - printf("call: %s\n", VERSION); - return 0; - case 'w': - if ((window = atoi(optarg)) == 0) { - fprintf(stderr, "call: option '-w' requires a numeric argument\n"); - return 1; - } - if (ax25mode) { - if (window < 1 || window > 63) { - fprintf(stderr, "call: window must be between 1 and 63 frames\n"); - return 1; - } - } else { - if (window < 1 || window > 7) { - fprintf(stderr, "call: window must be between 1 and 7 frames\n"); - return 1; + int p; + int mode = TALKMODE; + + while ((p = getopt(argc, argv, "b:dhm:p:rtvw:")) != -1) { + switch (p) { + case 'b': + if (*optarg != 'e' && *optarg != 'l') { + fprintf(stderr, + "call: invalid argument for option '-b'\n"); + return 1; + } + backoff = *optarg == 'e'; + break; + case 'd': + debug = TRUE; + break; + case 'h': + mode = SLAVEMODE; + break; + case 'm': + if (*optarg != 's' && *optarg != 'e') { + fprintf(stderr, + "call: invalid argument for option '-m'\n"); + return 1; + } + ax25mode = *optarg == 'e'; + break; + case 'p': + if ((paclen = atoi(optarg)) == 0) { + fprintf(stderr, + "call: option '-p' requires a numeric argument\n"); + return 1; + } + if (paclen < 1 || paclen > 500) { + fprintf(stderr, + "call: paclen must be between 1 and 500\n"); + return 1; + } + break; + case 'r': + mode = RAWMODE; + break; + case 't': + mode = TALKMODE; + break; + case 'v': + printf("call: %s\n", VERSION); + return 0; + case 'w': + if ((window = atoi(optarg)) == 0) { + fprintf(stderr, + "call: option '-w' requires a numeric argument\n"); + return 1; + } + if (ax25mode) { + if (window < 1 || window > 63) { + fprintf(stderr, + "call: window must be between 1 and 63 frames\n"); + return 1; + } + } else { + if (window < 1 || window > 7) { + fprintf(stderr, + "call: window must be between 1 and 7 frames\n"); + return 1; + } + } + break; + case '?': + case ':': + fprintf(stderr, + "usage: call [-b l|e] [-d] [-h] [-m s|e] [-p paclen] [-r] [-t] [-v] [-w window] port callsign [[via] digipeaters...]\n"); + return 1; } - } - break; - case '?': - case ':': - fprintf(stderr, "usage: call [-b l|e] [-d] [-h] [-m s|e] [-p paclen] [-r] [-t] [-v] [-w window] port callsign [[via] digipeaters...]\n"); - return 1; } - } - - if (optind == argc || optind == argc - 1) { - fprintf(stderr, "usage: call [-b l|e] [-d] [-h] [-m s|e] [-p paclen] [-r] [-t] [-v] [-w window] port callsign [[via] digipeaters...]\n"); - return 1; - } - port = argv[optind]; - - if (ax25_config_load_ports() == 0) { - fprintf(stderr, "call: no AX.25 port data configured\n"); - return 1; - } - if (ax25_config_get_addr(port) == NULL) { - nr_config_load_ports(); - - if (nr_config_get_addr(port) == NULL) { - rs_config_load_ports(); - - if (rs_config_get_addr(port) == NULL) { - fprintf(stderr, "call: invalid port setting\n"); + + if (optind == argc || optind == argc - 1) { + fprintf(stderr, + "usage: call [-b l|e] [-d] [-h] [-m s|e] [-p paclen] [-r] [-t] [-v] [-w window] port callsign [[via] digipeaters...]\n"); + return 1; + } + port = argv[optind]; + + if (ax25_config_load_ports() == 0) { + fprintf(stderr, "call: no AX.25 port data configured\n"); return 1; - } else { - af_mode = AF_ROSE; - } + } + if (ax25_config_get_addr(port) == NULL) { + nr_config_load_ports(); + + if (nr_config_get_addr(port) == NULL) { + rs_config_load_ports(); + + if (rs_config_get_addr(port) == NULL) { + fprintf(stderr, + "call: invalid port setting\n"); + return 1; + } else { + af_mode = AF_ROSE; + } + } else { + af_mode = AF_NETROM; + } } else { - af_mode = AF_NETROM; + af_mode = AF_AX25; + } + + switch (af_mode) { + case AF_ROSE: + paclen = rs_config_get_paclen(port); + break; + + case AF_NETROM: + if (paclen == 0) + paclen = nr_config_get_paclen(port); + break; + case AF_AX25: + if (window == 0) + window = ax25_config_get_window(port); + if (paclen == 0) + paclen = ax25_config_get_paclen(port); + break; + } + + printf("GW4PTS AX.25 Connect v1.11\n"); + + while (cmd_call(argv + optind + 1, mode)) { + printf("Wait 60 sec before reconnect\n"); + sleep(60); } - } else { - af_mode = AF_AX25; - } - - switch (af_mode) { - case AF_ROSE: - paclen = rs_config_get_paclen(port); - break; - - case AF_NETROM: - if (paclen == 0) - paclen = nr_config_get_paclen(port); - break; - case AF_AX25: - if (window == 0) - window = ax25_config_get_window(port); - if (paclen == 0) - paclen = ax25_config_get_paclen(port); - break; - } - - printf("GW4PTS AX.25 Connect v1.11\n"); - - while (cmd_call(argv + optind + 1, mode)) { - printf("Wait 60 sec before reconnect\n"); - sleep(60); - } - - return 0; + + return 0; } -- cgit v1.2.3