[Haiku-commits] r31009 - haiku/trunk/src/tools/fs_shell
axeld at BerliOS
axeld at mail.berlios.de
Thu Jun 11 20:44:16 CEST 2009
Author: axeld
Date: 2009-06-11 20:44:16 +0200 (Thu, 11 Jun 2009)
New Revision: 31009
ViewCVS: http://svn.berlios.de/viewcvs/haiku?rev=31009&view=rev
Modified:
haiku/trunk/src/tools/fs_shell/fssh.cpp
Log:
* Added "mv" command (BFS only, cannot access the host yet).
* Fixed warning in print_flag().
Modified: haiku/trunk/src/tools/fs_shell/fssh.cpp
===================================================================
--- haiku/trunk/src/tools/fs_shell/fssh.cpp 2009-06-11 08:48:40 UTC (rev 31008)
+++ haiku/trunk/src/tools/fs_shell/fssh.cpp 2009-06-11 18:44:16 UTC (rev 31009)
@@ -321,7 +321,7 @@
print_flag(uint32_t deviceFlags, uint32_t testFlag, const char *yes,
const char *no)
{
- printf((deviceFlags & testFlag) != 0 ? yes : no);
+ printf("%s", (deviceFlags & testFlag) != 0 ? yes : no);
}
@@ -576,6 +576,26 @@
}
+static fssh_status_t
+move_entry(int dir, const char *entry, int targetDir, const char* target,
+ bool force)
+{
+ // stat the file
+ struct fssh_stat st;
+ fssh_status_t status = _kern_read_stat(dir, entry, false, &st, sizeof(st));
+ if (status != FSSH_B_OK) {
+ if (force && status == FSSH_B_ENTRY_NOT_FOUND)
+ return FSSH_B_OK;
+
+ fprintf(stderr, "Error: Failed to move \"%s\": %s\n", entry,
+ fssh_strerror(status));
+ return status;
+ }
+
+ return _kern_rename(dir, entry, targetDir, target);
+}
+
+
// #pragma mark - Commands
@@ -962,6 +982,80 @@
static fssh_status_t
+command_mv(int argc, const char* const* argv)
+{
+ bool force = false;
+
+ // parse parameters
+ int argi = 1;
+ for (argi = 1; argi < argc; argi++) {
+ const char *arg = argv[argi];
+ if (arg[0] != '-')
+ break;
+
+ if (arg[1] == '\0') {
+ fprintf(stderr, "Error: Invalid option \"-\"\n");
+ return FSSH_B_BAD_VALUE;
+ }
+
+ for (int i = 1; arg[i]; i++) {
+ switch (arg[i]) {
+ case 'f':
+ force = true;
+ break;
+ default:
+ fprintf(stderr, "Error: Unknown option \"-%c\"\n", arg[i]);
+ return FSSH_B_BAD_VALUE;
+ }
+ }
+ }
+
+ // check params
+ int count = argc - 1 - argi;
+ if (count <= 0) {
+ fprintf(stderr, "Usage: %s [-f] <file>... <target>\n", argv[0]);
+ return FSSH_B_BAD_VALUE;
+ }
+
+ const char* target = argv[argc - 1];
+
+ // stat the target
+ struct fssh_stat st;
+ fssh_status_t status = _kern_read_stat(-1, target, true, &st, sizeof(st));
+ if (status != FSSH_B_OK && count != 1) {
+ fprintf(stderr, "Error: Failed to stat target \"%s\": %s\n", target,
+ fssh_strerror(status));
+ return status;
+ }
+
+ if (status == FSSH_B_OK && FSSH_S_ISDIR(st.fssh_st_mode)) {
+ // move several entries
+ int targetDir = _kern_open_dir(-1, target);
+ if (targetDir < 0) {
+ fprintf(stderr, "Error: Failed to open dir \"%s\": %s\n", target,
+ fssh_strerror(targetDir));
+ return targetDir;
+ }
+
+ // move loop
+ for (; argi < argc - 1; argi++) {
+ status = move_entry(-1, argv[argi], targetDir, argv[argi], force);
+ if (status != FSSH_B_OK) {
+ _kern_close(targetDir);
+ return status;
+ }
+ }
+
+ _kern_close(targetDir);
+ return FSSH_B_OK;
+ }
+
+ // rename single entry
+ return move_entry(-1, argv[argi], -1, target, force);
+}
+
+
+static fssh_status_t
command_query(int argc, const char* const* argv)
{
if (argc != 2) {
@@ -1024,7 +1118,7 @@
static fssh_status_t
-command_rm(int argc, char **argv)
+command_rm(int argc, const char* const* argv)
{
bool recursive = false;
bool force = false;
@@ -1099,6 +1193,7 @@
command_ls, "ls", "list files or directories",
command_mkdir, "mkdir", "create directories",
command_mkindex, "mkindex", "create an index",
+ command_mv, "mv", "move/rename files and directories",
command_query, "query", "query for files",
command_quit, "quit/exit", "quit the shell",
command_rm, "rm", "remove files and directories",
More information about the Haiku-commits
mailing list