c-hash-breaker/client/config.c
2024-03-02 23:55:03 +01:00

148 lines
4.9 KiB
C

#include <stdio.h>
#include <bsd/string.h>
#include <arpa/inet.h>
#include <errno.h>
#include <getopt.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <sysexits.h>
#include <linux/limits.h>
#include "../default.h"
#include "../shared.h"
#include "main.h"
#include "config.h"
int setConfig(int argc, char *argv[], config_t *currentConfig_p) {
int numberOptions;
while ((numberOptions = getopt(argc, argv, "a:p:l:b:e:f:w:h")) != -1) {
// a: Server address
// p: Server port
// l: Max password length (default 8)
// b: Ascii generation begin (default 32)
// e: Ascii generation end (default 127)
// f: Log file
// w: Wordlist
// h: Help
currentConfig_p->AsciiBegin = 32;
currentConfig_p->AsciiEnd = 127;
currentConfig_p->maxLength = 8;
currentConfig_p->logToFile = false;
currentConfig_p->wordlist = false;
switch (numberOptions) {
case 'a':
if (inet_addr(optarg) == INADDR_NONE) {
fprintf(stderr, "Adresse IP du serveur invalide.\n");
return EX_CONFIG;
}
currentConfig_p->serverIP = inet_addr(optarg);
break;
case 'f':
if (strncmp(optarg, "", PATH_MAX) == 0) { // Max size based on POSIX spec
break;
}
currentConfig_p->logToFile = true;
strlcpy(currentConfig_p->logFile, optarg, PATH_MAX);
break;
case 'w':
if (strncmp(optarg, "", PATH_MAX) == 0) { // Max size based on POSIX spec
break;
}
currentConfig_p->wordlist = true;
strlcpy(currentConfig_p->wordlistPath, optarg, PATH_MAX);
break;
case 'p':
errno = 0;
if (strtol(optarg, NULL, 10) > MIN_PORT && strtol(optarg, NULL, 10) <= MAX_PORT) {
currentConfig_p->serverPort = (unsigned short) strtol(optarg, NULL, 10);
} else {
fprintf(stderr, "Invalid port.\n");
printHelp();
return EX_CONFIG;
}
if (errno == ERANGE) {
showError(NULL);
printHelp();
return EX_CONFIG;
}
break;
case 'l':
errno = 0;
if (strtol(optarg, NULL, 10) < 0) {
fprintf(stderr, "length is invalid, must be >0.\n");
printHelp();
return EX_CONFIG;
}
currentConfig_p->maxLength = (unsigned short) strtol(optarg, NULL, 10);
if (errno == ERANGE) {
showError(NULL);
printHelp();
return EX_CONFIG;
}
break;
case 'b':
errno = 0;
if (strtol(optarg, NULL, 10) < 0) {
fprintf(stderr, "Invalid settings, must be >0.\n");
printHelp();
return EX_CONFIG;
}
if (strtol(optarg, NULL, 10) > 127) {
fprintf(stderr, "Invalid settings, must be =<127.\n");
printHelp();
return EX_CONFIG;
}
currentConfig_p->AsciiBegin = (unsigned short) strtol(optarg, NULL, 10);
if (errno == ERANGE) {
showError(NULL);
printHelp();
return EX_CONFIG;
}
break;
case 'e':
errno = 0;
if (strtol(optarg, NULL, 10) < 0) {
fprintf(stderr, "Invalid settings, must be >0.\n");
printHelp();
return EX_CONFIG;
}
if (strtol(optarg, NULL, 10) > 127) {
fprintf(stderr, "Invalid settings, must be =<127.\n");
printHelp();
return EX_CONFIG;
}
currentConfig_p->AsciiEnd = (unsigned short) strtol(optarg, NULL, 10);
if (errno == ERANGE) {
showError(NULL);
printHelp();
return EX_CONFIG;
}
break;
case 'h':
printHelp();
exit(EXIT_SUCCESS);
default:
printHelp();
return EX_CONFIG;
}
}
// Verify mandatory options.
if (currentConfig_p->maxLength == 0) {
printHelp();
return EX_CONFIG;
}
if (currentConfig_p->serverPort == 0) {
printHelp();
return EX_CONFIG;
}
return EXIT_SUCCESS;
}