Made port selectable (#145)

* Made port selectable

* Added port number error handling

* Added checks for negative port
This commit is contained in:
Uwe Seimet 2021-07-23 15:40:01 +02:00 committed by GitHub
parent 62e7727a48
commit 56f1d99d4c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 20 deletions

View File

@ -119,7 +119,7 @@ void Banner(int argc, char* argv[])
// Initialization
//
//---------------------------------------------------------------------------
BOOL Init()
BOOL Init(int port)
{
struct sockaddr_in server;
int yes, result;
@ -134,7 +134,7 @@ BOOL Init()
monsocket = socket(PF_INET, SOCK_STREAM, 0);
memset(&server, 0, sizeof(server));
server.sin_family = PF_INET;
server.sin_port = htons(6868);
server.sin_port = htons(port);
server.sin_addr.s_addr = htonl(INADDR_ANY);
// allow address reuse
@ -723,7 +723,7 @@ bool has_suffix(const string& filename, const string& suffix) {
// Argument Parsing
//
//---------------------------------------------------------------------------
bool ParseArgument(int argc, char* argv[])
bool ParseArgument(int argc, char* argv[], int& port)
{
int id = -1;
bool is_sasi = false;
@ -731,7 +731,7 @@ bool ParseArgument(int argc, char* argv[])
string log_level = "trace";
int opt;
while ((opt = getopt(argc, argv, "-IiHhG:g:D:d:")) != -1) {
while ((opt = getopt(argc, argv, "-IiHhG:g:D:d:p:")) != -1) {
switch (tolower(opt)) {
case 'i':
is_sasi = false;
@ -759,6 +759,14 @@ bool ParseArgument(int argc, char* argv[])
continue;
}
case 'p':
port = atoi(optarg);
if (port <= 0 || port > 65535) {
cerr << "Invalid port " << optarg << ", port must be between 1 and 65535" << endl;
return false;
}
continue;
default:
return false;
@ -944,9 +952,16 @@ int main(int argc, char* argv[])
// Output the Banner
Banner(argc, argv);
// Initialize
// Argument parsing
int ret = 0;
if (!Init()) {
int port = 6868;
if (!ParseArgument(argc, argv, port)) {
ret = EINVAL;
goto err_exit;
}
// Initialize
if (!Init(port)) {
ret = EPERM;
goto init_exit;
}
@ -954,12 +969,6 @@ int main(int argc, char* argv[])
// Reset
Reset();
// Argument parsing
if (!ParseArgument(argc, argv)) {
ret = EINVAL;
goto err_exit;
}
// Set the affinity to a specific processor core
FixCpu(3);

View File

@ -26,14 +26,14 @@ using namespace rascsi_interface;
// Send Command
//
//---------------------------------------------------------------------------
int SendCommand(const char *hostname, const Command& command)
int SendCommand(const char *hostname, int port, const Command& command)
{
// Create a socket to send the command
int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(6868);
server.sin_port = htons(port);
server.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
struct hostent *host = gethostbyname(hostname);
@ -45,7 +45,7 @@ int SendCommand(const char *hostname, const Command& command)
// Connect
if (connect(fd, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) < 0) {
cerr << "Error: Can't connect to rascsi process on host '" << hostname << "'" << endl;
cerr << "Error: Can't connect to rascsi process on '" << hostname << ":" << port << "'" << endl;
return -1;
}
@ -136,13 +136,14 @@ int main(int argc, char* argv[])
if (argc < 2) {
cerr << "SCSI Target Emulator RaSCSI Controller" << endl;
cerr << "version " << rascsi_get_version_string() << " (" << __DATE__ << ", " << __TIME__ << ")" << endl;
cerr << "Usage: " << argv[0] << " -i ID [-u UNIT] [-c CMD] [-t TYPE] [-f FILE] [-h HOSTNAME] [-g LOG_LEVEL]" << endl;
cerr << "Usage: " << argv[0] << " -i ID [-u UNIT] [-c CMD] [-t TYPE] [-f FILE] [-h HOSTNAME] [-p PORT] [-g LOG_LEVEL]" << endl;
cerr << " where ID := {0|1|2|3|4|5|6|7}" << endl;
cerr << " UNIT := {0|1} default setting is 0." << endl;
cerr << " CMD := {attach|detach|insert|eject|protect}" << endl;
cerr << " TYPE := {hd|mo|cd|bridge|daynaport}" << endl;
cerr << " FILE := image file path" << endl;
cerr << " HOSTNAME := rascsi host to connect to, default is 'localhost'" << endl;
cerr << " PORT := rascsi port to connect to, default is 6868" << endl;
cerr << " LOG_LEVEL := log level {trace|debug|info|warn|err|critical|off}, default is 'trace'" << endl;
cerr << " If CMD is 'attach' or 'insert' the FILE parameter is required." << endl;
cerr << "Usage: " << argv[0] << " -l" << endl;
@ -158,9 +159,10 @@ int main(int argc, char* argv[])
Operation cmd = LIST;
DeviceType type = UNDEFINED;
const char *hostname = "localhost";
int port = 6868;
string params;
opterr = 0;
while ((opt = getopt(argc, argv, "i:u:c:t:f:h:g:l")) != -1) {
while ((opt = getopt(argc, argv, "i:u:c:t:f:h:p:g:l")) != -1) {
switch (opt) {
case 'i':
id = optarg[0] - '0';
@ -238,6 +240,14 @@ int main(int argc, char* argv[])
hostname = optarg;
break;
case 'p':
port = atoi(optarg);
if (port <= 0 || port > 65535) {
cerr << "Invalid port " << optarg << ", port must be between 1 and 65535" << endl;
exit(-1);
}
break;
case 'g':
cmd = LOG_LEVEL;
params = optarg;
@ -250,7 +260,7 @@ int main(int argc, char* argv[])
if (cmd == LOG_LEVEL) {
command.set_cmd(LOG_LEVEL);
command.set_params(params);
int fd = SendCommand(hostname, command);
int fd = SendCommand(hostname, port, command);
if (fd < 0) {
exit(ENOTCONN);
}
@ -262,7 +272,7 @@ int main(int argc, char* argv[])
// List display only
if (cmd == LIST || (id < 0 && type == UNDEFINED && params.empty())) {
command.set_cmd(LIST);
int fd = SendCommand(hostname, command);
int fd = SendCommand(hostname, port, command);
if (fd < 0) {
exit(ENOTCONN);
}
@ -335,7 +345,7 @@ int main(int argc, char* argv[])
command.set_params(params);
}
int fd = SendCommand(hostname, command);
int fd = SendCommand(hostname, port, command);
if (fd == -1) {
exit(ENOTCONN);
}