summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Hatch <jhatch@multitech.com>2020-04-17 07:54:13 -0500
committerJeff Hatch <jhatch@multitech.com>2020-04-17 07:54:13 -0500
commit203bf8164ae731682b6a524f8c961b6e2de96504 (patch)
tree27dac2df5b3eb57cb80cc5c1cf89a0b3a29142c1
parent8ce0f4a320f56b582e51cca09ebf8fbc8326987d (diff)
parenta2eda5de55c7176a345b3a1e0d5a45b5773455c7 (diff)
downloadsms-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.c12
-rw-r--r--src/utils.c72
-rw-r--r--src/utils.h8
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);