summaryrefslogtreecommitdiff
path: root/sys/src/cmd/cp.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@centraldogma>2011-06-08 00:44:39 +0000
committercinap_lenrek <cinap_lenrek@centraldogma>2011-06-08 00:44:39 +0000
commit6feb86937194c4becd1135ee9532e0b8f509195b (patch)
tree44c27c246ee409e497a38abd4ece011ac6fbd918 /sys/src/cmd/cp.c
parent8c8b19cec76121b8665ff79b6ceacee39b926635 (diff)
cp: fix filpath length limitation
Diffstat (limited to 'sys/src/cmd/cp.c')
-rw-r--r--sys/src/cmd/cp.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/sys/src/cmd/cp.c b/sys/src/cmd/cp.c
index 1b07e09e2..a7a61dca1 100644
--- a/sys/src/cmd/cp.c
+++ b/sys/src/cmd/cp.c
@@ -78,51 +78,48 @@ void
copy(char *from, char *to, int todir)
{
Dir *dirb, dirt;
- char name[256];
+ char *name;
int fdf, fdt, mode;
+ name = nil;
if(todir){
char *s, *elem;
elem=s=from;
while(*s++)
if(s[-1]=='/')
elem=s;
- sprint(name, "%s/%s", to, elem);
- to=name;
+ name = smprint("%s/%s", to, elem);
+ to = name;
}
+ fdf = fdt = -1;
if((dirb=dirstat(from))==nil){
fprint(2,"cp: can't stat %s: %r\n", from);
failed = 1;
- return;
+ goto out;
}
mode = dirb->mode;
if(mode&DMDIR){
fprint(2, "cp: %s is a directory\n", from);
- free(dirb);
failed = 1;
- return;
+ goto out;
}
if(samefile(dirb, from, to)){
- free(dirb);
failed = 1;
- return;
+ goto out;
}
mode &= 0777;
fdf=open(from, OREAD);
if(fdf<0){
fprint(2, "cp: can't open %s: %r\n", from);
- free(dirb);
failed = 1;
- return;
+ goto out;
}
fdt=create(to, OWRITE, mode);
if(fdt<0){
fprint(2, "cp: can't create %s: %r\n", to);
- close(fdf);
- free(dirb);
failed = 1;
- return;
+ goto out;
}
if(copy1(fdf, fdt, from, to)==0 && (xflag || gflag || uflag)){
nulldir(&dirt);
@@ -137,9 +134,13 @@ copy(char *from, char *to, int todir)
if(dirfwstat(fdt, &dirt) < 0)
fprint(2, "cp: warning: can't wstat %s: %r\n", to);
}
+out:
free(dirb);
- close(fdf);
- close(fdt);
+ if(fdf >= 0)
+ close(fdf);
+ if(fdt >= 0)
+ close(fdt);
+ free(name);
}
int