netops.h 2.92 KB
Newer Older
1
/*
Edward Thomson committed
2
 * Copyright (C) the libgit2 contributors. All rights reserved.
Vicent Marti committed
3 4 5
 *
 * This file is part of libgit2, distributed under the GNU GPL v2 with
 * a Linking Exception. For full terms see the included COPYING file.
6 7 8 9
 */
#ifndef INCLUDE_netops_h__
#define INCLUDE_netops_h__

10
#include "posix.h"
11
#include "common.h"
12

13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#ifdef GIT_SSL
# include <openssl/ssl.h>
#endif

struct gitno_ssl {
#ifdef GIT_SSL
	SSL *ssl;
#else
	size_t dummy;
#endif
};

typedef struct gitno_ssl gitno_ssl;

/* Represents a socket that may or may not be using SSL */
struct gitno_socket {
	GIT_SOCKET socket;
	gitno_ssl ssl;
};

typedef struct gitno_socket gitno_socket;

35
struct gitno_buffer {
36
	char *data;
37 38
	size_t len;
	size_t offset;
39 40
	gitno_socket *socket;
	int (*recv)(struct gitno_buffer *buffer);
41
	void *cb_data;
42
};
43

44 45 46 47 48 49 50 51 52 53 54 55
typedef struct gitno_buffer gitno_buffer;

/* Flags to gitno_connect */
enum {
	/* Attempt to create an SSL connection. */
	GITNO_CONNECT_SSL = 1,

	/* Valid only when GITNO_CONNECT_SSL is also specified.
	 * Indicates that the server certificate should not be validated. */
	GITNO_CONNECT_SSL_NO_CHECK_CERT = 2,
};

56 57 58 59 60 61 62 63 64 65 66 67 68
/**
 * Check if the name in a cert matches the wanted hostname
 *
 * Check if a pattern from a certificate matches the hostname we
 * wanted to connect to according to RFC2818 rules (which specifies
 * HTTP over TLS). Mainly, an asterisk matches anything, but is
 * limited to a single url component.
 *
 * Note that this does not set an error message. It expects the user
 * to provide the message for the user.
 */
int gitno__match_host(const char *pattern, const char *host);

69 70
void gitno_buffer_setup(gitno_socket *t, gitno_buffer *buf, char *data, size_t len);
void gitno_buffer_setup_callback(gitno_socket *t, gitno_buffer *buf, char *data, size_t len, int (*recv)(gitno_buffer *buf), void *cb_data);
71
int gitno_recv(gitno_buffer *buf);
72

73
void gitno_consume(gitno_buffer *buf, const char *ptr);
74
void gitno_consume_n(gitno_buffer *buf, size_t cons);
75

76 77 78
int gitno_connect(gitno_socket *socket, const char *host, const char *port, int flags);
int gitno_send(gitno_socket *socket, const char *msg, size_t len, int flags);
int gitno_close(gitno_socket *s);
79
int gitno_select_in(gitno_buffer *buf, long int sec, long int usec);
80

81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
typedef struct gitno_connection_data {
	char *host;
	char *port;
	char *path;
	char *user;
	char *pass;
	bool use_ssl;
} gitno_connection_data;

/*
 * This replaces all the pointers in `data` with freshly-allocated strings,
 * that the caller is responsible for freeing.
 * `gitno_connection_data_free_ptrs` is good for this.
 */

int gitno_connection_data_from_url(
		gitno_connection_data *data,
		const char *url,
99
		const char *service_suffix);
100 101 102 103

/* This frees all the pointers IN the struct, but not the struct itself. */
void gitno_connection_data_free_ptrs(gitno_connection_data *data);

104 105 106
int gitno_extract_url_parts(
		char **host,
		char **port,
107
		char **path,
108 109 110 111
		char **username,
		char **password,
		const char *url,
		const char *default_port);
112

113
#endif