diff options
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/ln.c | 114 | ||||
-rw-r--r-- | coreutils/mkdir.c | 119 | ||||
-rw-r--r-- | coreutils/rmdir.c | 44 |
3 files changed, 188 insertions, 89 deletions
diff --git a/coreutils/ln.c b/coreutils/ln.c index 3e87b579e..cd3cb4e45 100644 --- a/coreutils/ln.c +++ b/coreutils/ln.c @@ -1,52 +1,100 @@ +/* + * Mini ln 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/stat.h> -#include <sys/param.h> +#include <dirent.h> #include <errno.h> -const char ln_usage[] = "ln [-s] [-f] original-name additional-name\n" + +static const char ln_usage[] = "ln [-s] [-f] original-name additional-name\n" "\n" "\tAdd a new name that refers to the same file as \"original-name\"\n" "\n" "\t-s:\tUse a \"symbolic\" link, instead of a \"hard\" link.\n" "\t-f:\tRemove existing destination files.\n"; -int -ln_fn(const struct FileInfo * i) + +static int symlinkFlag = FALSE; +static int removeoldFlag = FALSE; +static const char *destName; + + +extern int ln_main(int argc, char **argv) { - int status = 0; - char d[PATH_MAX]; - const char * destination = i->destination; + int status; + char newdestName[NAME_MAX]; - if ( !i->makeSymbolicLink && (i->stat.st_mode & S_IFMT) == S_IFDIR ) { - fprintf(stderr, "Please use \"ln -s\" to link directories.\n"); - return 1; - } + if (argc < 3) { + fprintf(stderr, "Usage: %s", ln_usage); + exit (FALSE); + } + argc--; + argv++; - /* - * If the destination is a directory, create a file within it. - */ - if ( is_a_directory(i->destination) ) { - destination = join_paths( - d - ,i->destination - ,&i->source[i->directoryLength]); - } + /* Parse any options */ + while (**argv == '-') { + while (*++(*argv)) + switch (**argv) { + case 's': + symlinkFlag = TRUE; + break; + case 'f': + removeoldFlag = TRUE; + break; + default: + fprintf(stderr, "Usage: %s\n", ln_usage); + exit(FALSE); + } + argc--; + argv++; + } - if ( i->force ) - status = ( unlink(destination) && errno != ENOENT ); - if ( status == 0 ) { - if ( i->makeSymbolicLink ) - status = symlink(i->source, destination); - else - status = link(i->source, destination); - } + destName = argv[argc - 1]; - if ( status != 0 ) { - name_and_error(destination); - return 1; + if ((argc > 3) && !(isDirectory(destName))) { + fprintf(stderr, "%s: not a directory\n", destName); + exit (FALSE); + } + + while (argc-- >= 2) { + strcpy(newdestName, destName); + strcat(newdestName, (*argv)+(strlen(*(++argv)))); + + if (removeoldFlag==TRUE ) { + status = ( unlink(newdestName) && errno != ENOENT ); + if ( status != 0 ) { + perror(newdestName); + exit( FALSE); + } } + if ( symlinkFlag==TRUE) + status = symlink(*argv, newdestName); else - return 0; + status = link(*argv, newdestName); + if ( status != 0 ) { + perror(newdestName); + exit( FALSE); + } + } + exit( TRUE); } diff --git a/coreutils/mkdir.c b/coreutils/mkdir.c index 8f1fa04db..61d35d5cd 100644 --- a/coreutils/mkdir.c +++ b/coreutils/mkdir.c @@ -1,58 +1,85 @@ +/* + * Mini mkdir 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 <errno.h> #include <sys/param.h> -const char mkdir_usage[] = "mkdir [-m mode] directory [directory ...]\n" -"\tCreate directories.\n" -"\n" -"\t-m mode:\tSpecifiy the mode for the new directory\n" -"\t\tunder the argument directory."; +const char mkdir_usage[] = "Usage: mkdir [OPTION] DIRECTORY...\n" +"Create the DIRECTORY(ies), if they do not already exist\n\n" +"-m\tset permission mode (as in chmod), not rwxrwxrwx - umask\n" +"-p\tno error if existing, make parent directories as needed\n"; -/*make directories skipping the last part of the path. Used here and by untar*/ -int mkdir_until(const char *fpath, const struct FileInfo * fi) -{ - char path[PATH_MAX]; - char * s = path; - strcpy(path, fpath); - if ( s[0] == '\0' && s[1] == '\0' ) { - usage(mkdir_usage); - return 1; - } - s++; - while ( *s != '\0' ) { - if ( *s == '/' ) { - int status; - - *s = '\0'; - status = mkdir(path, (fi?fi->orWithMode:0700) ); - *s = '/'; - - if ( status != 0 ) { - if ( errno != EEXIST ) { - name_and_error(fpath); - return 1; - } - } - - } - s++; - } - return 0; -} +static int parentFlag = FALSE; +static int permFlag = FALSE; +static mode_t mode = 0777; + -int -mkdir_fn(const struct FileInfo * i) +extern int mkdir_main(int argc, char **argv) { - if ( i->makeParentDirectories ) { - if(mkdir_until(i->source, i)) return 1; - } + argc--; + argv++; + + /* Parse any options */ + while (argc > 1 && **argv == '-') { + while (*++(*argv)) + switch (**argv) { + case 'm': + permFlag = TRUE; + break; + case 'p': + parentFlag = TRUE; + break; + default: + fprintf(stderr, "%s\n", mkdir_usage); + exit(FALSE); + } + argc--; + argv++; + } + - if ( mkdir(i->source, i->orWithMode) != 0 && errno != EEXIST ) { - name_and_error(i->source); - return 1; + if (argc < 1) { + fprintf(stderr, "%s\n", mkdir_usage); + exit (FALSE); + } + + while (--argc > 0) { + struct stat statBuf; + if (stat(*(++argv), &statBuf) != ENOENT) { + fprintf(stderr, "%s: File exists\n", *argv); + return( FALSE); + } + if (parentFlag == TRUE) + createPath(*argv, mode); + else { + if (mkdir (*argv, mode) != 0) { + perror(*argv); + exit( FALSE); + } } - else - return 0; + } + exit( TRUE); } + diff --git a/coreutils/rmdir.c b/coreutils/rmdir.c index 069e68546..b4da03f12 100644 --- a/coreutils/rmdir.c +++ b/coreutils/rmdir.c @@ -1,17 +1,41 @@ +/* + * Mini rmdir 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 <errno.h> -const char rmdir_usage[] = "rmdir directory [directory ...]\n" -"\n" -"\tDelete directories.\n"; -extern int -rmdir_fn(const struct FileInfo * i) +extern int rmdir_main(int argc, char **argv) { - if ( rmdir(i->source) != 0 && errno != ENOENT && !i->force ) { - name_and_error(i->source); - return 1; + if ( argc==1 || **(argv+1) == '-' ) { + fprintf(stderr, "Usage: rmdir [OPTION]... DIRECTORY...\nRemove the DIRECTORY(ies), if they are empty."); + exit(FALSE); + } + + while (--argc > 0) { + if ( rmdir(*(++argv)) == -1 ) { + fprintf(stderr, "%s: %s\n", *argv, strerror(errno)); + exit(FALSE); } - else - return 0; + } + exit(TRUE); } |