diff --git a/src/client.c b/src/client.c

index c252c9d9ab1783dd462343ce346cc74611e9ae85..4ec75ba1f132e2b80e0267e0e195bd10a215b918 100644

--- a/src/client.c

+++ b/src/client.c

@@ -23,7 +23,7 @@ port = (int)strtol(uport, NULL, 10);

free(uport);

}

- if (options && options->addr->ai_family != AF_UNSPEC) {

+ if (options && options->addr && options->addr->ai_family != AF_UNSPEC) {

*addr = options->addr;

} else {

struct addrinfo hints = {0};

diff --git a/src/gmnic.c b/src/gmnic.c

index 3fcfa059fe344aa4dc96bd90c4f313a4b6e755cd..fd6add8a61546a662a3fe7bb4f3beb9848a19452 100644

--- a/src/gmnic.c

+++ b/src/gmnic.c

@@ -1,12 +1,15 @@

#include <assert.h>

#include <errno.h>

#include <getopt.h>

+#include <netdb.h>

#include <openssl/bio.h>

#include <openssl/err.h>

#include <stdbool.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

+#include <sys/socket.h>

+#include <sys/types.h>

#include <unistd.h>

#include "client.h"

@@ -35,15 +38,19 @@ };

enum input_mode input_mode = INPUT_READ;

FILE *input_source = stdin;

bool follow_redirects = false, linefeed = true;

+ struct addrinfo hints = {0};

+ struct gemini_options opts = {

+ .hints = &hints,

+ };

int c;

while ((c = getopt(argc, argv, "46C:d:D:hlLiIN")) != -1) {

switch (c) {

case '4':

- assert(0); // TODO

+ hints.ai_family = AF_INET;

break;

case '6':

- assert(0); // TODO

+ hints.ai_family = AF_INET6;

break;

case 'C':

assert(0); // TODO: Client certificates

@@ -104,7 +111,7 @@

int ret = 0;

while (!exit) {

struct gemini_response resp;

- enum gemini_result r = gemini_request(url, NULL, &resp);

+ enum gemini_result r = gemini_request(url, &opts, &resp);

if (r != GEMINI_OK) {

fprintf(stderr, "Error: %s\n", gemini_strerr(r, &resp));

ret = (int)r;