Annotation of embedaddon/nginx/src/os/unix/ngx_user.c, revision 1.1
1.1 ! misho 1:
! 2: /*
! 3: * Copyright (C) Igor Sysoev
! 4: * Copyright (C) Nginx, Inc.
! 5: */
! 6:
! 7:
! 8: #include <ngx_config.h>
! 9: #include <ngx_core.h>
! 10:
! 11:
! 12: /*
! 13: * Solaris has thread-safe crypt()
! 14: * Linux has crypt_r(); "struct crypt_data" is more than 128K
! 15: * FreeBSD needs the mutex to protect crypt()
! 16: *
! 17: * TODO:
! 18: * ngx_crypt_init() to init mutex
! 19: */
! 20:
! 21:
! 22: #if (NGX_CRYPT)
! 23:
! 24: #if (NGX_HAVE_GNU_CRYPT_R)
! 25:
! 26: ngx_int_t
! 27: ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)
! 28: {
! 29: char *value;
! 30: size_t len;
! 31: struct crypt_data cd;
! 32:
! 33: cd.initialized = 0;
! 34: /* work around the glibc bug */
! 35: cd.current_salt[0] = ~salt[0];
! 36:
! 37: value = crypt_r((char *) key, (char *) salt, &cd);
! 38:
! 39: if (value) {
! 40: len = ngx_strlen(value) + 1;
! 41:
! 42: *encrypted = ngx_pnalloc(pool, len);
! 43: if (*encrypted == NULL) {
! 44: return NGX_ERROR;
! 45: }
! 46:
! 47: ngx_memcpy(*encrypted, value, len);
! 48: return NGX_OK;
! 49: }
! 50:
! 51: ngx_log_error(NGX_LOG_CRIT, pool->log, ngx_errno, "crypt_r() failed");
! 52:
! 53: return NGX_ERROR;
! 54: }
! 55:
! 56: #else
! 57:
! 58: ngx_int_t
! 59: ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)
! 60: {
! 61: char *value;
! 62: size_t len;
! 63: ngx_err_t err;
! 64:
! 65: #if (NGX_THREADS && NGX_NONREENTRANT_CRYPT)
! 66:
! 67: /* crypt() is a time consuming function, so we only try to lock */
! 68:
! 69: if (ngx_mutex_trylock(ngx_crypt_mutex) != NGX_OK) {
! 70: return NGX_AGAIN;
! 71: }
! 72:
! 73: #endif
! 74:
! 75: value = crypt((char *) key, (char *) salt);
! 76:
! 77: if (value) {
! 78: len = ngx_strlen(value) + 1;
! 79:
! 80: *encrypted = ngx_pnalloc(pool, len);
! 81: if (*encrypted == NULL) {
! 82: #if (NGX_THREADS && NGX_NONREENTRANT_CRYPT)
! 83: ngx_mutex_unlock(ngx_crypt_mutex);
! 84: #endif
! 85: return NGX_ERROR;
! 86: }
! 87:
! 88: ngx_memcpy(*encrypted, value, len);
! 89: #if (NGX_THREADS && NGX_NONREENTRANT_CRYPT)
! 90: ngx_mutex_unlock(ngx_crypt_mutex);
! 91: #endif
! 92: return NGX_OK;
! 93: }
! 94:
! 95: err = ngx_errno;
! 96:
! 97: #if (NGX_THREADS && NGX_NONREENTRANT_CRYPT)
! 98: ngx_mutex_unlock(ngx_crypt_mutex);
! 99: #endif
! 100:
! 101: ngx_log_error(NGX_LOG_CRIT, pool->log, err, "crypt() failed");
! 102:
! 103: return NGX_ERROR;
! 104: }
! 105:
! 106: #endif
! 107:
! 108: #endif /* NGX_CRYPT */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>