Skip to contentSkip to conversation

- add lockfile support to a2dpd

PATCH New Matthew Garrett 1 participant 1 message Aug 19, 2006 Bluetooth drivers

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 - add lockfile support to a2dpd

It currently doesn't seem possible to run multiple a2dpds simultaneously, but the failure mode isn't especially nice. This patch adds lockfile support, so a2dpd will exit on startup if another is alread running. There's also a -k option which will kill the first a2dpd and allow the second to take over.

? .deps
? .libs
? Makefile
? Makefile.in
? a2dp_ipc.lo
? a2dp_timer.lo
? a2dpd
? core.31404
? core.31840
? core.32296
? ctl_a2dpd.lo
? ctl_sco.lo
? libasound_module_ctl_a2dpd.la
? libasound_module_ctl_sco.la
? libasound_module_pcm_a2dp.la
? libasound_module_pcm_a2dpd.la
? libasound_module_pcm_sco.la
? pcm_a2dp.lo
? pcm_a2dpd.lo
? pcm_sco.lo
Index: a2dpd.c
===================================================================
RCS file: /cvsroot/bluetooth-alsa/btsco/alsa-plugins/a2dpd.c,v retrieving revision 1.4

a2dpd.c +67 -2
diff -u -r1.4 a2dpd.c
@@ -45,6 +45,7 @@
 #define MAXCLIENTSPERDEVICE    8
 #define MAXCLIENTSRINGSIZE     64
 #define POOLENTRYSIZE          A2DPD_BLOCK_SIZE
+#define PIDFILE                "/var/run/a2dp.pid"
 
 #define A2DPD_CONFIG_FILE       ".a2dpdrc"
 
@@ -86,7 +87,7 @@
                         case -1:
                                 exit(-1);
                         case 0:
-                                break;
+				break;
                         default:
                                 exit(0);
                 }
@@ -117,6 +118,17 @@
         printf("a2dpd [%s %s] starting ...", __DATE__, __TIME__);
 }
 
+static int lock_fd(int fd)
+{
+	struct flock lock;
+	lock.l_type = F_WRLCK;
+	lock.l_whence = SEEK_SET;
+	lock.l_start = 0;
+	lock.l_len = 0;
+
+	return fcntl(fd, F_SETLK, &lock);
+}
+
 //////////////////////////////////////////
 //////////////////////////////////////////
 // AVRCP CODE BEGIN //////////////////////
@@ -131,6 +143,7 @@
         header->packet_type = PACKET_TYPE_SINGLE;
 }
 
+
 // This function handle the bluetooth connection
 int a2dp_handle_avrcp_message(int sockfd)
 {
@@ -953,6 +966,7 @@
 int main(int argc, char *argv[])
 {
         int i = 0;
+	int fd;
         struct timespec timer_resolution = { 0, 0 };
         char address[256] = "";
         char* addr = &address[0];
@@ -960,7 +974,9 @@
         //char* iphono420= "C2:00:08:F4:30:07:64";
         //char* hpheadphone= "00:0D:44:2A:17:C7";
         struct sched_param schedparam = { sched_get_priority_max(SCHED_FIFO) };
-        int res=0,  bFork=0, bVerbose=1;
+        int res=0,  bFork=0, bVerbose=1, bKill=0;
+	FILE *fp;
+	pid_t pid;
 
         // Read config values from config file
         get_config_filename(g_srcfilename, sizeof(g_srcfilename));
@@ -993,6 +1009,10 @@
                 {
                         bVerbose=1;
                 }
+		else if(!strcmp(argv[i], "-k"))
+		{
+			bKill=1;
+		}
                 else if(!strcmp(argv[i], "+n"))
                 {
                         bFork=1;
@@ -1017,6 +1037,50 @@
         // Redirect outputs
         make_daemon_process(bFork, bVerbose, g_sOutputFilename);
 
+	// Generate the lockfile
+	fd = open(PIDFILE, O_RDWR | O_CREAT | O_EXCL, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
+
+	if (fd == -1) {
+		if (errno != EEXIST) // If we can't write the lock, then ignore
+			goto post_lock;
+		
+		if ((fd = open(PIDFILE, O_RDWR)) < 0)
+			goto post_lock;
+		
+		fp = fdopen(fd, "rw");
+		if (fp == NULL)
+			goto post_lock;
+
+		pid = -1;
+		if ((fscanf(fp, "%d", &pid) != 1) || (pid == getpid())
+		    || (lock_fd(fileno(fp)) == 0)) {
+			unlink (PIDFILE);
+		} else {
+			if (bKill) {
+				kill (pid, 15);
+				sleep (5); // let the other daemon die
+			} else
+				goto shutdown;
+		}
+		fclose(fp);
+
+		unlink(PIDFILE);
+		fd = open(PIDFILE, O_RDWR | O_CREAT | O_EXCL,
+			  S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
+
+		if (fd == -1)
+			goto post_lock;
+		
+	}
+	
+	lock_fd(fd);
+
+	fp = fdopen(fd, "w");
+	fprintf(fp, "%d\n", getpid());
+	fflush(fp);
+	fcntl(fd, F_SETFD, (long) 1);
+
+ post_lock:
         printf("%s addr=%s timer=%d us [%s %s]\n", argv[0], addr, (int)(timer_resolution.tv_nsec/1000), __DATE__, __TIME__);
 
         // If we can be realtime it will be better
@@ -1036,6 +1100,7 @@
         // global free
         a2dp_exit();
 
+shutdown:
         printf("A2DPD terminated succesfully\n");
 
         return 0;
Signature · 11 lines
Matthew Garrett | [email protected]

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Bluez-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bluez-devel