diff options
author | Thomas Gellekum <tg@FreeBSD.org> | 2001-05-22 11:31:08 +0000 |
---|---|---|
committer | Thomas Gellekum <tg@FreeBSD.org> | 2001-05-22 11:31:08 +0000 |
commit | 8784582c8a1db381b809fde48c5650d6ac66b86f (patch) | |
tree | 46f0e542bfd293703ac17c116fd392ae118afe00 /usr.bin/doscmd | |
parent | 989884fab96416144cb0881c1d5ed3aaae67ee72 (diff) | |
download | src-8784582c8a1db381b809fde48c5650d6ac66b86f.tar.gz src-8784582c8a1db381b809fde48c5650d6ac66b86f.zip |
Implement file truncation (DOS function 0x21, sub 0x40).
PR: 20925
Submitted by: Tatsuya Kudoh <cdr@cosmonet.org>
Notes
Notes:
svn path=/head/; revision=76992
Diffstat (limited to 'usr.bin/doscmd')
-rw-r--r-- | usr.bin/doscmd/dos.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/usr.bin/doscmd/dos.c b/usr.bin/doscmd/dos.c index d2d5f6d021d6..43a290bbdfd4 100644 --- a/usr.bin/doscmd/dos.c +++ b/usr.bin/doscmd/dos.c @@ -1309,6 +1309,22 @@ int21_3f(regcontext_t *REGS) ** write */ static int +write_or_truncate(int fd, char *addr, int len) +{ + off_t offset; + + if (len == 0) { + offset = lseek(fd, 0, SEEK_CUR); + if (offset < 0) + return -1; + else + return ftruncate(fd, offset); + } else { + return write(fd, addr, len); + } +} + +static int int21_40(regcontext_t *REGS) { char *addr; @@ -1322,7 +1338,7 @@ int21_40(regcontext_t *REGS) switch (R_BX) { case 0: if (redirect0) { - n = write (R_BX, addr, nbytes); + n = write_or_truncate(R_BX, addr, nbytes); break; } n = nbytes; @@ -1331,7 +1347,7 @@ int21_40(regcontext_t *REGS) break; case 1: if (redirect1) { - n = write (R_BX, addr, nbytes); + n = write_or_truncate(R_BX, addr, nbytes); break; } n = nbytes; @@ -1340,7 +1356,7 @@ int21_40(regcontext_t *REGS) break; case 2: if (redirect2) { - n = write (R_BX, addr, nbytes); + n = write_or_truncate(R_BX, addr, nbytes); break; } n = nbytes; @@ -1348,7 +1364,7 @@ int21_40(regcontext_t *REGS) tty_write(*addr++, -1); break; default: - n = write (R_BX, addr, nbytes); + n = write_or_truncate(R_BX, addr, nbytes); break; } if (n < 0) |