Skip to content
Open
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
196 changes: 192 additions & 4 deletions src/shell.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
#include <clip.h>
#include <image.h>
#include <ansi.h>

#define MOVEDATA_PRECISION 4096
char g_lastCommandExecuted[256] = {0};

void FsPipeTest();
Expand Down Expand Up @@ -720,7 +720,7 @@ void ShellExecuteCommand(char* p, bool* pbExit)

LogMsg("Progress...");

#define MOVEDATA_PRECISION 4096


uint8_t chunk_of_data[MOVEDATA_PRECISION];
size_t sz = FiTellSize(fd_in);
Expand Down Expand Up @@ -764,9 +764,8 @@ void ShellExecuteCommand(char* p, bool* pbExit)

FiClose(fd_out);
FiClose(fd_in);
fail_movedata:;
LogMsg("Done");

fail_movedata:;
}
else if (strcmp (token, "rmdir") == 0)
{
Expand Down Expand Up @@ -903,6 +902,195 @@ void ShellExecuteCommand(char* p, bool* pbExit)
{
KePrintMemoryMapInfo();
}
else if (strcmp (token, "cp") == 0)
{
LogMsg("Starting to copy...");
char* fileNameIn = Tokenize (&state, NULL, " ");
if (!fileNameIn)
Comment thread
isaacgravenor marked this conversation as resolved.
Outdated
{
LogMsg("Usage: cp <input> <output>");
return;
}
if (*fileNameIn == 0)
{
LogMsg("Usage: cp <input> <output>");
return;
}

char* fileNameOut = Tokenize (&state, NULL, " ");
if (!fileNameOut)
{
LogMsg("Usage: cp <input> <output>");
return;
}
if (*fileNameOut == 0)
{
LogMsg("Usage: cp <input> <output>");
return;
}

int fd_in = FiOpen (fileNameIn, O_RDONLY);
if (fd_in < 0)
{
LogMsg("cp: Could not open %s for reading: %s", fileNameIn, GetErrNoString(fd_in));
return;
}

int fd_out = FiOpen (fileNameOut, O_WRONLY | O_CREAT | O_TRUNC);
if (fd_out < 0)
{
LogMsg("cp: Could not open %s for writing: %s", fileNameOut, GetErrNoString(fd_out));
FiClose(fd_in);
return;
}

LogMsg("Progress...");



uint8_t chunk_of_data[MOVEDATA_PRECISION];
size_t sz = FiTellSize(fd_in);

//write 512 byte blocks
for (size_t i = 0; i < sz; i += MOVEDATA_PRECISION)
Comment thread
isaacgravenor marked this conversation as resolved.
{
size_t read_in = FiRead(fd_in, chunk_of_data, MOVEDATA_PRECISION);
if ((int)read_in < 0)
{
LogMsg("cp: Could not write all %d bytes to %s - only wrote %d: %s", MOVEDATA_PRECISION, fileNameOut, read_in, GetErrNoString((int)read_in));
FiClose(fd_in);
FiClose(fd_out);
return;
}

FiWrite(fd_out, chunk_of_data, read_in);

LogMsgNoCr("\rProgress: %d/%d", i, sz);
}

// write the last few bytes
int last_x_block_size = (sz % MOVEDATA_PRECISION);
for (int i = 0; i < last_x_block_size; i++)
{
size_t read_in = FiRead(fd_in, chunk_of_data, 1);
if ((int)read_in < 0)
{
LogMsg("cp: Could not write 1 byte to %s - only wrote %d: %s", fileNameOut, read_in, GetErrNoString((int)read_in));
FiClose(fd_in);
FiClose(fd_out);
return;
}

FiWrite(fd_out, chunk_of_data, read_in);

LogMsgNoCr("\rProgress: %d/%d", i, sz);
}

LogMsg("");

FiClose(fd_out);
FiClose(fd_in);
LogMsg("Done");
}

else if (strcmp (token, "mv") == 0)
{
char* fileNameIn = Tokenize (&state, NULL, " ");
if (!fileNameIn)
{
LogMsg("Usage: mv <origin> <dest>");
return;
}
if (*fileNameIn == 0)
{
LogMsg("Usage: mv <origin> <dest>");
return;
}

char* fileNameOut = Tokenize (&state, NULL, " ");
if (!fileNameOut)
{
LogMsg("Usage: mv <origin> <dest>");
return;
}
if (*fileNameOut == 0)
{
LogMsg("Usage: mv <origin> <dest>");
return;
}
int result = FiRename(fileNameIn, fileNameOut);
if(result == -ENXIO) {
Comment thread
isaacgravenor marked this conversation as resolved.
Outdated
LogMsg("FiRename failed, trying move+delete");
// Get rid of the file.
int fd_in = FiOpen (fileNameIn, O_RDONLY);
Comment thread
isaacgravenor marked this conversation as resolved.
Outdated
if (fd_in < 0)
{
LogMsg("mv: Could not open %s for reading: %s", fileNameIn, GetErrNoString(fd_in));
return;
}

int fd_out = FiOpen (fileNameOut, O_WRONLY | O_CREAT | O_TRUNC);
if (fd_out < 0)
{
LogMsg("mv: Could not open %s for writing: %s", fileNameOut, GetErrNoString(fd_out));
FiClose(fd_in);
return;
}

LogMsg("Progress...");



uint8_t chunk_of_data[MOVEDATA_PRECISION];
size_t sz = FiTellSize(fd_in);

//write 512 byte blocks
for (size_t i = 0; i < sz; i += MOVEDATA_PRECISION)
{
size_t read_in = FiRead(fd_in, chunk_of_data, MOVEDATA_PRECISION);
Comment thread
isaacgravenor marked this conversation as resolved.
Outdated
if ((int)read_in < 0)
{
LogMsg("mv: Could not write all %d bytes to %s - only wrote %d: %s", MOVEDATA_PRECISION, fileNameOut, read_in, GetErrNoString((int)read_in));
FiClose(fd_in);
FiClose(fd_out);
return;
}

FiWrite(fd_out, chunk_of_data, read_in);

LogMsgNoCr("\rProgress: %d/%d", i, sz);
}

// write the last few bytes
int last_x_block_size = (sz % MOVEDATA_PRECISION);
for (int i = 0; i < last_x_block_size; i++)
{
size_t read_in = FiRead(fd_in, chunk_of_data, 1);
if ((int)read_in < 0)
{
LogMsg("mv: Could not write 1 byte to %s - only wrote %d: %s", fileNameOut, read_in, GetErrNoString((int)read_in));
FiClose(fd_in);
FiClose(fd_out);
return;
}

FiWrite(fd_out, chunk_of_data, read_in);

LogMsgNoCr("\rProgress: %d/%d", i, sz);
}

LogMsg("");

FiClose(fd_out);
FiClose(fd_in);
int io = FiUnlinkFile (fileNameIn);
if (io < 0)
{
LogMsg("mv: couldn't remove %s: %s", fileNameOut, GetErrNoString(io));
return;
}
}
}
else if (strcmp (token, "ls") == 0)
{
enum
Expand Down