patch #1 to Steve Grandi's xmodem
egray at fthood.UUCP
egray at fthood.UUCP
Mon Jul 18 12:37:00 AEST 1988
This is an *UN*offical patch to the version of Steve Grandi's xmodem
version 3.6 that was posted here a few days ago. I had made plenty of
changes to the 3.5 version, and a missed one when I did the 3.6
work-over... I missed the modification that fixed the end of the file
that are recieved by striping the control Z's.
Emmet P. Gray US Army, HQ III Corps & Fort Hood
...!uunet!uiucuxc!fthood!egray Attn: AFZF-DE-ENV
Directorate of Engineering & Housing
Environmental Management Office
Fort Hood, TX 76544-5057
----------------------------------------------------------------------------
*** old/Makefile Sun Jul 17 21:00:47 1988
--- Makefile Sat Jul 16 23:05:19 1988
***************
*** 2,8
LDFLAGS = -s
#CFLAGS = -O
# see the Readme.local file for what these do.
! CFLAGS = -O -DSYSV -DNOCLOBBER -DLOCAL
xmodem: $(OBJECTS)
# for users of AT&T Unix PC 7300/3b1
--- 2,8 -----
LDFLAGS = -s
#CFLAGS = -O
# see the Readme.local file for what these do.
! CFLAGS = -O -DSYSV -DNOCLOBBER -DFIX_END -DLOCAL
xmodem: $(OBJECTS)
# for users of AT&T Unix PC 7300/3b1
*** old/Readme.local Sun Jul 17 21:00:47 1988
--- Readme.local Sat Jul 16 23:12:23 1988
***************
*** 10,16
overwriting an existing file. If batch, create
unique names.
! LOCAL Change a bunch of default settings:
1) binary xfers assumed, 'b' option is optional.
2) CRC is assumed, 'c' option is now for checksum
--- 10,17 -----
overwriting an existing file. If batch, create
unique names.
! FIX_END Fix the end of recieved files by removing the
! trailing control Z's.
LOCAL Change a bunch of default settings:
1) binary xfers assumed, 'b' option is optional.
***************
*** 12,17
LOCAL Change a bunch of default settings:
1) binary xfers assumed, 'b' option is optional.
2) CRC is assumed, 'c' option is now for checksum
3) loging defaults to off, 'l' turns it on.
--- 13,19 -----
FIX_END Fix the end of recieved files by removing the
trailing control Z's.
+ LOCAL Change a bunch of default settings:
1) binary xfers assumed, 'b' option is optional.
2) CRC is assumed, 'c' option is now for checksum
3) loging defaults to off, 'l' turns it on.
***************
*** 16,23
2) CRC is assumed, 'c' option is now for checksum
3) loging defaults to off, 'l' turns it on.
! The manual page with a lower case 'l' is edited to reflect the NOCLOBBER
! and LOCAL options.
For users of the AT&T Unix PC 7300/3b1, there is a line in the Makefile
that will allow the program to be compiled with shared libraries.
--- 18,25 -----
2) CRC is assumed, 'c' option is now for checksum
3) loging defaults to off, 'l' turns it on.
! The manual page 'xmodem.local' is edited to reflect the NOCLOBBER,
! FIX_END, and LOCAL options.
For users of the AT&T Unix PC 7300/3b1, there is a line in the Makefile
that will allow the program to be compiled with shared libraries.
*** old/getput.c Sun Jul 17 21:00:52 1988
--- getput.c Thu Jul 14 16:40:19 1988
***************
*** 389,395
if (ioctl(0,TCGETA,&ttystemp) < 0) /* get tty structure */
error("Can't get TTY parameters", FALSE);
! if ((ttystemp.c_cflag & 017)<=14)
{
ttyspeed = speedtbl[ttystemp.c_cflag & 017];
logitarg ("Line speed = %d bits per second\n", ttyspeed);
--- 389,395 -----
if (ioctl(0,TCGETA,&ttystemp) < 0) /* get tty structure */
error("Can't get TTY parameters", FALSE);
! if ((ttystemp.c_cflag & 017) <= 14)
{
ttyspeed = speedtbl[ttystemp.c_cflag & 017];
logitarg ("Line speed = %d bits per second\n", ttyspeed);
*** old/getput.sysv.c Sun Jul 17 21:00:54 1988
--- getput.sysv.c Thu Jul 14 16:41:01 1988
***************
*** 389,395
if (ioctl(0,TCGETA,&ttystemp) < 0) /* get tty structure */
error("Can't get TTY parameters", FALSE);
! if ((ttystemp.c_cflag & 017)<=14)
{
ttyspeed = speedtbl[ttystemp.c_cflag & 017];
logitarg ("Line speed = %d bits per second\n", ttyspeed);
--- 389,395 -----
if (ioctl(0,TCGETA,&ttystemp) < 0) /* get tty structure */
error("Can't get TTY parameters", FALSE);
! if ((ttystemp.c_cflag & 017) <= 14)
{
ttyspeed = speedtbl[ttystemp.c_cflag & 017];
logitarg ("Line speed = %d bits per second\n", ttyspeed);
*** old/receive.c Sun Jul 17 21:00:28 1988
--- receive.c Sat Jul 16 23:25:04 1988
***************
*** 459,464
if (openflag) /* close the file */
close(fd);
sendbyte(ACK); /* ACK the EOT */
logit("Receive Complete\n");
prtime (recvsectcnt, time((time_t *) 0) - start);
--- 459,468 -----
if (openflag) /* close the file */
close(fd);
sendbyte(ACK); /* ACK the EOT */
+ #ifdef FIX_END
+ if (CHECKLENGTH == FALSE)
+ fix_end(name);
+ #endif /* FIX_END */
logit("Receive Complete\n");
prtime (recvsectcnt, time((time_t *) 0) - start);
***************
*** 491,493
return(FALSE);
}
--- 495,575 -----
return(FALSE);
}
+
+ #ifdef FIX_END
+ fix_end(name)
+ char *name;
+ {
+ FILE *fp;
+ int code;
+ long true_end;
+
+ if (!(fp = fopen(name, "r"))) {
+ fprintf(stderr, "fix_end: Can't open '%s' for read\n", name);
+ return(1);
+ }
+
+ fseek(fp, 0L, 2);
+ true_end = ftell(fp);
+ fseek(fp, -1L, 1);
+ while (getc(fp) == 0x1a) { /* find true EOF */
+ true_end--;
+ fseek(fp, -2L, 1);
+ }
+ fclose(fp);
+ code = fix_length(name, true_end);
+ return(code);
+ }
+
+ /*
+ * Shorten a file to a predetermined length. Used to remove the ^Z
+ * padding from the end of files. (Heaven help us, if one day a binary
+ * file actually has ^Z's as part of the end of the file).
+ */
+
+ int
+ fix_length(file, len)
+ char *file;
+ long len;
+ {
+ FILE *fp, *tempfp;
+ register int num;
+ char *tempfile, *mktemp(), buf[BUFSIZ];
+
+ if (!(fp = fopen(file, "r")))
+ return(1);
+
+ /*
+ * The temporary file should be in the same directory as the
+ * file being received because otherwise we'd have no way of
+ * guaranteeing they would be in the same file system. (Hard
+ * links across different file systems aren't allowed).
+ */
+ tempfile = mktemp("trunXXXXXX");
+ if (!(tempfp = fopen(tempfile, "w"))) {
+ fclose(fp);
+ return(1);
+ }
+
+ while(len) {
+ num = (len > BUFSIZ) ? BUFSIZ : len;
+ fread(buf, sizeof(char), num, fp);
+ fwrite(buf, sizeof(char), num, tempfp);
+ len -= (unsigned int) num;
+ }
+
+ fclose(fp);
+ fclose(tempfp);
+
+ if (unlink(file) < 0)
+ return(1);
+
+ if (link(tempfile, file) < 0)
+ return(1);
+
+ if (unlink(tempfile) < 0)
+ return(1);
+
+ return(0);
+ }
+ #endif /* FIX_END */
*** old/xmodem.c Sun Jul 17 21:00:30 1988
--- xmodem.c Sat Jul 16 14:44:13 1988
***************
*** 44,49
char ans[10];
#endif /* NOCLOBBER */
#ifdef LOCAL
XMITTYPE = 'b'; /* assume binary transfer */
#else /* LOCAL */
XMITTYPE = 't'; /* assume text transfer */
--- 44,50 -----
char ans[10];
#endif /* NOCLOBBER */
#ifdef LOCAL
+ int fd;
XMITTYPE = 'b'; /* assume binary transfer */
#else /* LOCAL */
XMITTYPE = 't'; /* assume text transfer */
***************
*** 219,225
if(open(argv[2], 0) != -1) /* check for overwriting */
#ifdef NOCLOBBER
while(1) {
! printf("File exists - overwrite (y/n)? ");
gets(ans);
if (ans[0] == 'n' || ans[0] == 'N')
exit(0);
--- 220,226 -----
if(open(argv[2], 0) != -1) /* check for overwriting */
#ifdef NOCLOBBER
while(1) {
! printf("File '%s' exists - overwrite (y/n)? ", argv[2]);
gets(ans);
if (ans[0] == 'n' || ans[0] == 'N')
exit(0);
***************
*** 233,238
fprintf(stderr, "Warning -- Target File Exists and is Being Overwritten\n");
#endif /* NOCLOBBER */
}
fprintf(stderr, "Ready to RECEIVE File %s", argv[2]);
fprintf(stderr, " in %s mode\n", prtype(XMITTYPE));
fprintf(stderr, "Send several Control-X characters to cancel\n");
--- 234,248 -----
fprintf(stderr, "Warning -- Target File Exists and is Being Overwritten\n");
#endif /* NOCLOBBER */
}
+ #ifdef LOCAL
+ /* check write permission */
+ if ((fd = open(argv[2], O_WRONLY|O_CREAT, 0666)) < 0) {
+ fprintf(stderr, "No write permission on file '%s'\n", argv[2]);
+ exit(1);
+ }
+ close(fd);
+ fprintf(stderr, "Ready to RECEIVE File '%s'", argv[2]);
+ #else /* LOCAL */
fprintf(stderr, "Ready to RECEIVE File %s", argv[2]);
#endif /* LOCAL */
fprintf(stderr, " in %s mode\n", prtype(XMITTYPE));
***************
*** 234,239
#endif /* NOCLOBBER */
}
fprintf(stderr, "Ready to RECEIVE File %s", argv[2]);
fprintf(stderr, " in %s mode\n", prtype(XMITTYPE));
fprintf(stderr, "Send several Control-X characters to cancel\n");
logitarg("Receiving in %s mode\n", prtype(XMITTYPE));
--- 244,250 -----
fprintf(stderr, "Ready to RECEIVE File '%s'", argv[2]);
#else /* LOCAL */
fprintf(stderr, "Ready to RECEIVE File %s", argv[2]);
+ #endif /* LOCAL */
fprintf(stderr, " in %s mode\n", prtype(XMITTYPE));
fprintf(stderr, "Send several Control-X characters to cancel\n");
logitarg("Receiving in %s mode\n", prtype(XMITTYPE));
***************
*** 294,299
error("Can't find requested file", FALSE);
expsect = (filestatbuf.st_size/128)+1;
fprintf(stderr, "File %s Ready to SEND", argv[2]);
fprintf(stderr, " in %s mode\n", prtype(XMITTYPE));
fprintf(stderr, "Estimated File Size %ldK, %ld Sectors, %ld Bytes\n",
--- 305,313 -----
error("Can't find requested file", FALSE);
expsect = (filestatbuf.st_size/128)+1;
+ #ifdef LOCAL
+ fprintf(stderr, "File '%s' Ready to SEND", argv[2]);
+ #else /* LOCAL */
fprintf(stderr, "File %s Ready to SEND", argv[2]);
#endif /* LOCAL */
fprintf(stderr, " in %s mode\n", prtype(XMITTYPE));
***************
*** 295,300
expsect = (filestatbuf.st_size/128)+1;
fprintf(stderr, "File %s Ready to SEND", argv[2]);
fprintf(stderr, " in %s mode\n", prtype(XMITTYPE));
fprintf(stderr, "Estimated File Size %ldK, %ld Sectors, %ld Bytes\n",
(filestatbuf.st_size/1024)+1, expsect,
--- 309,315 -----
fprintf(stderr, "File '%s' Ready to SEND", argv[2]);
#else /* LOCAL */
fprintf(stderr, "File %s Ready to SEND", argv[2]);
+ #endif /* LOCAL */
fprintf(stderr, " in %s mode\n", prtype(XMITTYPE));
fprintf(stderr, "Estimated File Size %ldK, %ld Sectors, %ld Bytes\n",
(filestatbuf.st_size/1024)+1, expsect,
*** old/xmodem.h Sun Jul 17 21:00:32 1988
--- xmodem.h Sat Jul 16 22:38:09 1988
***************
*** 2,7
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef SYSV
#include <time.h>
#include <termio.h>
--- 2,8 -----
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
+ #include <fcntl.h>
#ifdef SYSV
#include <time.h>
#include <termio.h>
*** old/xmodem.l Sun Jul 17 21:00:39 1988
--- xmodem.l Sun Jul 17 21:28:58 1988
***************
*** 32,38
.I xmodem
will prompt the user before overwriting an existing file of the same name.
Batch protocols avoid file name collisions by prepending the letter 'X' to
! the file name.
.TP
.B rt
Receive Text - files are converted from the CP/M and MS-DOS
--- 32,38 -----
.I xmodem
will prompt the user before overwriting an existing file of the same name.
Batch protocols avoid file name collisions by prepending the letter 'X' to
! the offending file name.
.TP
.B rt
Receive Text - files are converted from the CP/M and MS-DOS
***************
*** 127,133
will be stored under their transmitted names (except that any "/" characters
in the file name will be converted into ":" characters, all upper-case
characters will be translated into lower case and trailing dots will be
! expunged).
.PP
When a batch receive is requested,
.I xmodem
--- 127,134 -----
will be stored under their transmitted names (except that any "/" characters
in the file name will be converted into ":" characters, all upper-case
characters will be translated into lower case and trailing dots will be
! expunged). Be aware the file names may be altered by the addition of
! a leading 'X' to avoid file name collisions.
.PP
When a batch receive is requested,
.I xmodem
***************
*** 167,172
incoming file are correctly handled). File sizes are included in
the YMODEM header when sending both binary and text files. Thus files
transferred via YMODEM should preserve their exact length.
File modification times are set for received files if present in the YMODEM
header; they are included in the headers for transmitted files.
.PP
--- 168,175 -----
incoming file are correctly handled). File sizes are included in
the YMODEM header when sending both binary and text files. Thus files
transferred via YMODEM should preserve their exact length.
+ Files received using other protocols are striped of the trailing
+ control Z's (if any) in order to preserve their length.
File modification times are set for received files if present in the YMODEM
header; they are included in the headers for transmitted files.
.PP
More information about the Unix-pc.sources
mailing list