Move mDNS services registration out of main()

This commit is contained in:
Julien BLACHE 2009-06-05 17:14:49 +02:00
parent f3c0145346
commit 0ff33f12d6

View File

@ -36,6 +36,7 @@
#include <limits.h> #include <limits.h>
#include <pwd.h> #include <pwd.h>
#include <grp.h> #include <grp.h>
#include <stdint.h>
#include <sys/signalfd.h> #include <sys/signalfd.h>
@ -200,6 +201,78 @@ daemonize(int background, char *pidfile)
return 0; return 0;
} }
static int
register_services(char *ffid, int no_rsp, int no_daap)
{
cfg_t *lib;
char *servername;
char *password;
char *txtrecord[10];
char records[9][128];
int port;
uint32_t hash;
int i;
int ret;
srand((unsigned int)time(NULL));
lib = cfg_getnsec(cfg, "library", 0);
servername = cfg_getstr(lib, "name");
hash = djb_hash(servername, strlen(servername));
for (i = 0; i < (sizeof(records) / sizeof(records[0])); i++)
{
memset(records[i], 0, 128);
txtrecord[i] = records[i];
}
txtrecord[9] = NULL;
snprintf(txtrecord[0], 128, "txtvers=1");
snprintf(txtrecord[1], 128, "Database ID=%0X", hash);
snprintf(txtrecord[2], 128, "Machine ID=%0X", hash);
snprintf(txtrecord[3], 128, "Machine Name=%s", servername);
snprintf(txtrecord[4], 128, "mtd-version=%s", VERSION);
snprintf(txtrecord[5], 128, "iTSh Version=131073"); /* iTunes 6.0.4 */
snprintf(txtrecord[6], 128, "Version=196610"); /* iTunes 6.0.4 */
password = cfg_getstr(lib, "password");
snprintf(txtrecord[7], 128, "Password=%s", (password) ? "true" : "false");
if (ffid)
snprintf(txtrecord[8], 128, "ffid=%s", ffid);
else
snprintf(txtrecord[8], 128, "ffid=%08x", rand());
DPRINTF(E_INFO, L_MAIN, "Registering rendezvous names\n");
port = cfg_getint(lib, "port");
/* Register web server service */
ret = mdns_register(servername, "_http._tcp", port, txtrecord);
if (ret < 0)
return ret;
/* Register RSP service */
if (!no_rsp)
{
ret = mdns_register(servername, "_rsp._tcp", port, txtrecord);
if (ret < 0)
return ret;
}
/* Register DAAP service */
if (!no_daap)
{
ret = mdns_register(servername, "_daap._tcp", port, txtrecord);
if (ret < 0)
return ret;
}
return 0;
}
static void static void
signal_cb(int fd, short event, void *arg) signal_cb(int fd, short event, void *arg)
@ -260,19 +333,13 @@ main(int argc, char **argv)
int loglevel; int loglevel;
char *logdomains; char *logdomains;
char *logfile; char *logfile;
cfg_t *lib;
char *tmp;
int port;
char *servername;
char *ffid; char *ffid;
char *perr; char *perr;
char *txtrecord[10];
char *pidfile; char *pidfile;
sigset_t sigs; sigset_t sigs;
int sigfd; int sigfd;
struct event sig_event; struct event sig_event;
int ret; int ret;
int i;
struct option option_map[] = struct option option_map[] =
{ {
@ -317,11 +384,11 @@ main(int argc, char **argv)
break; break;
case 'd': case 'd':
ret = safe_atoi(optarg, &i); ret = safe_atoi(optarg, &option);
if (ret < 0) if (ret < 0)
fprintf(stderr, "Error: loglevel must be an integer in '-d %s'\n", optarg); fprintf(stderr, "Error: loglevel must be an integer in '-d %s'\n", optarg);
else else
loglevel = i; loglevel = option;
break; break;
case 'D': case 'D':
@ -484,65 +551,18 @@ main(int argc, char **argv)
} }
/* Register mDNS services */ /* Register mDNS services */
lib = cfg_getnsec(cfg, "library", 0); ret = register_services(ffid, mdns_no_rsp, mdns_no_daap);
if (ret < 0)
servername = cfg_getstr(lib, "name");
for (i = 0; i < (sizeof(txtrecord) / sizeof(*txtrecord) - 1); i++)
{ {
txtrecord[i] = (char *)malloc(128); httpd_deinit();
if (!txtrecord[i]) filescanner_deinit();
{ mdns_deinit();
DPRINTF(E_FATAL, L_MAIN, "Out of memory for TXT record\n"); db_deinit();
conffile_unload();
httpd_deinit(); logger_deinit();
filescanner_deinit(); exit(EXIT_FAILURE);
mdns_deinit();
db_deinit();
conffile_unload();
logger_deinit();
exit(EXIT_FAILURE);
}
memset(txtrecord[i], 0, 128);
} }
snprintf(txtrecord[0], 128, "txtvers=1");
snprintf(txtrecord[1], 128, "Database ID=%0X", djb_hash(servername, strlen(servername)));
snprintf(txtrecord[2], 128, "Machine ID=%0X", djb_hash(servername, strlen(servername)));
snprintf(txtrecord[3], 128, "Machine Name=%s", servername);
snprintf(txtrecord[4], 128, "mtd-version=%s", VERSION);
snprintf(txtrecord[5], 128, "iTSh Version=131073"); /* iTunes 6.0.4 */
snprintf(txtrecord[6], 128, "Version=196610"); /* iTunes 6.0.4 */
tmp = cfg_getstr(lib, "password");
snprintf(txtrecord[7], 128, "Password=%s", (tmp) ? "true" : "false");
srand((unsigned int)time(NULL));
if (ffid)
snprintf(txtrecord[8], 128, "ffid=%s", ffid);
else
snprintf(txtrecord[8], 128, "ffid=%08x", rand());
txtrecord[9] = NULL;
DPRINTF(E_LOG,L_MAIN,"Registering rendezvous names\n");
port = cfg_getint(lib, "port");
/* Register web server service */
mdns_register(servername, "_http._tcp", port, txtrecord);
/* Register RSP service */
if (!mdns_no_rsp)
mdns_register(servername, "_rsp._tcp", port, txtrecord);
/* Register DAAP service */
if (!mdns_no_daap)
mdns_register(servername, "_daap._tcp", port, txtrecord);
for (i = 0; i < (sizeof(txtrecord) / sizeof(*txtrecord) - 1); i++)
free(txtrecord[i]);
/* Set up signal fd */ /* Set up signal fd */
sigfd = signalfd(-1, &sigs, SFD_NONBLOCK | SFD_CLOEXEC); sigfd = signalfd(-1, &sigs, SFD_NONBLOCK | SFD_CLOEXEC);
if (sigfd < 0) if (sigfd < 0)