aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/doscmd
diff options
context:
space:
mode:
authorThomas Gellekum <tg@FreeBSD.org>2001-05-22 11:31:08 +0000
committerThomas Gellekum <tg@FreeBSD.org>2001-05-22 11:31:08 +0000
commit8784582c8a1db381b809fde48c5650d6ac66b86f (patch)
tree46f0e542bfd293703ac17c116fd392ae118afe00 /usr.bin/doscmd
parent989884fab96416144cb0881c1d5ed3aaae67ee72 (diff)
downloadsrc-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.c24
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)