sacc

sacc (saccomys): simple gopher client.
Log | Files | Refs | LICENSE

io_clr.c (1406B)


      1 #include <string.h>
      2 #include <unistd.h>
      3 #include <netdb.h>
      4 
      5 #include <sys/socket.h>
      6 
      7 #include "common.h"
      8 #include "io.h"
      9 
     10 static int
     11 setup_clr(void)
     12 {
     13 	return 0;
     14 }
     15 
     16 static int
     17 close_clr(struct cnx *c)
     18 {
     19 	return close(c->sock);
     20 }
     21 
     22 static int
     23 connect_clr(struct cnx *c, struct addrinfo *ai, const char *host)
     24 {
     25 	return connect(c->sock, ai->ai_addr, ai->ai_addrlen);
     26 }
     27 
     28 static void
     29 connerr_clr(struct cnx *c, const char *host, const char *port, int err)
     30 {
     31 	if (c->sock == -1)
     32 		diag("Can't open socket: %s", strerror(err));
     33 	else
     34 		diag("Can't connect to: %s:%s: %s", host, port, strerror(err));
     35 }
     36 
     37 static char *
     38 parseurl_clr(char *url)
     39 {
     40 	char *p;
     41 
     42 	if (p = strstr(url, "://")) {
     43 		if (strncmp(url, "gopher", p - url))
     44 			die("Protocol not supported: %.*s", p - url, url);
     45 
     46 		url = p + 3;
     47 	}
     48 
     49 	return url;
     50 }
     51 
     52 static ssize_t
     53 read_clr(struct cnx *c, void *buf, size_t bs)
     54 {
     55 	return read(c->sock, buf, bs);
     56 }
     57 
     58 static ssize_t
     59 write_clr(struct cnx *c, void *buf, size_t bs)
     60 {
     61 	return write(c->sock, buf, bs);
     62 }
     63 
     64 int (*iosetup)(void) = setup_clr;
     65 int (*ioclose)(struct cnx *) = close_clr;
     66 int (*ioconnect)(struct cnx *, struct addrinfo *, const char *) = connect_clr;
     67 void (*ioconnerr)(struct cnx *, const char *, const char *, int) = connerr_clr;
     68 char *(*ioparseurl)(char *) = parseurl_clr;
     69 ssize_t (*ioread)(struct cnx *, void *, size_t) = read_clr;
     70 ssize_t (*iowrite)(struct cnx *, void *, size_t) = write_clr;