ref: 04ab6576311a1189b4dfeb2a38553b6440657f4d
parent: 58b17cf7f1708c585daabac3c890f02326e3fc93
author: cinap_lenrek <cinap_lenrek@centraldogma>
date: Tue Jun 7 20:44:39 EDT 2011
cp: fix filpath length limitation
--- a/sys/src/cmd/cp.c
+++ b/sys/src/cmd/cp.c
@@ -78,9 +78,10 @@
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;
@@ -87,42 +88,38 @@
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 @@
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
--
⑨