source src/netops.c
| Line | Flow | Count | Block(s) | Source |
|---|---|---|---|---|
| 1 | - | /* | ||
| 2 | - | * Copyright (C) the libgit2 contributors. All rights reserved. | ||
| 3 | - | * | ||
| 4 | - | * This file is part of libgit2, distributed under the GNU GPL v2 with | ||
| 5 | - | * a Linking Exception. For full terms see the included COPYING file. | ||
| 6 | - | */ | ||
| 7 | - | |||
| 8 | - | #include "netops.h" | ||
| 9 | - | |||
| 10 | - | #include <ctype.h> | ||
| 11 | - | #include "git2/errors.h" | ||
| 12 | - | |||
| 13 | - | #include "posix.h" | ||
| 14 | - | #include "buffer.h" | ||
| 15 | - | #include "http_parser.h" | ||
| 16 | - | #include "global.h" | ||
| 17 | - | |||
| 18 | 744 | 2 | int gitno_recv(gitno_buffer *buf) | |
| 19 | - | { | ||
| 20 | 744 | 2 | return buf->recv(buf); | |
| 21 | - | } | ||
| 22 | - | |||
| 23 | 103 | 2 | void gitno_buffer_setup_callback( | |
| 24 | - | gitno_buffer *buf, | ||
| 25 | - | char *data, | ||
| 26 | - | size_t len, | ||
| 27 | - | int (*recv)(gitno_buffer *buf), void *cb_data) | ||
| 28 | - | { | ||
| 29 | 103 | 2 | memset(data, 0x0, len); | |
| 30 | 103 | 2 | buf->data = data; | |
| 31 | 103 | 2 | buf->len = len; | |
| 32 | 103 | 2 | buf->offset = 0; | |
| 33 | 103 | 2 | buf->recv = recv; | |
| 34 | 103 | 2 | buf->cb_data = cb_data; | |
| 35 | 103 | 2 | } | |
| 36 | - | |||
| 37 | 101 | 2 | static int recv_stream(gitno_buffer *buf) | |
| 38 | - | { | ||
| 39 | 101 | 2 | git_stream *io = (git_stream *) buf->cb_data; | |
| 40 | 101 | 2 | size_t readlen = buf->len - buf->offset; | |
| 41 | - | ssize_t ret; | ||
| 42 | - | |||
| 43 | 101 | 2 | readlen = min(readlen, INT_MAX); | |
| 44 | - | |||
| 45 | 101 | 2 | ret = git_stream_read(io, buf->data + buf->offset, (int)readlen); | |
| 46 | 101 | 3 | if (ret < 0) | |
| 47 | ##### | 4 | return -1; | |
| 48 | - | |||
| 49 | 101 | 5 | buf->offset += ret; | |
| 50 | 101 | 5 | return (int)ret; | |
| 51 | - | } | ||
| 52 | - | |||
| 53 | 101 | 2 | void gitno_buffer_setup_fromstream(git_stream *st, gitno_buffer *buf, char *data, size_t len) | |
| 54 | - | { | ||
| 55 | 101 | 2 | memset(data, 0x0, len); | |
| 56 | 101 | 2 | buf->data = data; | |
| 57 | 101 | 2 | buf->len = len; | |
| 58 | 101 | 2 | buf->offset = 0; | |
| 59 | 101 | 2 | buf->recv = recv_stream; | |
| 60 | 101 | 2 | buf->cb_data = st; | |
| 61 | 101 | 2 | } | |
| 62 | - | |||
| 63 | - | /* Consume up to ptr and move the rest of the buffer to the beginning */ | ||
| 64 | 1022 | 2 | void gitno_consume(gitno_buffer *buf, const char *ptr) | |
| 65 | - | { | ||
| 66 | - | size_t consumed; | ||
| 67 | - | |||
| 68 | 1022 | 2,3 | assert(ptr - buf->data >= 0); | |
| 69 | 1022 | 4,5 | assert(ptr - buf->data <= (int) buf->len); | |
| 70 | - | |||
| 71 | 1022 | 6 | consumed = ptr - buf->data; | |
| 72 | - | |||
| 73 | 1022 | 6 | memmove(buf->data, ptr, buf->offset - consumed); | |
| 74 | 1022 | 6 | memset(buf->data + buf->offset, 0x0, buf->len - buf->offset); | |
| 75 | 1022 | 6 | buf->offset -= consumed; | |
| 76 | 1022 | 6 | } | |
| 77 | - | |||
| 78 | - | /* Consume const bytes and move the rest of the buffer to the beginning */ | ||
| 79 | ##### | 2 | void gitno_consume_n(gitno_buffer *buf, size_t cons) | |
| 80 | - | { | ||
| 81 | ##### | 2 | memmove(buf->data, buf->data + cons, buf->len - buf->offset); | |
| 82 | ##### | 2 | memset(buf->data + cons, 0x0, buf->len - buf->offset); | |
| 83 | ##### | 2 | buf->offset -= cons; | |
| 84 | ##### | 2 | } | |
| 85 | - | |||
| 86 | - | /* Match host names according to RFC 2818 rules */ | ||
| 87 | ![]() |
99 | 2 | int gitno__match_host(const char *pattern, const char *host) |
| 88 | - | { | ||
| 89 | - | for (;;) { | ||
| 90 | 99 | 2 | char c = git__tolower(*pattern++); | |
| 91 | - | |||
| 92 | 99 | 2 | if (c == '\0') | |
| 93 | 3 | 3-6 | return *host ? -1 : 0; | |
| 94 | - | |||
| 95 | 96 | 7 | if (c == '*') { | |
| 96 | 16 | 8 | c = *pattern; | |
| 97 | - | /* '*' at the end matches everything left */ | ||
| 98 | 16 | 8 | if (c == '\0') | |
| 99 | ##### | 9 | return 0; | |
| 100 | - | |||
| 101 | - | /* | ||
| 102 | - | * We've found a pattern, so move towards the next matching | ||
| 103 | - | * char. The '.' is handled specially because wildcards aren't | ||
| 104 | - | * allowed to cross subdomains. | ||
| 105 | - | */ | ||
| 106 | - | |||
| 107 | 108 | 10,16 | while(*host) { | |
| 108 | 108 | 11 | char h = git__tolower(*host); | |
| 109 | 108 | 11 | if (c == h) | |
| 110 | 16 | 12 | return gitno__match_host(pattern, host++); | |
| 111 | 92 | 13 | if (h == '.') | |
| 112 | ##### | 14 | return gitno__match_host(pattern, host); | |
| 113 | 92 | 15 | host++; | |
| 114 | - | } | ||
| 115 | ##### | 17 | return -1; | |
| 116 | - | } | ||
| 117 | - | |||
| 118 | 80 | 18 | if (c != git__tolower(*host++)) | |
| 119 | 15 | 19 | return -1; | |
| 120 | 65 | 20 | } | |
| 121 | - | |||
| 122 | - | return -1; | ||
| 123 | - | } |