File Coverage

deps/libgit2/src/streams/registry.c
Criterion Covered Total %
statement 3 39 7.6
branch 0 18 0.0
condition n/a
subroutine n/a
pod n/a
total 3 57 5.2


line stmt bran cond sub pod time code
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 "common.h"
9              
10             #include "streams/registry.h"
11              
12             #include "global.h"
13             #include "streams/tls.h"
14             #include "streams/mbedtls.h"
15             #include "streams/openssl.h"
16             #include "streams/stransport.h"
17              
18             struct stream_registry {
19             git_rwlock lock;
20             git_stream_registration callbacks;
21             git_stream_registration tls_callbacks;
22             };
23              
24             static struct stream_registry stream_registry;
25              
26 0           static void shutdown_stream_registry(void)
27             {
28             git_rwlock_free(&stream_registry.lock);
29 0           }
30              
31 172           int git_stream_registry_global_init(void)
32             {
33             if (git_rwlock_init(&stream_registry.lock) < 0)
34             return -1;
35              
36 86           git__on_shutdown(shutdown_stream_registry);
37 86           return 0;
38             }
39              
40 0           GIT_INLINE(void) stream_registration_cpy(
41             git_stream_registration *target,
42             git_stream_registration *src)
43             {
44 0 0         if (src)
45 0           memcpy(target, src, sizeof(git_stream_registration));
46             else
47 0           memset(target, 0, sizeof(git_stream_registration));
48 0           }
49              
50 0           int git_stream_registry_lookup(git_stream_registration *out, git_stream_t type)
51             {
52             git_stream_registration *target;
53 0           int error = GIT_ENOTFOUND;
54              
55 0 0         assert(out);
56              
57 0           switch(type) {
58             case GIT_STREAM_STANDARD:
59 0           target = &stream_registry.callbacks;
60 0           break;
61             case GIT_STREAM_TLS:
62 0           target = &stream_registry.tls_callbacks;
63 0           break;
64             default:
65 0           assert(0);
66             return -1;
67             }
68              
69             if (git_rwlock_rdlock(&stream_registry.lock) < 0) {
70             git_error_set(GIT_ERROR_OS, "failed to lock stream registry");
71             return -1;
72             }
73              
74 0 0         if (target->init) {
75 0           stream_registration_cpy(out, target);
76 0           error = 0;
77             }
78              
79             git_rwlock_rdunlock(&stream_registry.lock);
80 0           return error;
81             }
82              
83 0           int git_stream_register(git_stream_t type, git_stream_registration *registration)
84             {
85 0 0         assert(!registration || registration->init);
    0          
86              
87 0 0         GIT_ERROR_CHECK_VERSION(registration, GIT_STREAM_VERSION, "stream_registration");
88              
89             if (git_rwlock_wrlock(&stream_registry.lock) < 0) {
90             git_error_set(GIT_ERROR_OS, "failed to lock stream registry");
91             return -1;
92             }
93              
94 0 0         if ((type & GIT_STREAM_STANDARD) == GIT_STREAM_STANDARD)
95 0           stream_registration_cpy(&stream_registry.callbacks, registration);
96              
97 0 0         if ((type & GIT_STREAM_TLS) == GIT_STREAM_TLS)
98 0           stream_registration_cpy(&stream_registry.tls_callbacks, registration);
99              
100             git_rwlock_wrunlock(&stream_registry.lock);
101 0           return 0;
102             }
103              
104             #ifndef GIT_DEPRECATE_HARD
105 0           int git_stream_register_tls(
106             int GIT_CALLBACK(ctor)(git_stream **out, const char *host, const char *port))
107             {
108 0           git_stream_registration registration = {0};
109              
110 0 0         if (ctor) {
111 0           registration.version = GIT_STREAM_VERSION;
112 0           registration.init = ctor;
113 0           registration.wrap = NULL;
114              
115 0           return git_stream_register(GIT_STREAM_TLS, ®istration);
116             } else {
117 0           return git_stream_register(GIT_STREAM_TLS, NULL);
118             }
119             }
120             #endif