Index: include/libroar/authfile.h
===================================================================
--- include/libroar/authfile.h	(revision 4483)
+++ include/libroar/authfile.h	(revision 4484)
@@ -39,4 +39,40 @@
 #include "libroar.h"
 
+#define ROAR_AUTHFILE_TYPE_AUTO       -1 /* auto detect type of key */
+#define ROAR_AUTHFILE_TYPE_NONE        0 /* dummy */
+#define ROAR_AUTHFILE_TYPE_ROAR        1 /* RoarAudio */
+#define ROAR_AUTHFILE_TYPE_ESD         2 /* EsounD, plain cookie, len=16 byte */
+#define ROAR_AUTHFILE_TYPE_PULSE       3 /* PulseAudio, plain cookie, len=256 byte */
+
+#define ROAR_AUTHFILE_VERSION_AUTO    -1
+
+struct roar_authfile;
+
+struct roar_authfile * roar_authfile_open(int type, const char * filename, int rw, int version);
+int roar_authfile_close(struct roar_authfile * authfile);
+
+int roar_authfile_lock(struct roar_authfile * authfile);
+int roar_authfile_unlock(struct roar_authfile * authfile);
+
+int roar_authfile_sync(struct roar_authfile * authfile);
+
+struct roar_authfile_key {
+ size_t refc;
+ int type;
+ int index;
+ const char * address;
+ void * data;
+ size_t len;
+};
+
+struct roar_authfile_key * roar_authfile_key_new(int type, size_t len, const char * addr);
+#define roar_authfile_key_free(key) roar_authfile_key_unref(key)
+int roar_authfile_key_ref(struct roar_authfile_key * key);
+int roar_authfile_key_unref(struct roar_authfile_key * key);
+
+int roar_authfile_add_key(struct roar_authfile * authfile, struct roar_authfile_key * key);
+
+struct roar_authfile_key * roar_authfile_lookup_key(struct roar_authfile * authfile, int type, int minindex, const char * address);
+
 #endif
 
Index: libroar/authfile.c
===================================================================
--- libroar/authfile.c	(revision 4483)
+++ libroar/authfile.c	(revision 4484)
@@ -36,3 +36,191 @@
 #include "libroar.h"
 
+struct roar_authfile {
+ size_t refc;
+ size_t lockc;
+ int type;
+ int rw;
+ int version;
+ size_t magiclen;
+ struct roar_vio_calls vio;
+};
+
+struct roar_authfile * roar_authfile_open(int type, const char * filename, int rw, int version) {
+ struct roar_vio_defaults def;
+ struct roar_authfile * ret;
+ size_t magiclen = 0;
+
+ switch (type) {
+  case ROAR_AUTHFILE_TYPE_ESD:
+  case ROAR_AUTHFILE_TYPE_PULSE:
+   break;
+  default:
+    return NULL;
+   break;
+ }
+
+ if ( roar_vio_dstr_init_defaults(&def, ROAR_VIO_DEF_TYPE_NONE, rw ? O_RDWR|O_CREAT : O_RDONLY, 0600) == -1 )
+  return NULL;
+
+ if ( (ret = roar_mm_malloc(sizeof(struct roar_authfile))) == NULL )
+  return NULL;
+
+ memset(ret, 0, sizeof(struct roar_authfile));
+
+ ret->refc     = 1;
+ ret->lockc    = 0;
+ ret->type     = type;
+ ret->rw       = rw;
+ ret->version  = version;
+ ret->magiclen = magiclen;
+
+ filename = roar_mm_strdup(filename);
+
+ if ( roar_vio_open_dstr(&(ret->vio), (char*)filename, &def, 1) == -1 ) {
+  roar_mm_free((void*)filename);
+  roar_mm_free(ret);
+  return NULL;
+ }
+
+ roar_mm_free((void*)filename);
+
+ return ret;
+}
+
+int roar_authfile_close(struct roar_authfile * authfile) {
+ if ( authfile == NULL )
+  return -1;
+
+ roar_vio_close(&(authfile->vio));
+
+ roar_mm_free(authfile);
+
+ return 0;
+}
+
+int roar_authfile_lock(struct roar_authfile * authfile) {
+ if ( authfile == NULL )
+  return -1;
+
+ // TODO: implement real locking here.
+ return 0;
+}
+
+int roar_authfile_unlock(struct roar_authfile * authfile) {
+ if ( authfile == NULL )
+  return -1;
+
+ // TODO: implement real unlocking here.
+ return 0;
+}
+
+int roar_authfile_sync(struct roar_authfile * authfile) {
+ if ( authfile == NULL )
+  return -1;
+
+ return roar_vio_sync(&(authfile->vio));
+}
+
+
+struct roar_authfile_key * roar_authfile_key_new(int type, size_t len, const char * addr) {
+ struct roar_authfile_key * ret;
+ size_t addrlen;
+ size_t retlen;
+
+ if ( addr == NULL ) {
+  addrlen = 0;
+ } else {
+  addrlen = strlen(addr) + 1;
+ }
+
+ retlen = sizeof(struct roar_authfile_key) + len + addrlen;
+
+ if ( (ret = roar_mm_malloc(retlen)) == NULL )
+  return NULL;
+
+ memset(ret, 0, retlen);
+
+ ret->refc  = 1;
+ ret->type  = type;
+ ret->index = -1;
+
+ if ( addrlen == 0 ) {
+  ret->address = NULL;
+ } else {
+  ret->address = (const void *)ret+sizeof(struct roar_authfile_key);
+  memcpy((void*)ret->address, addr, addrlen);
+ }
+
+ ret->data = (void*)ret->address + addrlen;
+
+ ret->len  = len;
+
+ return ret;
+}
+
+int roar_authfile_key_ref(struct roar_authfile_key * key) {
+ if ( key == NULL )
+  return -1;
+
+ key->refc++;
+
+ return 0;
+}
+
+int roar_authfile_key_unref(struct roar_authfile_key * key) {
+ if ( key == NULL )
+  return -1;
+
+ if ( key->refc == 0 ) {
+  ROAR_ERR("roar_authfile_key_unref(key=%p): Key has reference count of zero. This is bad. assuming refc=1", key);
+  key->refc = 1;
+ }
+
+ key->refc--;
+
+ if ( key->refc > 0 )
+  return 0;
+
+ roar_mm_free(key);
+
+ return 0;
+}
+
+int roar_authfile_add_key(struct roar_authfile * authfile, struct roar_authfile_key * key);
+
+struct roar_authfile_key * roar_authfile_lookup_key(struct roar_authfile * authfile,
+                                                    int type, int minindex, const char * address) {
+ struct roar_authfile_key * ret = NULL;
+ ssize_t len;
+
+ if ( authfile == NULL )
+  return NULL;
+
+ switch (authfile->type) {
+  case ROAR_AUTHFILE_TYPE_ESD:
+  case ROAR_AUTHFILE_TYPE_PULSE:
+    if ( type != ROAR_AUTH_T_COOKIE || minindex > 0 )
+     return NULL;
+
+    if ( (ret = roar_authfile_key_new(type, 256, NULL)) == NULL )
+     return NULL;
+
+    len = roar_vio_read(&(authfile->vio), ret->data, ret->len);
+
+    if ( len == -1 ) {
+     roar_authfile_key_unref(ret);
+     return NULL;
+    }
+
+    ret->len   = len;
+    ret->index = 0;
+   break;
+  default:
+    return NULL;
+   break;
+ }
+
+ return ret;
+}
+
 //ll
