- if (vmchannel == NULL && cmdline) {
- char *p;
- size_t len;
-
- p = strstr (cmdline, "guestfs_vmchannel=");
- if (p) {
- len = strcspn (p + 18, " \t\n");
- vmchannel = strndup (p + 18, len);
- if (!vmchannel) {
- perror ("strndup");
- exit (1);
- }
- }
-
- /* Old libraries passed guestfs=host:port. Rewrite it as tcp:host:port. */
- if (vmchannel == NULL) {
- /* We will rewrite it part of the "guestfs=" string with
- * "tcp:" hence p + 4 below. */
- p = strstr (cmdline, "guestfs=");
- if (p) {
- len = strcspn (p + 4, " \t\n");
- vmchannel = strndup (p + 4, len);
- if (!vmchannel) {
- perror ("strndup");
- exit (1);
- }
- memcpy (vmchannel, "tcp:", 4);
- }
- }
- }
-
- /* Default vmchannel. */
- if (vmchannel == NULL) {
- vmchannel = strdup ("tcp:" GUESTFWD_ADDR ":" GUESTFWD_PORT);
- if (!vmchannel) {
- perror ("strdup");
- exit (1);
- }
- }
-
- if (verbose)
- printf ("vmchannel: %s\n", vmchannel);
-
- /* Connect to vmchannel. */
- int sock = -1;
-
- if (strncmp (vmchannel, "tcp:", 4) == 0) {
- /* Resolve the hostname. */
- struct addrinfo *res, *rr;
- struct addrinfo hints;
- int r;
- char *host, *port;
-
- host = vmchannel+4;
- port = strchr (host, ':');
- if (port) {
- port[0] = '\0';
- port++;
- } else {
- fprintf (stderr, "vmchannel: expecting \"tcp:<ip>:<port>\": %s\n",
- vmchannel);
- exit (1);
- }
-
- memset (&hints, 0, sizeof hints);
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_ADDRCONFIG;
- r = getaddrinfo (host, port, &hints, &res);
- if (r != 0) {
- fprintf (stderr, "%s:%s: %s\n",
- host, port, gai_strerror (r));
- exit (1);
- }
-
- /* Connect to the given TCP socket. */
- for (rr = res; rr != NULL; rr = rr->ai_next) {
- sock = socket (rr->ai_family, rr->ai_socktype, rr->ai_protocol);
- if (sock != -1) {
- if (connect (sock, rr->ai_addr, rr->ai_addrlen) == 0)
- break;
- perror ("connect");