diff options
author | Jeff Hatch <jhatch@multitech.com> | 2020-04-17 07:54:13 -0500 |
---|---|---|
committer | Jeff Hatch <jhatch@multitech.com> | 2020-04-17 07:54:13 -0500 |
commit | 203bf8164ae731682b6a524f8c961b6e2de96504 (patch) | |
tree | 27dac2df5b3eb57cb80cc5c1cf89a0b3a29142c1 | |
parent | 8ce0f4a320f56b582e51cca09ebf8fbc8326987d (diff) | |
parent | a2eda5de55c7176a345b3a1e0d5a45b5773455c7 (diff) | |
download | sms-utils-203bf8164ae731682b6a524f8c961b6e2de96504.tar.gz sms-utils-203bf8164ae731682b6a524f8c961b6e2de96504.tar.bz2 sms-utils-203bf8164ae731682b6a524f8c961b6e2de96504.zip |
Merge branch 'MTX-3262-single-instance-guard-revert' into 'master'
Revert "MTX-3262 mpower lockfile rewrite for libmts-io compatibility"
See merge request !5
-rw-r--r-- | src/atcmd.c | 12 | ||||
-rw-r--r-- | src/utils.c | 72 | ||||
-rw-r--r-- | src/utils.h | 8 |
3 files changed, 42 insertions, 50 deletions
diff --git a/src/atcmd.c b/src/atcmd.c index eab4210..97fd34b 100644 --- a/src/atcmd.c +++ b/src/atcmd.c @@ -1471,7 +1471,7 @@ static int sms_atcmd_init(int fd) return 0; } -static struct Lock *lock_file; +static char *lock_path; int sms_device_close(int fd) { @@ -1479,7 +1479,11 @@ int sms_device_close(int fd) ret = tty_close(fd); - lock_file = device_unlock(lock_file); + if (lock_path) { + unlink(lock_path); + free(lock_path); + lock_path = NULL; + } return ret; } @@ -1494,8 +1498,8 @@ int sms_device_open(void) return -1; } - lock_file = device_lock(Global.core.device); - if (!lock_file) { + lock_path = device_lock(Global.core.device); + if (!lock_path) { sms_device_close(fd); return -1; } diff --git a/src/utils.c b/src/utils.c index e7d6b69..b93634c 100644 --- a/src/utils.c +++ b/src/utils.c @@ -33,7 +33,6 @@ #include <fcntl.h> #include <string.h> #include <linux/limits.h> -#include <sys/file.h> #include "utils.h" #include "log.h" @@ -249,49 +248,44 @@ char *shell_path_expand(const char *path) #define MAX_TRY 10 -struct Lock *device_lock(const char *path) +char *device_lock(const char *path) { - struct Lock *result = (struct Lock*)calloc(1, sizeof(struct Lock)); - if (result == NULL) { + int tmp; + char *name = basename(path); + int fd; + char str[32]; + char *lock; + unsigned char num_try=0; + + tmp = asprintf(&lock, "/var/lock/LCK..%s", name); + if (tmp < 0) { log_error("out of memory"); return NULL; } - if (asprintf(&result->path, "/var/lock/LCK..%s", basename(path)) < 0) { - log_error("out of memory"); - return NULL; - } - - result->fd = open(result->path, O_CREAT | O_RDWR, 0644); - if (result->fd >= 0) { - unsigned char num_try = 0; - while (1) { - int lockErr = flock(result->fd, LOCK_EX | LOCK_NB); - if (lockErr == 0) { - return result; - } else if (errno != EWOULDBLOCK) { - break; - } - if (num_try++>=MAX_TRY) { - //something locks device too long - break; - } - usleep(100000ul);//100ms - } - log_error("failed to create %s: %m", result->path); - device_unlock(result); - } - return NULL; -} - -struct Lock *device_unlock(struct Lock *lock) -{ - if (lock) { - close(lock->fd); - free(lock->path); - free(lock); - } - return NULL; + do{ + fd = open(lock, O_CREAT | O_WRONLY | O_TRUNC | O_EXCL, 0644); + if (fd > 0) { + break; + }else{ + log_error("%i number of trying to create %s: %m",num_try+1,lock); + }; + if(num_try++>=MAX_TRY){ + //something locks device too long + log_error("failed to create %s: %m", lock); + free(lock); + return NULL; + } + usleep(100000ul);//100ms + }while(1); + + snprintf(str, sizeof(str), "%10d\n", getpid()); + + full_write(fd, str, strlen(str)); + + close(fd); + + return lock; } int indexOfChar(const char *array, int len, char character) diff --git a/src/utils.h b/src/utils.h index eb9d5bc..04a71b6 100644 --- a/src/utils.h +++ b/src/utils.h @@ -30,18 +30,12 @@ enum { USER_YESNO_YES = 1, }; -struct Lock { - char *path; - int fd; -}; - int user_yesno(int def, const char *fmt, ...); int systemf(const char *fmt, ...); FILE *popenf(const char *mode, const char *fmt, ...); char *shell_path_expand(const char *path); -struct Lock *device_lock(const char *path); -struct Lock *device_unlock(struct Lock *lock); +char *device_lock(const char *path); int indexOfChar(const char *array, int len, char character); |