Annotation of embedaddon/curl/lib/share.c, revision 1.1
1.1 ! misho 1: /***************************************************************************
! 2: * _ _ ____ _
! 3: * Project ___| | | | _ \| |
! 4: * / __| | | | |_) | |
! 5: * | (__| |_| | _ <| |___
! 6: * \___|\___/|_| \_\_____|
! 7: *
! 8: * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
! 9: *
! 10: * This software is licensed as described in the file COPYING, which
! 11: * you should have received as part of this distribution. The terms
! 12: * are also available at https://curl.haxx.se/docs/copyright.html.
! 13: *
! 14: * You may opt to use, copy, modify, merge, publish, distribute and/or sell
! 15: * copies of the Software, and permit persons to whom the Software is
! 16: * furnished to do so, under the terms of the COPYING file.
! 17: *
! 18: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
! 19: * KIND, either express or implied.
! 20: *
! 21: ***************************************************************************/
! 22:
! 23: #include "curl_setup.h"
! 24:
! 25: #include <curl/curl.h>
! 26: #include "urldata.h"
! 27: #include "share.h"
! 28: #include "psl.h"
! 29: #include "vtls/vtls.h"
! 30: #include "curl_memory.h"
! 31:
! 32: /* The last #include file should be: */
! 33: #include "memdebug.h"
! 34:
! 35: struct Curl_share *
! 36: curl_share_init(void)
! 37: {
! 38: struct Curl_share *share = calloc(1, sizeof(struct Curl_share));
! 39: if(share) {
! 40: share->specifier |= (1<<CURL_LOCK_DATA_SHARE);
! 41:
! 42: if(Curl_mk_dnscache(&share->hostcache)) {
! 43: free(share);
! 44: return NULL;
! 45: }
! 46: }
! 47:
! 48: return share;
! 49: }
! 50:
! 51: #undef curl_share_setopt
! 52: CURLSHcode
! 53: curl_share_setopt(struct Curl_share *share, CURLSHoption option, ...)
! 54: {
! 55: va_list param;
! 56: int type;
! 57: curl_lock_function lockfunc;
! 58: curl_unlock_function unlockfunc;
! 59: void *ptr;
! 60: CURLSHcode res = CURLSHE_OK;
! 61:
! 62: if(share->dirty)
! 63: /* don't allow setting options while one or more handles are already
! 64: using this share */
! 65: return CURLSHE_IN_USE;
! 66:
! 67: va_start(param, option);
! 68:
! 69: switch(option) {
! 70: case CURLSHOPT_SHARE:
! 71: /* this is a type this share will share */
! 72: type = va_arg(param, int);
! 73: share->specifier |= (1<<type);
! 74: switch(type) {
! 75: case CURL_LOCK_DATA_DNS:
! 76: break;
! 77:
! 78: case CURL_LOCK_DATA_COOKIE:
! 79: #if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
! 80: if(!share->cookies) {
! 81: share->cookies = Curl_cookie_init(NULL, NULL, NULL, TRUE);
! 82: if(!share->cookies)
! 83: res = CURLSHE_NOMEM;
! 84: }
! 85: #else /* CURL_DISABLE_HTTP */
! 86: res = CURLSHE_NOT_BUILT_IN;
! 87: #endif
! 88: break;
! 89:
! 90: case CURL_LOCK_DATA_SSL_SESSION:
! 91: #ifdef USE_SSL
! 92: if(!share->sslsession) {
! 93: share->max_ssl_sessions = 8;
! 94: share->sslsession = calloc(share->max_ssl_sessions,
! 95: sizeof(struct curl_ssl_session));
! 96: share->sessionage = 0;
! 97: if(!share->sslsession)
! 98: res = CURLSHE_NOMEM;
! 99: }
! 100: #else
! 101: res = CURLSHE_NOT_BUILT_IN;
! 102: #endif
! 103: break;
! 104:
! 105: case CURL_LOCK_DATA_CONNECT: /* not supported (yet) */
! 106: if(Curl_conncache_init(&share->conn_cache, 103))
! 107: res = CURLSHE_NOMEM;
! 108: break;
! 109:
! 110: case CURL_LOCK_DATA_PSL:
! 111: #ifndef USE_LIBPSL
! 112: res = CURLSHE_NOT_BUILT_IN;
! 113: #endif
! 114: break;
! 115:
! 116: default:
! 117: res = CURLSHE_BAD_OPTION;
! 118: }
! 119: break;
! 120:
! 121: case CURLSHOPT_UNSHARE:
! 122: /* this is a type this share will no longer share */
! 123: type = va_arg(param, int);
! 124: share->specifier &= ~(1<<type);
! 125: switch(type) {
! 126: case CURL_LOCK_DATA_DNS:
! 127: break;
! 128:
! 129: case CURL_LOCK_DATA_COOKIE:
! 130: #if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
! 131: if(share->cookies) {
! 132: Curl_cookie_cleanup(share->cookies);
! 133: share->cookies = NULL;
! 134: }
! 135: #else /* CURL_DISABLE_HTTP */
! 136: res = CURLSHE_NOT_BUILT_IN;
! 137: #endif
! 138: break;
! 139:
! 140: case CURL_LOCK_DATA_SSL_SESSION:
! 141: #ifdef USE_SSL
! 142: Curl_safefree(share->sslsession);
! 143: #else
! 144: res = CURLSHE_NOT_BUILT_IN;
! 145: #endif
! 146: break;
! 147:
! 148: case CURL_LOCK_DATA_CONNECT:
! 149: break;
! 150:
! 151: default:
! 152: res = CURLSHE_BAD_OPTION;
! 153: break;
! 154: }
! 155: break;
! 156:
! 157: case CURLSHOPT_LOCKFUNC:
! 158: lockfunc = va_arg(param, curl_lock_function);
! 159: share->lockfunc = lockfunc;
! 160: break;
! 161:
! 162: case CURLSHOPT_UNLOCKFUNC:
! 163: unlockfunc = va_arg(param, curl_unlock_function);
! 164: share->unlockfunc = unlockfunc;
! 165: break;
! 166:
! 167: case CURLSHOPT_USERDATA:
! 168: ptr = va_arg(param, void *);
! 169: share->clientdata = ptr;
! 170: break;
! 171:
! 172: default:
! 173: res = CURLSHE_BAD_OPTION;
! 174: break;
! 175: }
! 176:
! 177: va_end(param);
! 178:
! 179: return res;
! 180: }
! 181:
! 182: CURLSHcode
! 183: curl_share_cleanup(struct Curl_share *share)
! 184: {
! 185: if(share == NULL)
! 186: return CURLSHE_INVALID;
! 187:
! 188: if(share->lockfunc)
! 189: share->lockfunc(NULL, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE,
! 190: share->clientdata);
! 191:
! 192: if(share->dirty) {
! 193: if(share->unlockfunc)
! 194: share->unlockfunc(NULL, CURL_LOCK_DATA_SHARE, share->clientdata);
! 195: return CURLSHE_IN_USE;
! 196: }
! 197:
! 198: Curl_conncache_close_all_connections(&share->conn_cache);
! 199: Curl_conncache_destroy(&share->conn_cache);
! 200: Curl_hash_destroy(&share->hostcache);
! 201:
! 202: #if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
! 203: Curl_cookie_cleanup(share->cookies);
! 204: #endif
! 205:
! 206: #ifdef USE_SSL
! 207: if(share->sslsession) {
! 208: size_t i;
! 209: for(i = 0; i < share->max_ssl_sessions; i++)
! 210: Curl_ssl_kill_session(&(share->sslsession[i]));
! 211: free(share->sslsession);
! 212: }
! 213: #endif
! 214:
! 215: Curl_psl_destroy(&share->psl);
! 216:
! 217: if(share->unlockfunc)
! 218: share->unlockfunc(NULL, CURL_LOCK_DATA_SHARE, share->clientdata);
! 219: free(share);
! 220:
! 221: return CURLSHE_OK;
! 222: }
! 223:
! 224:
! 225: CURLSHcode
! 226: Curl_share_lock(struct Curl_easy *data, curl_lock_data type,
! 227: curl_lock_access accesstype)
! 228: {
! 229: struct Curl_share *share = data->share;
! 230:
! 231: if(share == NULL)
! 232: return CURLSHE_INVALID;
! 233:
! 234: if(share->specifier & (1<<type)) {
! 235: if(share->lockfunc) /* only call this if set! */
! 236: share->lockfunc(data, type, accesstype, share->clientdata);
! 237: }
! 238: /* else if we don't share this, pretend successful lock */
! 239:
! 240: return CURLSHE_OK;
! 241: }
! 242:
! 243: CURLSHcode
! 244: Curl_share_unlock(struct Curl_easy *data, curl_lock_data type)
! 245: {
! 246: struct Curl_share *share = data->share;
! 247:
! 248: if(share == NULL)
! 249: return CURLSHE_INVALID;
! 250:
! 251: if(share->specifier & (1<<type)) {
! 252: if(share->unlockfunc) /* only call this if set! */
! 253: share->unlockfunc (data, type, share->clientdata);
! 254: }
! 255:
! 256: return CURLSHE_OK;
! 257: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>