]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix issue where pid file is accidentally truncated
authorAnthony Minessale <anthony.minessale@gmail.com>
Fri, 21 Nov 2008 15:52:22 +0000 (15:52 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Fri, 21 Nov 2008 15:52:22 +0000 (15:52 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10493 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/switch.c

index d6a7e2c40dbd648f5528ecc3680b2ce8c267a766..a3c4c36726012fbe72645fb178e7ff8dec2d7825 100644 (file)
@@ -253,7 +253,8 @@ int main(int argc, char *argv[])
 {
        char pid_path[256] = "";        /* full path to the pid file */
        char pid_buffer[32] = "";       /* pid string */
-       switch_size_t pid_len;
+       char old_pid_buffer[32] = "";   /* pid string */
+       switch_size_t pid_len, old_pid_len;
        const char *err = NULL;         /* error value for return from freeswitch initialization */
 #ifndef WIN32
        int nf = 0;                                     /* TRUE if we are running in nofork mode */
@@ -603,17 +604,34 @@ int main(int argc, char *argv[])
        pid_len = strlen(pid_buffer);
 
        apr_pool_create(&pool, NULL);
+       
+
        if (switch_file_open(&fd,
-               pid_path,
-               SWITCH_FOPEN_WRITE | SWITCH_FOPEN_CREATE | SWITCH_FOPEN_TRUNCATE,
-               SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE,
-               pool) != SWITCH_STATUS_SUCCESS) {
-                       fprintf(stderr, "Cannot open pid file %s.\n", pid_path);
-                       return 255;
+                                                pid_path,
+                                                SWITCH_FOPEN_READ,
+                                                SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE,
+                                                pool) != SWITCH_STATUS_SUCCESS) {
+               fprintf(stderr, "Cannot open pid file %s.\n", pid_path);
+               return 255;
+       }
+
+       old_pid_len = sizeof(old_pid_buffer);
+       switch_file_read(fd, old_pid_buffer, &old_pid_len);
+       switch_file_close(fd);
+       
+       if (switch_file_open(&fd,
+                                                pid_path,
+                                                SWITCH_FOPEN_WRITE | SWITCH_FOPEN_CREATE | SWITCH_FOPEN_TRUNCATE,
+                                                SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE,
+                                                pool) != SWITCH_STATUS_SUCCESS) {
+               fprintf(stderr, "Cannot open pid file %s.\n", pid_path);
+               return 255;
        }
 
        if (switch_file_lock(fd, SWITCH_FLOCK_EXCLUSIVE | SWITCH_FLOCK_NONBLOCK) != SWITCH_STATUS_SUCCESS) {
                fprintf(stderr, "Cannot lock pid file %s.\n", pid_path);
+               old_pid_len = strlen(old_pid_buffer);
+               switch_file_write(fd, old_pid_buffer, &old_pid_len);
                return 255;
        }