#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
+#include <sys/socket.h>
+#include <sys/un.h>
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#include <pulsecore/queue.h>
#include <pulsecore/log.h>
#include <pulsecore/core-scache.h>
+#include <pulsecore/creds.h>
#include "pstream.h"
/* packet info */
pa_packet *packet;
-#ifdef SCM_CREDENTIALS
+#ifdef HAVE_CREDS
int with_creds;
+ pa_creds creds;
#endif
};
pa_memblock_stat *memblock_stat;
-#ifdef SCM_CREDENTIALS
- int send_creds_now;
- struct ucred ucred;
- int creds_valid;
+#ifdef HAVE_CREDS
+ pa_creds read_creds, write_creds;
+ int read_creds_valid, send_creds_now;
#endif
};
pa_iochannel_socket_set_rcvbuf(io, 1024*8);
pa_iochannel_socket_set_sndbuf(io, 1024*8);
-#ifdef SCM_CREDENTIALS
+#ifdef HAVE_CREDS
p->send_creds_now = 0;
- p->creds_valid = 0;
+ p->read_creds_valid = 0;
#endif
return p;
}
pa_xfree(p);
}
-void pa_pstream_send_packet(pa_pstream*p, pa_packet *packet, int with_creds) {
+void pa_pstream_send_packet(pa_pstream*p, pa_packet *packet, const pa_creds *creds) {
struct item_info *i;
assert(p && packet && p->ref >= 1);
i = pa_xnew(struct item_info, 1);
i->type = PA_PSTREAM_ITEM_PACKET;
i->packet = pa_packet_ref(packet);
-#ifdef SCM_CREDENTIALS
- i->with_creds = with_creds;
+#ifdef HAVE_CREDS
+ if ((i->with_creds = !!creds))
+ i->creds = *creds;
#endif
pa_queue_push(p->send_queue, i);
i->channel = channel;
i->offset = offset;
i->seek_mode = seek_mode;
-#ifdef SCM_CREDENTIALS
+#ifdef HAVE_CREDS
i->with_creds = 0;
#endif
p->write.descriptor[PA_PSTREAM_DESCRIPTOR_SEEK] = htonl(p->write.current->seek_mode);
}
-#ifdef SCM_CREDENTIALS
- p->send_creds_now = p->write.current->with_creds;
+#ifdef HAVE_CREDS
+ if ((p->send_creds_now = p->write.current->with_creds))
+ p->write_creds = p->write.current->creds;
+
#endif
}
l = ntohl(p->write.descriptor[PA_PSTREAM_DESCRIPTOR_LENGTH]) - (p->write.index - PA_PSTREAM_DESCRIPTOR_SIZE);
}
-#ifdef SCM_CREDENTIALS
+#ifdef HAVE_CREDS
if (p->send_creds_now) {
- if ((r = pa_iochannel_write_with_creds(p->io, d, l)) < 0)
+ if ((r = pa_iochannel_write_with_creds(p->io, d, l, &p->write_creds)) < 0)
return -1;
p->send_creds_now = 0;
l = ntohl(p->read.descriptor[PA_PSTREAM_DESCRIPTOR_LENGTH]) - (p->read.index - PA_PSTREAM_DESCRIPTOR_SIZE);
}
-#ifdef SCM_CREDENTIALS
+#ifdef HAVE_CREDS
{
- int b;
+ int b = 0;
- if ((r = pa_iochannel_read_with_creds(p->io, d, l, &p->ucred, &b)) <= 0)
+ if ((r = pa_iochannel_read_with_creds(p->io, d, l, &p->read_creds, &b)) <= 0)
return -1;
- p->creds_valid = p->creds_valid || b;
+ p->read_creds_valid = p->read_creds_valid || b;
}
#else
if ((r = pa_iochannel_read(p->io, d, l)) <= 0)
assert(p->read.packet);
if (p->recieve_packet_callback)
-#ifdef SCM_CREDENTIALS
- p->recieve_packet_callback(p, p->read.packet, p->creds_valid ? &p->ucred : NULL, p->recieve_packet_callback_userdata);
+#ifdef HAVE_CREDS
+ p->recieve_packet_callback(p, p->read.packet, p->read_creds_valid ? &p->read_creds : NULL, p->recieve_packet_callback_userdata);
#else
p->recieve_packet_callback(p, p->read.packet, NULL, p->recieve_packet_callback_userdata);
#endif
}
p->read.index = 0;
-#ifdef SCM_CREDENTIALS
- p->creds_valid = 0;
+#ifdef HAVE_CREDS
+ p->read_creds_valid = 0;
#endif
}
}