diff --git a/application/tom_modem/src/main.c b/application/tom_modem/src/main.c index 91133b6..b1ef125 100644 --- a/application/tom_modem/src/main.c +++ b/application/tom_modem/src/main.c @@ -157,6 +157,10 @@ int run_op(PROFILE_T *profile,FDS_T *fds) } static void clean_up() { + if (unlock_at_port(s_profile.tty_dev)) + { + err_msg("Failed to unlock tty device"); + } if (tcsetattr(s_fds.tty_fd, TCSANOW, &s_fds.old_termios) != 0) { err_msg("Error restoring old tty attributes"); @@ -174,6 +178,16 @@ int main(int argc, char *argv[]) FDS_T *fds = &s_fds; parse_user_input(argc, argv, profile); dump_profile(); + #ifdef USE_SEMAPHORE + if (profile->tty_dev != NULL) + { + if (lock_at_port(profile->tty_dev)) + { + err_msg("Failed to lock tty device"); + return COMM_ERROR; + } + } + #endif // try open tty devices if (tty_open_device(profile,fds)) { @@ -184,6 +198,10 @@ int main(int argc, char *argv[]) if (run_op(profile,fds)) { err_msg("Failed to run operation %d", profile->op); + if (unlock_at_port(profile->tty_dev)) + { + err_msg("Failed to unlock tty device"); + } kill(getpid(), SIGINT); } diff --git a/application/tom_modem/src/utils.c b/application/tom_modem/src/utils.c index 49b2176..996c3d5 100644 --- a/application/tom_modem/src/utils.c +++ b/application/tom_modem/src/utils.c @@ -1,5 +1,48 @@ #include "utils.h" +#ifdef USE_SEMAPHORE +void generate_semaphore_name(const char* filename, char* semaphore_name) { + snprintf(semaphore_name, MAX_FILENAME_LEN, "%s%s", SEMAPHORE_PREFIX, filename); + for (int i = 0; semaphore_name[i] != '\0'; i++) { + if (semaphore_name[i] == '/') { + semaphore_name[i] = '_'; + } + } +} + +int lock_at_port(char* filename){ + char semaphore_name[MAX_FILENAME_LEN]; + generate_semaphore_name(filename, semaphore_name); + dbg_msg("semaphore_name: %s", semaphore_name); + sem_t *sem = sem_open(semaphore_name, O_CREAT, 0644, 1); + if (sem == SEM_FAILED) { + perror("sem_open failed"); + return -1; + } + wait_start = clock(); + sem_wait(sem); + dbg_msg("waited %f ms for semaphore", wait_total); + return 0; +} + +int unlock_at_port(char* filename){ + char semaphore_name[MAX_FILENAME_LEN]; + generate_semaphore_name(filename, semaphore_name); + dbg_msg("semaphore_name: %s", semaphore_name); + sem_t *sem = sem_open(semaphore_name, O_CREAT, 0644, 1); + if (sem == SEM_FAILED) { + perror("sem_open failed"); + return -1; + } + sem_post(sem); + sem_close(sem); + sem_unlink(semaphore_name); + return 0; +} + +#endif + + static int char_to_hex(char c) { // convert char to hex diff --git a/application/tom_modem/src/utils.h b/application/tom_modem/src/utils.h index f71fdff..6a48cab 100644 --- a/application/tom_modem/src/utils.h +++ b/application/tom_modem/src/utils.h @@ -1,5 +1,6 @@ #ifndef _UTILS_H #define _UTILS_H +#define USE_SEMAPHORE 1 #include #include #include @@ -13,6 +14,22 @@ #include "extlib/pdu.h" #include "time.h" +#ifdef USE_SEMAPHORE +#include +#include +#include +#define MAX_FILENAME_LEN 256 +#define SEMAPHORE_PREFIX "tom_modem_lock" +typedef struct FileLock { + char filename[MAX_FILENAME_LEN]; + sem_t semaphore; +} FileLock; + +void generate_semaphore_name(const char* filename, char* semaphore_name); +int lock_at_port(char* filename); +int unlock_at_port(char* filename); +#endif + extern PROFILE_T s_profile; extern FDS_T s_fds;