diff options
| -rw-r--r-- | usbmuxd/main.c | 38 | 
1 files changed, 37 insertions, 1 deletions
| diff --git a/usbmuxd/main.c b/usbmuxd/main.c index ea332a4..88c31da 100644 --- a/usbmuxd/main.c +++ b/usbmuxd/main.c @@ -33,6 +33,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  #include <sys/socket.h>  #include <sys/un.h>  #include <sys/stat.h> +#include <sys/fcntl.h>  #include <getopt.h>  #include <pwd.h> @@ -42,6 +43,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  #include "client.h"  static const char *socket_path = "/var/run/usbmuxd"; +static const char *lockfile = "/var/run/usbmuxd.lock"; +  int should_exit;  struct sigaction sa_old; @@ -268,7 +271,9 @@ static void parse_opts(int argc, char **argv)  int main(int argc, char *argv[])  {  	int listenfd; -	int res; +	int res = 0; +	FILE *lfd = NULL; +	struct flock lock;  	parse_opts(argc, argv); @@ -289,6 +294,22 @@ int main(int argc, char *argv[])  	set_signal_handlers(); +	lfd = fopen(lockfile, "r"); +	if (lfd) { +		lock.l_type = 0; +		lock.l_whence = SEEK_SET; +		lock.l_start = 0; +		lock.l_len = 0; +		fcntl(fileno(lfd), F_GETLK, &lock); +		fclose(lfd); +		if (lock.l_type != F_UNLCK) { +			usbmuxd_log(LL_NOTICE, +				   "another instance is already running (pid %d). exiting.", lock.l_pid); +			res = -1; +			goto terminate; +		} +	} +  	usbmuxd_log(LL_INFO, "Creating socket");  	listenfd = create_socket();  	if(listenfd < 0) @@ -312,6 +333,20 @@ int main(int argc, char *argv[])  		}  	} +	// now open the lockfile and place the lock +	lfd = fopen(lockfile, "w"); +	if (lfd) { +		lock.l_type = F_WRLCK; +		lock.l_whence = SEEK_SET; +		lock.l_start = 0; +		lock.l_len = 0; +		if (fcntl(fileno(lfd), F_SETLK, &lock) == -1) { +			usbmuxd_log(LL_ERROR, "ERROR: lockfile locking failed!"); +			log_disable_syslog(); +			exit(EXIT_FAILURE); +		} +	} +  	// drop elevated privileges  	if (drop_privileges && (getuid() == 0 || geteuid() == 0)) {  		struct passwd *pw = getpwnam("nobody"); @@ -342,6 +377,7 @@ int main(int argc, char *argv[])  	usb_shutdown();  	device_shutdown();  	client_shutdown(); +terminate:  	usbmuxd_log(LL_NOTICE, "Shutdown complete");  	log_disable_syslog(); | 
