]> code.delx.au - pulseaudio/blobdiff - polyp/authkey.c
Make the whole stuff LGPL only
[pulseaudio] / polyp / authkey.c
index 09a2c1b402d7e0d59706e790e87b0f71a51018f2..05324a61e72b9a19895d752140d68b0d55fad110 100644 (file)
@@ -4,17 +4,17 @@
   This file is part of polypaudio.
  
   polypaudio is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published
-  by the Free Software Foundation; either version 2 of the License,
-  or (at your option) any later version.
+  it under the terms of the GNU Lesser General Public License as
+  published by the Free Software Foundation; either version 2.1 of the
+  License, or (at your option) any later version.
  
   polypaudio is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  General Public License for more details.
+  Lesser General Public License for more details.
  
-  You should have received a copy of the GNU General Public License
-  along with polypaudio; if not, write to the Free Software
+  You should have received a copy of the GNU Lesser General Public
+  License along with polypaudio; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
   USA.
 ***/
@@ -68,7 +68,7 @@ static int generate(int fd, void *data, size_t length) {
     lseek(fd, 0, SEEK_SET);
 
     if ((r = pa_loop_write(fd, data, length)) < 0 || (size_t) r != length) {
-        pa_log(__FILE__": failed to write cookie file\n");
+        pa_log(__FILE__": failed to write cookie file: %s\n", strerror(errno));
         goto finish;
     }
 
@@ -85,13 +85,13 @@ finish:
 static int load(const char *fn, void *data, size_t length) {
     int fd = -1;
     int writable = 1;
-    assert(fn && data && length);
     int unlock = 0, ret;
     ssize_t r;
+    assert(fn && data && length);
 
     if ((fd = open(fn, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR)) < 0) {
         if (errno != EACCES || (fd = open(fn, O_RDONLY)) < 0) {
-            pa_log(__FILE__": failed to open cookie file '%s'\n", fn);
+            pa_log(__FILE__": failed to open cookie file '%s': %s\n", fn, strerror(errno));
             goto finish;
         } else
             writable = 0;
@@ -100,7 +100,7 @@ static int load(const char *fn, void *data, size_t length) {
     unlock = pa_lock_fd(fd, 1) >= 0;
 
     if ((r = pa_loop_read(fd, data, length)) < 0) {
-        pa_log(__FILE__": failed to read cookie file '%s'\n", fn);
+        pa_log(__FILE__": failed to read cookie file '%s': %s\n", fn, strerror(errno));
         goto finish;
     }
 
@@ -144,21 +144,28 @@ int pa_authkey_load(const char *path, void *data, size_t length) {
     return ret;
 }
 
+static const char *normalize_path(const char *fn, char *s, size_t l) {
+    assert(fn && s && l > 0);
+
+    if (fn[0] != '/') {
+        char homedir[PATH_MAX];
+        if (!pa_get_home_dir(homedir, sizeof(homedir)))
+            return NULL;
+        
+        snprintf(s, l, "%s/%s", homedir, fn);
+        return s;
+    }
+
+    return fn;
+}
+
 int pa_authkey_load_from_home(const char *fn, void *data, size_t length) {
-    char *home;
     char path[PATH_MAX];
     const char *p;
-
     assert(fn && data && length);
 
-    if (fn[0] != '/') {
-        if (!(home = getenv("HOME")))
-            return -2;
-        
-        snprintf(path, sizeof(path), "%s/%s", home, fn);
-        p = path;
-    } else
-        p = fn;
+    if (!(p = normalize_path(fn, path, sizeof(path))))
+        return -2;
         
     return pa_authkey_load(p, data, length);
 }
@@ -171,3 +178,41 @@ int pa_authkey_load_auto(const char *fn, void *data, size_t length) {
     else
         return pa_authkey_load_from_home(fn, data, length);
 }
+
+int pa_authkey_save(const char *fn, const void *data, size_t length) {
+    int fd = -1;
+    int unlock = 0, ret = -1;
+    ssize_t r;
+    char path[PATH_MAX];
+    const char *p;
+    assert(fn && data && length);
+
+    if (!(p = normalize_path(fn, path, sizeof(path))))
+        return -2;
+
+    if ((fd = open(p, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR)) < 0) {
+        pa_log(__FILE__": failed to open cookie file '%s': %s\n", fn, strerror(errno));
+        goto finish;
+    }
+
+    unlock = pa_lock_fd(fd, 1) >= 0;
+
+    if ((r = pa_loop_write(fd, data, length)) < 0 || (size_t) r != length) {
+        pa_log(__FILE__": failed to read cookie file '%s': %s\n", fn, strerror(errno));
+        goto finish;
+    }
+
+    ret = 0;
+    
+finish:
+
+    if (fd >= 0) {
+        
+        if (unlock)
+            pa_lock_fd(fd, 0);
+        
+        close(fd);
+    }
+
+    return ret;
+}