diff options
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/df.c | 9 | ||||
-rw-r--r-- | coreutils/mv.c | 104 | ||||
-rw-r--r-- | coreutils/touch.c | 87 |
3 files changed, 158 insertions, 42 deletions
diff --git a/coreutils/df.c b/coreutils/df.c index 354b2a7ca..8cc93814b 100644 --- a/coreutils/df.c +++ b/coreutils/df.c @@ -3,6 +3,7 @@ #include <mntent.h> #include <sys/stat.h> #include <sys/vfs.h> +#include <fstab.h> const char df_usage[] = "df [filesystem ...]\n" "\n" @@ -10,7 +11,7 @@ const char df_usage[] = "df [filesystem ...]\n" static int -df(const char * device, const char * mountPoint) +df(char* device, const char * mountPoint) { struct statfs s; long blocks_used; @@ -25,6 +26,8 @@ df(const char * device, const char * mountPoint) blocks_used = s.f_blocks - s.f_bfree; blocks_percent_used = (long) (blocks_used * 100.0 / (blocks_used + s.f_bavail) + 0.5); + if ( strcmp(device, "/dev/root")==0) + device=(getfsfile ("/"))->fs_spec; printf( "%-20s %9ld %9ld %9ld %3ld%% %s\n", @@ -75,7 +78,7 @@ df_main(int argc, char * * argv) } while ( (mountEntry = getmntent (mountTable))) { - int status=df(mountEntry->mnt_fsname ,mountEntry->mnt_dir); + int status=df(mountEntry->mnt_fsname, mountEntry->mnt_dir); if (status) return status; } @@ -129,3 +132,5 @@ findMountPoint(const char* name, const char* table) endmntent(mountTable); return mountEntry; } + + diff --git a/coreutils/mv.c b/coreutils/mv.c index 22c4a1207..610040d92 100644 --- a/coreutils/mv.c +++ b/coreutils/mv.c @@ -1,38 +1,84 @@ +/* + * Mini mv implementation for busybox + * + * Copyright (C) 1998 by Erik Andersen <andersee@debian.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + #include "internal.h" #include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <utime.h> #include <errno.h> -const char mv_usage[] = "mv source-file destination-file\n" -"\t\tmv source-file [source-file ...] destination-directory\n" -"\n" -"\tMove the source files to the destination.\n" -"\n"; +const char mv_usage[] = "source-file [source-file ...] destination-file\n" + "\n" "\tMove the source files to the destination.\n" "\n"; + -extern int -mv_fn(const struct FileInfo * i) + +extern int mv_main (int argc, char **argv) { - struct stat destination_stat; - char d[1024]; - struct FileInfo n; - - if ( stat(i->destination, &destination_stat) == 0 ) { - if ( i->stat.st_ino == destination_stat.st_ino - && i->stat.st_dev == destination_stat.st_dev ) - return 0; /* Move file to itself. */ - } - if ( (destination_stat.st_mode & S_IFMT) == S_IFDIR ) { - n = *i; - n.destination = join_paths(d, i->destination, basename(i->source)); - i = &n; + const char *srcName; + const char *destName; + const char *lastArg; + BOOL dirFlag; + + if (argc < 3) { + fprintf (stderr, "Usage: %s %s", *argv, mv_usage); + return (FALSE); + } + lastArg = argv[argc - 1]; + + dirFlag = isDirectory (lastArg); + + if ((argc > 3) && !dirFlag) { + fprintf (stderr, "%s: not a directory\n", lastArg); + + return (FALSE); + } + + while (argc-- > 2) { + srcName = *(++argv); + + if (access (srcName, 0) < 0) { + perror (srcName); + continue; } - if ( rename(i->source, i->destination) == 0 ) - return 0; - else if ( errno == EXDEV && is_a_directory(i->source) ) { - fprintf(stderr - ,"%s: Can't move directory across filesystems.\n" - ,i->source); - return 1; + + destName = lastArg; + + if (dirFlag) + destName = buildName (destName, srcName); + + if (rename (srcName, destName) >= 0) + continue; + + if (errno != EXDEV) { + perror (destName); + continue; } - else - return cp_fn(i); + + if (!copyFile (srcName, destName, TRUE)) + continue; + + if (unlink (srcName) < 0) + perror (srcName); + } + return (TRUE); } diff --git a/coreutils/touch.c b/coreutils/touch.c index ca4b98108..8dac10294 100644 --- a/coreutils/touch.c +++ b/coreutils/touch.c @@ -1,20 +1,85 @@ +/* + * Mini touch implementation for busybox + * + * Copyright (C) 1998 by Erik Andersen <andersee@debian.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + #include "internal.h" -#include <sys/types.h> #include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> #include <utime.h> +#include <errno.h> + -const char touch_usage[] = "touch [-c] file [file ...]\n" -"\n" +const char touch_usage[] = "touch [-c] file [file ...]\n\n" "\tUpdate the last-modified date on the given file[s].\n"; -extern int -touch_fn(const struct FileInfo * i) + + +extern int +touch_main(int argc, char **argv) { - if ( (utime(i->source, 0) != 0) && (i->create != 1) ) { - if ( fopen(i->source, "w") == NULL ) { - name_and_error(i->source); - return 1; - } + int fd; + int create=TRUE; + + if (argc < 2) { + fprintf(stderr, "Usage: %s %s", *argv, touch_usage); + exit( FALSE); + } + argc--; + argv++; + + /* Parse options */ + while (**argv == '-') { + while (*++(*argv)) switch (**argv) { + case 'c': + create = FALSE; + break; + default: + fprintf(stderr, "Unknown option: %c\n", **argv); + exit( FALSE); } - return 0; + argc--; + argv++; + } + + fd = open (*argv, (create==FALSE)? O_RDWR : O_RDWR | O_CREAT, 0644); + if (fd < 0 ) { + if (create==FALSE && errno == ENOENT) + exit( TRUE); + else { + perror("touch"); + exit( FALSE); + } + } + close( fd); + if (utime (*argv, NULL)) { + perror("touch"); + exit( FALSE); + } + else + exit( TRUE); } + + + + + + |