2025-08-12 23:37:44 +02:00

146 lines
3.5 KiB
C

#include <stdio.h>
#include "cli/cli.h"
#include "cli/term_colors.h"
#include "flexptp/logging.h"
#include "flexptp/profiles.h"
#include "flexptp/ptp_profile_presets.h"
#include "flexptp/settings_interface.h"
#include "flexptp/task_ptp.h"
#include <signal.h>
#include <ctype.h>
#include <getopt.h>
#include <inttypes.h>
#include <net/if.h>
#include <signal.h>
#include <stdlib.h>
// ------------------------------
char ptp_if_name[IFNAMSIZ] = {0};
static char config_fname[FILENAME_MAX] = {0};
void flexptp_user_event_cb(PtpUserEventCode uev) {
switch (uev) {
case PTP_UEV_INIT_DONE:
// some initial settings
ptp_load_profile(ptp_profile_preset_get("gPTP"));
ptp_log_enable(PTP_LOG_DEF, true);
ptp_log_enable(PTP_LOG_BMCA, true);
// load config file if defined
if (config_fname[0] != '\0') {
FILE *fp = fopen(config_fname, "r");
if (fp != NULL) {
printf(ANSI_ITALIC "Loading config...\n\n" ANSI_COLOR_RESET);
char * lineBuf = NULL;
size_t lineLen = 0;
do {
getline(&lineBuf, &lineLen, fp);
size_t offset = 0;
while ((lineBuf[offset] != '\0') && isspace(lineBuf[offset])) {
offset++;
}
char * lineStart = lineBuf + offset;
if (lineStart[0] != '#') {
printf(ANSI_ITALIC ANSI_COLOR_GREEN "\n> %s\n" ANSI_COLOR_RESET, lineStart);
process_cli_line(lineStart);
}
} while (!feof(fp));
free(lineBuf);
fclose(fp);
printf(ANSI_ITALIC "\n...done!\n" ANSI_COLOR_RESET);
}
}
break;
default:
break;
}
}
// ------------------------------
static void print_help() {
printf("-i, --interface=<interface> (required)\n"
"-c, --config=<config file>\n");
};
static struct option interface_opt[] = {
{"interface", required_argument, 0, 'i'},
{"config", required_argument, 0, 'c'},
{0}};
void parse_interface(int argc, char *argv[]) {
// get options
int option_index = 0;
// iterate over parameters
int c;
while ((c = getopt_long(argc, argv, "i:c:", interface_opt, &option_index)) != -1) {
switch (c) {
case 'i':
strncpy(ptp_if_name, optarg, IFNAMSIZ);
break;
case 'c':
strncpy(config_fname, optarg, FILENAME_MAX);
break;
default:
break;
}
}
// verify required options
if (ptp_if_name[0] == '\0') {
print_help();
exit(0);
}
}
static CMD_FUNCTION(exit_application) {
printf("Exiting...\n\n");
cli_exit();
return 0;
}
static void sighandler(int signum) {
cli_exit();
}
int main(int argc, char *argv[]) {
// register SIGINT signal handler
struct sigaction sa;
sa.sa_handler = sighandler;
sa.sa_flags = SA_RESTART;
sigemptyset(&sa.sa_mask);
sigaction(SIGINT, &sa, NULL);
// parse options
parse_interface(argc, argv);
// initialize the CLI
cli_init();
// register exit command
cli_register_command("exit \t\t\t Exit application", 1, 0, exit_application);
// register PTP task
reg_task_ptp();
// start the CLI
cli_start();
// unregister PTP task
unreg_task_ptp();
// clean up the network driver
linux_nsd_cleanup();
return 0;
}
// -------------------