Synchronet now requires the libarchive development package (e.g. libarchive-dev on Debian-based Linux distros, libarchive.org for more info) to build successfully.

Commits (2)
Version 1.2
-----------
Aspect ratio enforcement
Support internal smooth scaling
Support toggling scaling blocky vs smooth
Support for telnets
Support for SSH "none" auth method
Support for VGA mode
Start of RIP and SkyPix support (incomplete)
Added a comment field to listings
Default connection type changed to SSH
ALT-Left/ALT-Right for window size snapping, ALT-Up/ALT-Down for speed
Use the colodore C64 palette with "most common" adjustments
On Windows, indicate "awareness" for "High DPI"
Prefer X11 mode over SDL mode
Fix scrolling with left/right margins
Resumed ZModem ETA estimation fix
Version 1.1
-----------
Don't wait for keypress after file transfer completes
......
......@@ -15,7 +15,7 @@ set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/LICENCE)
set(CPACK_MONOLITHIC_INSTALL TRUE)
set(CPACK_PACKAGE_EXECUTABLES "syncterm;SyncTERM")
set(CPACK_DEBIAN_PACKAGE_NAME syncterm)
set(CPACK_DEBIAN_PACKAGE_VERSION 1.2a)
set(CPACK_DEBIAN_PACKAGE_VERSION 1.2b)
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Stephen Hurd")
INCLUDE(CPack)
######
......
......@@ -21,7 +21,7 @@
<string>SyncTERM</string>
<key>CFBundleShortVersionString</key>
<string>1.2a</string>
<string>1.2b</string>
<key>CFBundleGetInfoString</key>
<string>An ANSI-BBS terminal which supports telnet, rlogin, and SSH</string>
......
......@@ -32,6 +32,8 @@
#include "term.h"
#include "window.h"
#include "amigafont.h"
#include "ripper.h"
#include "sexyz.h"
// TODO: Output parsing... (yech)
// TODO: Actually make the graphics viewport work properly
......@@ -272,6 +274,7 @@ static struct {
struct {
int sx, sy, ex, ey, xpos, ypos;
} text_region;
struct bbslist *bbs;
} rip = {
RIP_STATE_BOL,
RIP_STATE_FLUSHING,
......@@ -307,6 +310,7 @@ static struct {
0, 0,
NULL,
{0, 0, 0, 0, 0, 0},
NULL,
};
static const uint16_t rip_line_patterns[4] = {
......@@ -12487,25 +12491,28 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
break;
if (strchr(&args[6], '\\'))
break;
if (!get_cache_fn_base(rip.bbs, cache_path, sizeof(cache_path)))
break;
strcat(cache_path, &args[6]);
struct stat st;
char str[1024];
char dstr[64];
struct tm tm;
switch(arg1) {
case 0:
if (access(&args[6], R_OK))
if (access(cache_path, R_OK))
conn_send("0", 1, 1000);
else
conn_send("1", 1, 1000);
break;
case 1:
if (access(&args[6], R_OK))
if (access(cache_path, R_OK))
conn_send("0\r", 2, 1000);
else
conn_send("1\r", 2, 1000);
break;
case 2:
if (stat(&args[6], &st))
if (stat(cache_path, &st))
conn_send("0\r", 2, 1000);
else {
sprintf(str, "1.%" PRIdOFF "\n", st.st_size);
......@@ -12513,7 +12520,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
}
break;
case 3:
if (stat(&args[6], &st))
if (stat(cache_path, &st))
conn_send("0\r", 2, 1000);
else {
localtime_r(&st.st_atime, &tm);
......@@ -12523,7 +12530,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
}
break;
case 4:
if (stat(&args[6], &st))
if (stat(cache_path, &st))
conn_send("0\r", 2, 1000);
else {
localtime_r(&st.st_atime, &tm);
......@@ -12604,7 +12611,8 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
* parameters, should be set to "10".
*/
handled = true;
cache_path[0] = 0;
if (!get_cache_fn_base(rip.bbs, cache_path, sizeof(cache_path)))
break;
GET_XY();
arg1 = parse_mega(&args[4], 2);
arg2 = parse_mega(&args[6], 1);
......@@ -13148,7 +13156,8 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
handled = true;
if (rip.clipboard == NULL)
break;
cache_path[0] = 0;
if (!get_cache_fn_base(rip.bbs, cache_path, sizeof(cache_path)))
break;
strcat(cache_path, &args[1]);
icn = fopen(cache_path, "wb");
if (icn != NULL) {
......@@ -13274,6 +13283,113 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
* command on a line of text. The protocol must begin on
* the very next line.
*/
arg1 = parse_mega(&args[0], 1);
arg2 = parse_mega(&args[1], 1);
arg3 = parse_mega(&args[2], 2);
arg4 = parse_mega(&args[4], 4);
handled = true;
if (arg1 < 0 || arg1 > 1)
break;
if (arg2 < 0 || arg2 == 4 || arg2 > 7)
break;
if (arg3 < 0 || arg3 == 0 || arg3 == 5)
break;
if (!get_cache_fn_base(rip.bbs, cache_path, sizeof(cache_path)))
break;
size_t cpln = strlen(cache_path);
if (arg1 == 0) { // Download (from BBS)
char *dldir = strdup(rip.bbs->dldir);
strcpy(rip.bbs->dldir, cache_path);
char *p = strstr(&args[8], "<>");
if (p == NULL) {
strcpy(rip.bbs->dldir, dldir);
free(dldir);
break;
}
size_t fnln = p - &args[8];
if (cpln + fnln >= cpln) {
strcpy(rip.bbs->dldir, dldir);
free(dldir);
break;
}
strncpy(&cache_path[cpln], &args[8], sizeof(cache_path) - cpln);
suspend_rip(true);
switch(arg2) {
case 0:
xmodem_download(rip.bbs, XMODEM|RECV, cache_path);
break;
case 1:
xmodem_download(rip.bbs, XMODEM|CRC|RECV, cache_path);
break;
case 2:
xmodem_download(rip.bbs, XMODEM|CRC|RECV, cache_path);
break;
case 3:
xmodem_download(rip.bbs, XMODEM|GMODE|CRC|RECV, cache_path);
break;
case 5:
xmodem_download(rip.bbs, YMODEM|CRC|RECV, cache_path);
break;
case 6:
xmodem_download(rip.bbs, YMODEM|GMODE|CRC|RECV, cache_path);
break;
case 7:
zmodem_download(rip.bbs);
break;
}
strcpy(rip.bbs->dldir, dldir);
free(dldir);
suspend_rip(false);
}
else { // Upload (to BBS)
char *uldir = strdup(rip.bbs->uldir);
strcpy(rip.bbs->uldir, cache_path);
char *p = strstr(&args[8], "<>");
if (p == NULL) {
strcpy(rip.bbs->uldir, uldir);
free(uldir);
break;
}
size_t fnln = p - &args[8];
if (cpln + fnln >= cpln) {
strcpy(rip.bbs->uldir, uldir);
free(uldir);
break;
}
strncpy(&cache_path[cpln], &args[8], sizeof(cache_path) - cpln);
FILE* fp = fopen(cache_path, "rb");
if (fp == NULL) {
strcpy(rip.bbs->uldir, uldir);
free(uldir);
break;
}
setvbuf(fp, NULL, _IOFBF, 0x10000);
suspend_rip(true);
switch(arg2) {
case 0:
xmodem_upload(rip.bbs, fp, cache_path, XMODEM_128B|XMODEM|SEND, 0);
break;
case 1:
xmodem_upload(rip.bbs, fp, cache_path, XMODEM_128B|XMODEM|CRC|SEND, 0);
break;
case 2:
xmodem_upload(rip.bbs, fp, cache_path, XMODEM|CRC|SEND, 0);
break;
case 3:
xmodem_upload(rip.bbs, fp, cache_path, XMODEM|GMODE|CRC|SEND, 0);
break;
case 5:
xmodem_upload(rip.bbs, fp, cache_path, YMODEM|CRC|SEND, 0);
break;
case 6:
xmodem_upload(rip.bbs, fp, cache_path, YMODEM|GMODE|CRC|SEND, 0);
break;
case 7:
zmodem_upload(rip.bbs, fp, cache_path);
break;
}
suspend_rip(false);
}
break;
}
break;
......@@ -14307,7 +14423,7 @@ parse_rip(BYTE *origbuf, unsigned blen, unsigned maxlen)
}
void
init_rip(int version)
init_rip(struct bbslist *bbs)
{
FREE_AND_NULL(rip.xmap);
FREE_AND_NULL(rip.ymap);
......@@ -14316,8 +14432,8 @@ init_rip(int version)
memset(&rip, 0, sizeof(rip));
rip.state = RIP_STATE_BOL;
rip.newstate = RIP_STATE_FLUSHING;
rip.enabled = version != RIP_VERSION_NONE;
rip.version = version;
rip.enabled = bbs->rip != RIP_VERSION_NONE;
rip.version = bbs->rip;
rip.x = 0;
rip.y = 0;
rip.viewport.sx = 0;
......@@ -14343,6 +14459,7 @@ init_rip(int version)
pthread_mutex_unlock(&vstatlock);
rip.viewport.ex = rip.x_dim - 1;
rip.viewport.ey = rip.y_dim - 1;
rip.bbs = bbs;
pending_len = 0;
if (pending)
......@@ -14350,7 +14467,7 @@ init_rip(int version)
moredata_len = 0;
if (moredata)
moredata[0] = 0;
if (version) {
if (bbs->rip) {
shadow_palette();
memcpy(&curr_ega_palette, &default_ega_palette, sizeof(curr_ega_palette));
set_ega_palette();
......
#ifndef RIPPER_H
#define RIPPER_H
void init_rip(int enabled);
#include "bbslist.h"
void init_rip(struct bbslist *bbs);
size_t parse_rip(BYTE *buf, unsigned blen, unsigned maxlen);
int rip_getch(void);
int rip_kbhit(void);
......
......@@ -61,8 +61,8 @@ static const KNOWNFOLDERID FOLDERID_ProgramData = {0x62AB5D82,0xFDC1,0x4DC3,{0x
#include "window.h"
#include "scale.h"
char* syncterm_version = "SyncTERM 1.2a"
#define ALPHA
char* syncterm_version = "SyncTERM 1.2b"
//#define ALPHA
#ifdef _DEBUG
" Debug ("__DATE__")"
#endif
......
Summary: An ANSI-BBS terminal which supports telnet, rlogin, and SSH
Name: SyncTERM
Version: 1.2a
Version: 1.2b
Release: 20071001
Copyright: GPL
Group: Applications/Communications
Source: http://prdownloads.sourceforge.net/syncterm/syncterm-1.2a/syncterm-src-1.2a.tgz
Source: http://prdownloads.sourceforge.net/syncterm/syncterm-1.2b/syncterm-src-1.2b.tgz
%description
An ANSI-BBS terminal designed to connect to remote BBSs via telnet, rlogin, or
......
......@@ -802,11 +802,6 @@ void erase_transfer_window(void) {
void ascii_upload(FILE *fp);
void raw_upload(FILE *fp);
#define XMODEM_128B (1<<10) /* Use 128 byte block size (ick!) */
void zmodem_upload(struct bbslist *bbs, FILE *fp, char *path);
void xmodem_upload(struct bbslist *bbs, FILE *fp, char *path, long mode, int lastch);
void xmodem_download(struct bbslist *bbs, long mode, char *path);
void zmodem_download(struct bbslist *bbs);
void begin_upload(struct bbslist *bbs, BOOL autozm, int lastch)
{
......@@ -2126,7 +2121,7 @@ void capture_control(struct bbslist *bbs)
updated=TRUE; \
}
static int get_cache_fn_base(struct bbslist *bbs, char *fn, size_t fnsz)
int get_cache_fn_base(struct bbslist *bbs, char *fn, size_t fnsz)
{
get_syncterm_filename(fn, fnsz, SYNCTERM_PATH_CACHE, FALSE);
backslash(fn);
......@@ -2532,7 +2527,7 @@ BOOL doterm(struct bbslist *bbs)
/* Main input loop */
oldmc=hold_update;
showmouse();
init_rip(bbs->rip);
init_rip(bbs);
if (bbs->rip)
ms.mode = MM_RIP;
setup_mouse_events(&ms);
......
......@@ -16,12 +16,19 @@ struct terminal {
int nostatus;
};
#define XMODEM_128B (1<<10) /* Use 128 byte block size (ick!) */
extern struct terminal term;
extern struct cterminal *cterm;
extern int log_level;
void zmodem_upload(struct bbslist *bbs, FILE *fp, char *path);
void xmodem_upload(struct bbslist *bbs, FILE *fp, char *path, long mode, int lastch);
void xmodem_download(struct bbslist *bbs, long mode, char *path);
void zmodem_download(struct bbslist *bbs);
BOOL doterm(struct bbslist *);
void mousedrag(struct vmem_cell *scrollback);
void get_cterm_size(int *cols, int *rows, int ns);
int get_cache_fn_base(struct bbslist *bbs, char *fn, size_t fnsz);
#endif