* SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
#ifndef lint
-static const char copyright[] =
+__used static const char copyright[] =
"@(#) Copyright (c) 1990, 1993, 1994\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#if 0
static char sccsid[] = "@(#)rm.c 8.5 (Berkeley) 4/18/94";
#else
-static const char rcsid[] =
+__used static const char rcsid[] =
"$FreeBSD: src/bin/rm/rm.c,v 1.33 2001/06/13 15:01:25 ru Exp $";
#endif
#endif /* not lint */
#include <unistd.h>
#ifdef __APPLE__
+#include <removefile.h>
+#include <pwd.h>
+#include <grp.h>
#include "get_compat.h"
#else
#define COMPAT_MODE(func, mode) 1
int ch, rflag;
char *p;
+ if (argc < 1)
+ usage();
+
/*
* Test for the special case where the utility is called as
* "unlink", for which the functionality provided is greatly
p = argv[0];
else
++p;
+ uid = geteuid();
if (strcmp(p, "unlink") == 0) {
if (argc == 2) {
rm_file(&argv[1]);
}
checkdot(argv);
- uid = geteuid();
if (*argv) {
stdin_ok = isatty(STDIN_FILENO);
break;
default:
+#ifdef __APPLE__
+ if (Pflag) {
+ if (removefile(p->fts_accpath, NULL, REMOVEFILE_SECURE_7_PASS)) /* overwrites and unlinks */
+ eval = rval = 1;
+ } else
+ rval = unlink(p->fts_accpath);
+#else /* !__APPLE_ */
if (Pflag)
rm_overwrite(p->fts_accpath, NULL);
rval = unlink(p->fts_accpath);
+#endif /* __APPLE__ */
if (rval == 0 || (fflag && errno == ENOENT)) {
if (rval == 0 && vflag)
(void)printf("%s\n",
}
if (errno)
err(1, "fts_read");
+ fts_close(fts);
}
void
else if (S_ISDIR(sb.st_mode))
rval = rmdir(f);
else {
+#ifdef __APPLE__
+ if (Pflag) {
+ if (removefile(f, NULL, REMOVEFILE_SECURE_7_PASS)) /* overwrites and unlinks */
+ eval = rval = 1;
+ } else
+ rval = unlink(f);
+#else /* !__APPLE__ */
if (Pflag)
rm_overwrite(f, &sb);
rval = unlink(f);
+#endif /* __APPLE__ */
}
}
if (rval && (!fflag || errno != ENOENT)) {
int bsize, fd, wlen;
char *buf = NULL;
- fd = -1;
if (sbp == NULL) {
if (lstat(file, &sb))
goto err;
#define PASS(byte) { \
memset(buf, byte, bsize); \
for (len = sbp->st_size; len > 0; len -= wlen) { \
- wlen = len < bsize ? len : bsize; \
+ wlen = len < bsize ? (int)len : bsize; \
if (write(fd, buf, wlen) != wlen) \
goto err; \
} \
complained = 0;
for (t = argv; *t;) {
- if ((p = strrchr(*t, '/')) != NULL)
- ++p;
- else
+ size_t len = strlen(*t);
+ char truncated[len];
+
+ if ((p = strrchr(*t, '/')) != NULL) {
+ if (p[1] == '\0') { // trailing / -- treat as if not present
+ strlcpy(truncated, *t, len);
+ p = strrchr(truncated, '/');
+ if (p) {
+ ++p;
+ } else {
+ p = truncated;
+ }
+ } else {
+ ++p;
+ }
+ } else {
p = *t;
+ }
if (ISDOT(p)) {
if (!complained++)
warnx("\".\" and \"..\" may not be removed");