* Copyright 2005-2007, Ingo Weinhold, bonefish@cs.tu-berlin.de.
* Distributed under the terms of the MIT License.
*/
#include "fs_shell_command_beos.h"
#include <stdio.h>
#include <string.h>
#include <OS.h>
#include "fs_shell_command.h"
bool gUsesFifos = false;
bool
send_external_command(const char *command, int *result)
{
int commandLen = strlen(command);
if (commandLen > kMaxCommandLength) {
fprintf(stderr, "Error: Command line too long.\n");
return false;
}
char _message[sizeof(external_command_message) + kMaxCommandLength];
external_command_message* message = (external_command_message*)_message;
strcpy(message->command, command);
port_id commandPort = find_port(kFSShellCommandPort);
if (commandPort < 0) {
fprintf(stderr, "Error: Couldn't find fs_shell command port.\n");
return false;
}
port_id replyPort = create_port(1, "fs shell reply port");
if (replyPort < 0) {
fprintf(stderr, "Error: Failed to create a reply port: %s\n",
strerror(replyPort));
return false;
}
message->reply_port = replyPort;
status_t error;
do {
error = write_port(commandPort, 0, message,
sizeof(external_command_message) + commandLen);
} while (error == B_INTERRUPTED);
if (error != B_OK) {
fprintf(stderr, "Error: Failed to send command: %s\n", strerror(error));
return false;
}
external_command_reply reply;
ssize_t bytesRead;
do {
int32 code;
bytesRead = read_port(replyPort, &code, &reply, sizeof(reply));
} while (bytesRead == B_INTERRUPTED);
if (bytesRead < 0) {
fprintf(stderr, "Error: Failed to read reply from fs_shell: %s\n",
strerror(bytesRead));
return false;
}
*result = reply.error;
return true;
}