diff --git a/src/ff-plugins.h b/src/ff-plugins.h index 0aa0278f..530e2769 100644 --- a/src/ff-plugins.h +++ b/src/ff-plugins.h @@ -69,7 +69,7 @@ typedef struct tag_plugin_transcode_fn { /* info for rendezvous advertising */ typedef struct tag_plugin_rend_info { char *type; - char *txt; + char **txt; } PLUGIN_REND_INFO; /* main info struct that plugins must provide */ diff --git a/src/main.c b/src/main.c index 3f46cd6e..63018b6a 100644 --- a/src/main.c +++ b/src/main.c @@ -121,37 +121,9 @@ struct event_base *evbase_main; static void usage(char *program); static void main_handler(WS_CONNINFO *pwsc); static int main_auth(WS_CONNINFO *pwsc, char *username, char *password); -static void txt_add(char *txtrecord, char *fmt, ...); static void main_io_errhandler(int level, char *msg); static void main_ws_errhandler(int level, char *msg); -/** - * build a dns text string - * - * @param txtrecord buffer to append text record string to - * @param fmt sprintf-style format - */ -void txt_add(char *txtrecord, char *fmt, ...) { - va_list ap; - char buff[256]; - int len; - char *end; - - va_start(ap, fmt); - vsnprintf(buff, sizeof(buff), fmt, ap); - va_end(ap); - - len = (int)strlen(buff); - if(len + strlen(txtrecord) > 255) { - DPRINTF(E_FATAL,L_MAIN,"dns-sd text string too long. Try a shorter " - "share name.\n"); - } - - end = txtrecord + strlen(txtrecord); - *end = len; - strcpy(end+1,buff); -} - void main_handler(WS_CONNINFO *pwsc) { DPRINTF(E_DBG,L_MAIN,"in main_handler\n"); if(plugin_url_candispatch(pwsc)) { @@ -411,7 +383,7 @@ int main(int argc, char *argv[]) { char *ffid = NULL; int appdir = 0; char *perr=NULL; - char txtrecord[255]; + char *txtrecord[10]; void *phandle; char *plugindir; struct event *main_timer; @@ -420,6 +392,7 @@ int main(int argc, char *argv[]) { int sigfd; struct event sig_event; int ret; + int i; int err; char *apppath; @@ -702,27 +675,41 @@ int main(int argc, char *argv[]) { /* Register mDNS services */ servername = conf_get_servername(); - memset(txtrecord,0,sizeof(txtrecord)); - txt_add(txtrecord,"txtvers=1"); - txt_add(txtrecord,"Database ID=%0X",util_djb_hash_str(servername)); - txt_add(txtrecord,"Machine ID=%0X",util_djb_hash_str(servername)); - txt_add(txtrecord,"Machine Name=%s",servername); - txt_add(txtrecord,"mtd-version=" VERSION); - txt_add(txtrecord,"iTSh Version=131073"); /* iTunes 6.0.4 */ - txt_add(txtrecord,"Version=196610"); /* iTunes 6.0.4 */ + for (i = 0; i < (sizeof(txtrecord) / sizeof(*txtrecord) - 1); i++) + { + txtrecord[i] = (char *)malloc(128); + if (!txtrecord[i]) + { + DPRINTF(E_FATAL, L_MAIN, "Out of memory for TXT record\n"); + + mdns_deinit(); + exit(EXIT_FAILURE); + } + + memset(txtrecord[i], 0, 128); + } + + snprintf(txtrecord[0], 128, "txtvers=1"); + snprintf(txtrecord[1], 128, "Database ID=%0X", util_djb_hash_str(servername)); + snprintf(txtrecord[2], 128, "Machine ID=%0X", util_djb_hash_str(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 = conf_alloc_string("general", "password", NULL); - txt_add(txtrecord, "Password=%s", (tmp && (strlen(tmp) > 0)) ? "true" : "false"); + snprintf(txtrecord[7], 128, "Password=%s", (tmp && (strlen(tmp) > 0)) ? "true" : "false"); if (tmp) free(tmp); srand((unsigned int)time(NULL)); - if(ffid) { - txt_add(txtrecord,"ffid=%s",ffid); - } else { - txt_add(txtrecord,"ffid=%08x",rand()); - } + 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|L_REND,"Registering rendezvous names\n"); /* Register main service */ @@ -730,6 +717,9 @@ int main(int argc, char *argv[]) { /* Register plugin services */ plugin_rend_register(servername, ws_config.port, txtrecord); + for (i = 0; i < (sizeof(txtrecord) / sizeof(*txtrecord) - 1); i++) + free(txtrecord[i]); + free(servername); end_time=(int) time(NULL); diff --git a/src/mdns_avahi.c b/src/mdns_avahi.c index e6121f4f..560f76b7 100644 --- a/src/mdns_avahi.c +++ b/src/mdns_avahi.c @@ -505,14 +505,11 @@ mdns_deinit(void) } int -mdns_register(char *name, char *type, int port, char *txt) +mdns_register(char *name, char *type, int port, char **txt) { struct mdns_group_entry *ge; AvahiStringList *txt_sl; - unsigned char count; - unsigned char *key; - unsigned char *nextkey; - unsigned char *newtxt; + int i; DPRINTF(E_DBG, L_REND, "Adding mDNS service %s/%s\n", name, type); @@ -524,41 +521,14 @@ mdns_register(char *name, char *type, int port, char *txt) ge->type = strdup(type); ge->port = port; - /* Build a string list from the "encoded" txt record - * "...\0" - * Length is 1 byte - */ - count = 0; txt_sl = NULL; - newtxt = (unsigned char *)strdup(txt); - if (!newtxt) + for (i = 0; txt[i]; i++) { - DPRINTF(E_FATAL, L_REND, "Out of memory\n"); + txt_sl = avahi_string_list_add(txt_sl, txt[i]); - return -1; + DPRINTF(E_DBG, L_REND, "Added key %s\n", txt[i]); } - key = nextkey = newtxt; - if (*nextkey) - count = *nextkey; - - DPRINTF(E_DBG, L_REND, "Found key of size %d\n", count); - while ((*nextkey) && (nextkey < (newtxt + strlen(txt)))) - { - key = nextkey + 1; - nextkey += (count + 1); - count = *nextkey; - *nextkey = '\0'; - - txt_sl = avahi_string_list_add(txt_sl, (char *)key); - - DPRINTF(E_DBG, L_REND, "Added key %s\n", key); - - *nextkey = count; - } - - free(newtxt); - ge->txt = txt_sl; ge->next = group_entries; diff --git a/src/mdns_avahi.h b/src/mdns_avahi.h index 239dc8cf..9277d74e 100644 --- a/src/mdns_avahi.h +++ b/src/mdns_avahi.h @@ -11,6 +11,6 @@ void mdns_deinit(void); int -mdns_register(char *name, char *type, int port, char *txt); +mdns_register(char *name, char *type, int port, char **txt); #endif /* !__MDNS_AVAHI_H__ */ diff --git a/src/plugin.c b/src/plugin.c index 0c477898..1b8e9ed3 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -339,10 +339,10 @@ void plugin_url_handle(WS_CONNINFO *pwsc) { * walk through the plugins and register whatever rendezvous * names the clients want */ -int plugin_rend_register(char *name, int port, char *txt) { +int plugin_rend_register(char *name, int port, char **txt) { PLUGIN_ENTRY *ppi; PLUGIN_REND_INFO *pri; - char *supplied_txt; + char **supplied_txt; ppi = _plugin_list.next; diff --git a/src/plugin.h b/src/plugin.h index e49eb0c2..45b18377 100644 --- a/src/plugin.h +++ b/src/plugin.h @@ -34,7 +34,7 @@ extern int plugin_deinit(void); extern int plugin_url_candispatch(WS_CONNINFO *pwsc); extern void plugin_url_handle(WS_CONNINFO *pwsc); extern int plugin_auth_handle(WS_CONNINFO *pwsc, char *username, char *pw); -extern int plugin_rend_register(char *name, int port, char *txt); +extern int plugin_rend_register(char *name, int port, char **txt); extern void plugin_event_dispatch(int event_id, int intval, void *vp, int len); extern void *plugin_enum(void *);