aboutsummaryrefslogtreecommitdiffstats
path: root/mdns-publish-xendom.c
diff options
context:
space:
mode:
authorkraxel <kraxel>2007-02-06 16:07:24 +0000
committerkraxel <kraxel>2007-02-06 16:07:24 +0000
commit32f212ab9d1b4dcf4e2be5abc3776d8192bb93f4 (patch)
tree6b7fcc6e5b3a4af7220c4a3070f76e7ebbd6867f /mdns-publish-xendom.c
parentcbd9777e41ce186c9ef2e060aea5dab9647f1b4e (diff)
downloadxenwatch-32f212ab9d1b4dcf4e2be5abc3776d8192bb93f4.tar.gz
mdns vnc stuff
Diffstat (limited to 'mdns-publish-xendom.c')
-rw-r--r--mdns-publish-xendom.c287
1 files changed, 43 insertions, 244 deletions
diff --git a/mdns-publish-xendom.c b/mdns-publish-xendom.c
index 4401794..339858f 100644
--- a/mdns-publish-xendom.c
+++ b/mdns-publish-xendom.c
@@ -15,29 +15,15 @@
#include <xs.h>
-#include <avahi-client/client.h>
-#include <avahi-client/publish.h>
-
-#include <avahi-common/alternative.h>
-#include <avahi-common/thread-watch.h>
-#include <avahi-common/malloc.h>
-#include <avahi-common/error.h>
+#include "mdns-publish.h"
/* --------------------------------------------------------------------- */
-static AvahiEntryGroup *group = NULL;
-static AvahiThreadedPoll *thread_poll = NULL;
-
static struct xs_handle *xenstore;
static int debug = 0;
-static int have_tty = 1;
-static int have_syslog = 0;
static char *appname = "mdns-publish-xendom";
-static int app_quit = 0;
-static int termsig = 0;
-static char *name;
static char *service = "_xendom._tcp";
static int port = 9;
static char vm_uuid[256];
@@ -45,183 +31,51 @@ static char dom_id[256];
/* --------------------------------------------------------------------- */
-static int __attribute__ ((format (printf, 2, 0)))
-log_printf(int priority, char *fmt, ...)
-{
- va_list args;
- char msgbuf[1024];
- int rc;
-
- va_start(args, fmt);
- rc = vsnprintf(msgbuf, sizeof(msgbuf), fmt, args);
- va_end(args);
-
- if (have_tty)
- fprintf(stderr, "%s: %s", appname, msgbuf);
- if (have_syslog)
- syslog(priority, "%s", msgbuf);
- return rc;
-}
-
-/* --------------------------------------------------------------------- */
-
-static void create_services(AvahiClient *c);
-
-static void entry_group_callback(AvahiEntryGroup *g,
- AvahiEntryGroupState state,
- void *userdata)
-{
- char *n;
-
- switch (state) {
- case AVAHI_ENTRY_GROUP_ESTABLISHED:
- log_printf(LOG_INFO, "service '%s' successfully established\n", name);
- break;
- case AVAHI_ENTRY_GROUP_COLLISION:
- n = avahi_alternative_service_name(name);
- log_printf(LOG_NOTICE, "service name collision, renaming '%s' to '%s'\n",
- name, n);
- avahi_free(name);
- name = n;
- create_services(avahi_entry_group_get_client(g));
- break;
- case AVAHI_ENTRY_GROUP_FAILURE:
- app_quit = 1;
- break;
- default:
- break;
- }
-}
-
-static void create_services(AvahiClient *c)
-{
- int ret;
-
- /* If this is the first time we're called, let's create a new entry group */
- if (!group) {
- if (!(group = avahi_entry_group_new(c, entry_group_callback, NULL))) {
- log_printf(LOG_ERR, "avahi_entry_group_new() failed: %s\n",
- avahi_strerror(avahi_client_errno(c)));
- goto fail;
- }
- }
-
- /* Add the service */
- ret = avahi_entry_group_add_service(group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0,
- name, service, NULL, NULL, port,
- vm_uuid, dom_id, NULL);
- if (ret < 0) {
- log_printf(LOG_ERR, "failed to add '%s' service: %s\n", service, avahi_strerror(ret));
- goto fail;
- }
-
- /* Tell the server to register the service */
- if ((ret = avahi_entry_group_commit(group)) < 0) {
- log_printf(LOG_ERR, "failed to commit entry_group: %s\n", avahi_strerror(ret));
- goto fail;
- }
- return;
-
-fail:
- app_quit = 1;
-}
-
-static void client_callback(AvahiClient *c,
- AvahiClientState state,
- void * userdata)
-{
- int error;
-
- switch (state) {
- case AVAHI_CLIENT_CONNECTING:
- log_printf(LOG_NOTICE, "avahi daemon not running (yet), I'll keep trying ...\n");
- break;
- case AVAHI_CLIENT_S_RUNNING:
- if (!group)
- create_services(c);
- break;
- case AVAHI_CLIENT_S_COLLISION:
- if (group)
- avahi_entry_group_reset(group);
- break;
- case AVAHI_CLIENT_FAILURE:
- switch (avahi_client_errno(c)) {
- case AVAHI_ERR_DISCONNECTED:
- avahi_entry_group_free(group);
- avahi_client_free(c);
- group = NULL;
-
- log_printf(LOG_NOTICE, "disconnected from avahi daemon, reconnecting ...\n");
- c = avahi_client_new(avahi_threaded_poll_get(thread_poll),
- AVAHI_CLIENT_NO_FAIL,
- client_callback, NULL, &error);
- if (!c) {
- log_printf(LOG_ERR, "failed to create client: %s\n",
- avahi_strerror(error));
- goto fail;
- }
- break;
- default:
- log_printf(LOG_ERR, "client failure: %s\n",
- avahi_strerror(avahi_client_errno(c)));
- goto fail;
- break;
- }
- break;
- default:
- break;
- }
- return;
-
- fail:
- app_quit = 1;
-}
-
-/* --------------------------------------------------------------------- */
-
-static int xen_init(void)
+static int xen_init(struct mdns_pub *mdns)
{
struct stat st;
if (-1 == stat("/proc/xen", &st)) {
- log_printf(LOG_ERR, "/proc/xen not found, running on bare metal?\n");
+ mdns_log_printf(mdns, LOG_ERR,
+ "/proc/xen not found, running on bare metal?\n");
return -1;
}
xenstore = xs_domain_open();
if (NULL == xenstore) {
- log_printf(LOG_ERR, "can't connect to xenstore (%s)\n", xs_domain_dev());
+ mdns_log_printf(mdns, LOG_ERR,
+ "can't connect to xenstore (%s)\n", xs_domain_dev());
return -1;
}
return 0;
}
-static int xen_get_info(void)
+static int xen_get_info(struct mdns_pub *mdns)
{
xs_transaction_t xst;
char *xs_value;
if (!(xst = xs_transaction_start(xenstore))) {
- log_printf(LOG_ERR, "can't start xenstore transaction\n");
+ mdns_log_printf(mdns, LOG_ERR, "can't start xenstore transaction\n");
goto out;
}
xs_value = xs_read(xenstore, xst, "vm", NULL);
xs_transaction_end(xenstore, xst, 0);
if (!xs_value) {
- log_printf(LOG_ERR, "can't read 'vm' value from xenstore\n");
+ mdns_log_printf(mdns, LOG_ERR, "can't read 'vm' value from xenstore\n");
goto out;
}
snprintf(vm_uuid, sizeof(vm_uuid), "vm-uuid=%s", xs_value+4);
if (!(xst = xs_transaction_start(xenstore))) {
- log_printf(LOG_ERR, "can't start xenstore transaction\n");
+ mdns_log_printf(mdns, LOG_ERR, "can't start xenstore transaction\n");
goto out;
}
xs_value = xs_read(xenstore, xst, "domid", NULL);
xs_transaction_end(xenstore, xst, 0);
if (!xs_value) {
- log_printf(LOG_ERR, "can't read 'domid' value from xenstore\n");
+ mdns_log_printf(mdns, LOG_ERR, "can't read 'domid' value from xenstore\n");
goto out;
}
snprintf(dom_id, sizeof(dom_id), "dom-id=%s", xs_value);
@@ -232,26 +86,26 @@ static int xen_get_info(void)
return -1;
}
-static int xen_watch_add(char *path)
+static int xen_watch_add(struct mdns_pub *mdns, char *path)
{
int ret = 0;
/* Hmm, not working ... */
if (!xs_watch(xenstore, path, "token")) {
- log_printf(LOG_ERR, "%s: xs_watch for \"%s\" failed\n",
- __FUNCTION__, path);
+ mdns_log_printf(mdns, LOG_ERR, "%s: xs_watch for \"%s\" failed\n",
+ __FUNCTION__, path);
ret = -1;
}
return ret;
}
-static int xen_watch_data(void)
+static int xen_watch_data(struct mdns_pub *mdns)
{
char **vec = NULL;
unsigned int count;
vec = xs_read_watch(xenstore, &count);
- log_printf(LOG_DEBUG, "%s: \"%s\"\n", __FUNCTION__, vec[XS_WATCH_PATH]);
+ mdns_log_printf(mdns, LOG_DEBUG, "%s: \"%s\"\n", __FUNCTION__, vec[XS_WATCH_PATH]);
if (vec)
free(vec);
@@ -294,19 +148,12 @@ static int wait_fd(int fd, int secs)
return rc;
}
-static void catchsig(int signal)
-{
- termsig = signal;
- app_quit = 1;
-}
-
int main(int argc, char*argv[])
{
- struct sigaction act,old;
- AvahiClient *client = NULL;
+ struct mdns_pub *mdns = NULL;
char buf[128];
struct utsname uts;
- int error,c;
+ int c;
int ret = 1;
/* parse options */
@@ -326,108 +173,60 @@ int main(int argc, char*argv[])
}
}
- /* open syslog */
- openlog(appname, 0, LOG_LOCAL0);
- have_syslog = 1;
-
/* figure name */
uname(&uts);
snprintf(buf, sizeof(buf), "Xen domain %s", uts.nodename);
- name = avahi_strdup(buf);
+ mdns_pub_appname = appname;
+ if (!debug)
+ mdns_daemonize();
/* figure domain info */
- if (0 != xen_init())
+ if (0 != xen_init(mdns))
goto fail;
- xen_get_info();
-
- /* prepare nDNS bits */
- thread_poll = avahi_threaded_poll_new();
- if (!thread_poll) {
- log_printf(LOG_ERR, "failed to create simple poll object\n");
- goto fail;
- }
-
- client = avahi_client_new(avahi_threaded_poll_get(thread_poll),
- AVAHI_CLIENT_NO_FAIL,
- client_callback, NULL, &error);
- if (!client) {
- log_printf(LOG_ERR, "failed to create client: %s\n", avahi_strerror(error));
- goto fail;
- }
+ xen_get_info(mdns);
- /* setup signal handler */
- memset(&act,0,sizeof(act));
- sigemptyset(&act.sa_mask);
- act.sa_handler = SIG_IGN;
- sigaction(SIGPIPE,&act,&old);
- act.sa_handler = catchsig;
- sigaction(SIGHUP,&act,&old);
- sigaction(SIGUSR1,&act,&old);
- sigaction(SIGTERM,&act,&old);
- if (debug)
- sigaction(SIGINT,&act,&old);
-
- /* damonize */
- if (!debug) {
- switch (fork()) {
- case -1:
- log_printf(LOG_ERR, "fork: %s", strerror(errno));
- goto fail;
- case 0:
- /* child */
- close(0); close(1); close(2);
- setsid();
- open("/dev/null", O_RDWR); dup(0); dup(0);
- have_tty = 0;
- break;
- default:
- /* parent */
- exit(0);
- }
- }
+ mdns = mdns_pub_init(debug);
+ if (NULL == mdns)
+ goto fail;
+ mdns_pub_add(mdns, buf, service, port);
+ mdns_sigsetup(mdns);
/* enter main loop */
ret = 0;
- avahi_threaded_poll_start(thread_poll);
+ mdns_pub_start(mdns);
if (0) {
/* hmm, not working */
- if (0 != xen_watch_add("memory/target"))
+ if (0 != xen_watch_add(mdns, "memory/target"))
goto fail;
- xen_watch_add("vm");
- xen_watch_add("domid");
+ xen_watch_add(mdns, "vm");
+ xen_watch_add(mdns, "domid");
}
for (;;) {
- if (app_quit)
+ if (mdns_pub_appquit)
break;
switch (wait_fd(xs_fileno(xenstore),1)) {
case -1:
- log_printf(LOG_ERR, "select: %s\n", strerror(errno));
- app_quit = 1;
+ mdns_log_printf(mdns, LOG_ERR, "select: %s\n", strerror(errno));
+ mdns_pub_appquit = 1;
case 0:
/* timeout */
break;
default:
/* data to read */
- xen_watch_data();
+ xen_watch_data(mdns);
}
}
- avahi_threaded_poll_stop(thread_poll);
-
-fail:
- log_printf(ret ? LOG_ERR : LOG_INFO, "exiting (%d)%s%s\n", ret,
- termsig ? ", on signal " : "",
- termsig ? strsignal(termsig) : "");
-
- /* Cleanup things */
- if (client)
- avahi_client_free(client);
+ mdns_pub_del_all(mdns);
+ mdns_pub_stop(mdns);
- if (thread_poll)
- avahi_threaded_poll_free(thread_poll);
+fail:
+ mdns_log_printf(mdns, ret ? LOG_ERR : LOG_INFO, "exiting (%d)%s%s\n", ret,
+ mdns_pub_termsig ? ", on signal " : "",
+ mdns_pub_termsig ? strsignal(mdns_pub_termsig) : "");
- avahi_free(name);
+ mdns_pub_fini(mdns);
return ret;
}