X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-utils%2Favahi-browse.c;h=a5d9d25f06d2407cf8da5f06de24ae1c512334d8;hb=df28cc51c00a958d25f7ebd7b5b0d7fb9af0b8e1;hp=b8910fcb720981266e66023a609b9d395bd789ca;hpb=6f37f0e1126ad3776b80dbd64701f38a58738921;p=catta diff --git a/avahi-utils/avahi-browse.c b/avahi-utils/avahi-browse.c index b8910fc..a5d9d25 100644 --- a/avahi-utils/avahi-browse.c +++ b/avahi-utils/avahi-browse.c @@ -64,6 +64,7 @@ typedef struct Config { int ignore_local; Command command; int resolve; + int no_fail; #ifdef HAVE_GDBM int no_db_lookup; #endif @@ -88,6 +89,7 @@ static int n_all_for_now = 0, n_cache_exhausted = 0, n_resolving = 0; static AvahiStringList *browsed_types = NULL; static ServiceInfo *services = NULL; static int n_columns = 80; +static int browsing = 0; static void check_terminate(Config *c) { @@ -473,30 +475,114 @@ static void browse_domains(Config *c) { n_all_for_now++; } +static int start(Config *config) { + + assert(!browsing); + + if (config->verbose) { + const char *version, *hn; + + if (!(version = avahi_client_get_version_string(client))) { + fprintf(stderr, "Failed to query version string: %s\n", avahi_strerror(avahi_client_errno(client))); + return -1; + } + + if (!(hn = avahi_client_get_host_name_fqdn(client))) { + fprintf(stderr, "Failed to query host name: %s\n", avahi_strerror(avahi_client_errno(client))); + return -1; + } + + fprintf(stderr, "Server version: %s; Host name: %s\n", version, hn); + + if (config->command == COMMAND_BROWSE_DOMAINS) + fprintf(stderr, "E Ifce Prot Domain\n"); + else + fprintf(stderr, "E Ifce Prot %-*s %-20s Domain\n", n_columns-35, "Name", "Type"); + } + + if (config->command == COMMAND_BROWSE_SERVICES) + browse_service_type(config, config->stype, config->domain); + else if (config->command == COMMAND_BROWSE_ALL_SERVICES) + browse_all(config); + else { + assert(config->command == COMMAND_BROWSE_DOMAINS); + browse_domains(config); + } + + browsing = 1; + return 0; +} + static void client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UNUSED void * userdata) { + Config *config = userdata; + + /* This function might be called when avahi_client_new() has not + * returned yet.*/ + client = c; + switch (state) { case AVAHI_CLIENT_FAILURE: - fprintf(stderr, "Client failure, exiting: %s\n", avahi_strerror(avahi_client_errno(c))); - avahi_simple_poll_quit(simple_poll); - break; - case AVAHI_CLIENT_DISCONNECTED: - fprintf(stderr, "Client disconnected, exiting.\n"); - avahi_simple_poll_quit(simple_poll); - break; + if (config->no_fail && avahi_client_errno(c) == AVAHI_ERR_DISCONNECTED) { + int error; + + /* We have been disconnected, so let reconnect */ + + fprintf(stderr, "Disconnected, reconnecting ...\n"); + + avahi_client_free(client); + client = NULL; + + avahi_string_list_free(browsed_types); + browsed_types = NULL; + + while (services) + remove_service(config, services); + browsing = 0; + + if (!(client = avahi_client_new(avahi_simple_poll_get(simple_poll), AVAHI_CLIENT_NO_FAIL, client_callback, config, &error))) { + fprintf(stderr, "Failed to create client object: %s\n", avahi_strerror(error)); + avahi_simple_poll_quit(simple_poll); + } + + } else { + fprintf(stderr, "Client failure, exiting: %s\n", avahi_strerror(avahi_client_errno(c))); + avahi_simple_poll_quit(simple_poll); + } + + break; + case AVAHI_CLIENT_S_REGISTERING: case AVAHI_CLIENT_S_RUNNING: case AVAHI_CLIENT_S_COLLISION: - ; + + if (!browsing) + if (start(config) < 0) + avahi_simple_poll_quit(simple_poll); + + break; + + case AVAHI_CLIENT_CONNECTING: + + if (config->verbose) + fprintf(stderr, "Waiting for daemon ...\n"); + + break; } } static void help(FILE *f, const char *argv0) { - fprintf(f, - "%s [options] \n" - "%s [options] -a\n" - "%s [options] -D\n\n" + if (strstr(argv0, "domain")) + fprintf(f, "%s [options] \n\n", argv0); + else + fprintf(f, + "%s [options] \n" + "%s [options] -a\n" + "%s [options] -D\n\n", + argv0, argv0, argv0); + + fprintf(f, " -h --help Show this help\n" " -V --version Show version\n" " -D --browse-domains Browse for browsing domains instead of services\n" @@ -507,13 +593,14 @@ static void help(FILE *f, const char *argv0) { " -c --cache Terminate after dumping all entries from the cache\n" " -l --ignore-local Ignore local services\n" " -r --resolve Resolve services found\n" + " -f --no-fail Don't fail if the daemon is not available\n" #ifdef HAVE_GDBM " -k --no-db-lookup Don't lookup service types\n" #endif - , argv0, argv0, argv0); + ); } -static int parse_command_line(Config *c, int argc, char *argv[]) { +static int parse_command_line(Config *c, const char *argv0, int argc, char *argv[]) { int o; static const struct option long_options[] = { @@ -527,6 +614,7 @@ static int parse_command_line(Config *c, int argc, char *argv[]) { { "cache", no_argument, NULL, 'c' }, { "ignore-local", no_argument, NULL, 'l' }, { "resolve", no_argument, NULL, 'r' }, + { "no-fail", no_argument, NULL, 'f' }, #ifdef HAVE_GDBM { "no-db-lookup", no_argument, NULL, 'k' }, #endif @@ -535,12 +623,13 @@ static int parse_command_line(Config *c, int argc, char *argv[]) { assert(c); - c->command = COMMAND_BROWSE_SERVICES; + c->command = strstr(argv0, "domain") ? COMMAND_BROWSE_DOMAINS : COMMAND_BROWSE_SERVICES; c->verbose = c->terminate_on_cache_exhausted = c->terminate_on_all_for_now = c->ignore_local = - c->resolve = 0; + c->resolve = + c->no_fail = 0; c->domain = c->stype = NULL; #ifdef HAVE_GDBM @@ -548,7 +637,7 @@ static int parse_command_line(Config *c, int argc, char *argv[]) { #endif opterr = 0; - while ((o = getopt_long(argc, argv, "hVd:avtclrD" + while ((o = getopt_long(argc, argv, "hVd:avtclrDf" #ifdef HAVE_GDBM "k" #endif @@ -568,6 +657,7 @@ static int parse_command_line(Config *c, int argc, char *argv[]) { c->command = COMMAND_BROWSE_DOMAINS; break; case 'd': + avahi_free(c->domain); c->domain = avahi_strdup(optarg); break; case 'v': @@ -585,6 +675,9 @@ static int parse_command_line(Config *c, int argc, char *argv[]) { case 'r': c->resolve = 1; break; + case 'f': + c->no_fail = 1; + break; #ifdef HAVE_GDBM case 'k': c->no_db_lookup = 1; @@ -633,7 +726,7 @@ int main(int argc, char *argv[]) { if (n_columns < 40) n_columns = 40; - if (parse_command_line(&config, argc, argv) < 0) + if (parse_command_line(&config, argv0, argc, argv) < 0) goto fail; switch (config.command) { @@ -659,40 +752,10 @@ int main(int argc, char *argv[]) { if (sigint_install(simple_poll) < 0) goto fail; - if (!(client = avahi_client_new(avahi_simple_poll_get(simple_poll), client_callback, NULL, &error))) { + if (!(client = avahi_client_new(avahi_simple_poll_get(simple_poll), config.no_fail ? AVAHI_CLIENT_NO_FAIL : 0, client_callback, &config, &error))) { fprintf(stderr, "Failed to create client object: %s\n", avahi_strerror(error)); goto fail; } - - if (config.verbose) { - const char *version, *hn; - - if (!(version = avahi_client_get_version_string(client))) { - fprintf(stderr, "Failed to query version string: %s\n", avahi_strerror(avahi_client_errno(client))); - goto fail; - } - - if (!(hn = avahi_client_get_host_name_fqdn(client))) { - fprintf(stderr, "Failed to query host name: %s\n", avahi_strerror(avahi_client_errno(client))); - goto fail; - } - - fprintf(stderr, "Server version: %s; Host name: %s\n", version, hn); - - if (config.command == COMMAND_BROWSE_DOMAINS) - fprintf(stderr, "E Ifce Prot Domain\n"); - else - fprintf(stderr, "E Ifce Prot %-*s %-20s Domain\n", n_columns-35, "Name", "Type"); - } - - if (config.command == COMMAND_BROWSE_SERVICES) - browse_service_type(&config, config.stype, config.domain); - else if (config.command == COMMAND_BROWSE_ALL_SERVICES) - browse_all(&config); - else { - assert(config.command == COMMAND_BROWSE_DOMAINS); - browse_domains(&config); - } avahi_simple_poll_loop(simple_poll); ret = 0;