~ubuntu-branches/ubuntu/trusty/nginx/trusty-proposed

« back to all changes in this revision

Viewing changes to src/os/unix/ngx_errno.c

  • Committer: Package Import Robot
  • Author(s): Kartik Mistry
  • Date: 2013-04-25 12:51:45 UTC
  • mfrom: (1.3.28)
  • mto: (1.3.29) (15.1.2 experimental)
  • mto: This revision was merged to the branch mainline in revision 64.
  • Revision ID: package-import@ubuntu.com-20130425125145-ugl0wor6bq0u5eae
Tags: upstream-1.4.0
ImportĀ upstreamĀ versionĀ 1.4.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
 
2
2
/*
3
3
 * Copyright (C) Igor Sysoev
 
4
 * Copyright (C) Nginx, Inc.
4
5
 */
5
6
 
6
7
 
8
9
#include <ngx_core.h>
9
10
 
10
11
 
11
 
#if (NGX_HAVE_STRERROR_R)
12
 
 
13
 
u_char *ngx_strerror_r(int err, u_char *errstr, size_t size)
14
 
{
15
 
    if (size == 0) {
16
 
        return 0;
17
 
    }
18
 
 
19
 
    errstr[0] = '\0';
20
 
 
21
 
    strerror_r(err, (char *) errstr, size);
22
 
 
23
 
    while (*errstr && size) {
24
 
        errstr++;
25
 
        size--;
26
 
    }
27
 
 
28
 
    return errstr;
29
 
}
30
 
 
31
 
#elif (NGX_HAVE_GNU_STRERROR_R)
32
 
 
33
 
/* Linux strerror_r() */
34
 
 
35
 
u_char *ngx_strerror_r(int err, u_char *errstr, size_t size)
36
 
{
37
 
    char  *str;
38
 
 
39
 
    if (size == 0) {
40
 
        return 0;
41
 
    }
42
 
 
43
 
    errstr[0] = '\0';
44
 
 
45
 
    str = strerror_r(err, (char *) errstr, size);
46
 
 
47
 
    if (str != (char *) errstr) {
48
 
        return ngx_cpystrn(errstr, (u_char *) str, size);
49
 
    }
50
 
 
51
 
    while (*errstr && size) {
52
 
        errstr++;
53
 
        size--;
54
 
    }
55
 
 
56
 
    return errstr;
57
 
}
58
 
 
59
 
#endif
 
12
/*
 
13
 * The strerror() messages are copied because:
 
14
 *
 
15
 * 1) strerror() and strerror_r() functions are not Async-Signal-Safe,
 
16
 *    therefore, they cannot be used in signal handlers;
 
17
 *
 
18
 * 2) a direct sys_errlist[] array may be used instead of these functions,
 
19
 *    but Linux linker warns about its usage:
 
20
 *
 
21
 * warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead
 
22
 * warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead
 
23
 *
 
24
 *    causing false bug reports.
 
25
 */
 
26
 
 
27
 
 
28
static ngx_str_t  *ngx_sys_errlist;
 
29
static ngx_str_t   ngx_unknown_error = ngx_string("Unknown error");
 
30
 
 
31
 
 
32
u_char *
 
33
ngx_strerror(ngx_err_t err, u_char *errstr, size_t size)
 
34
{
 
35
    ngx_str_t  *msg;
 
36
 
 
37
    msg = ((ngx_uint_t) err < NGX_SYS_NERR) ? &ngx_sys_errlist[err]:
 
38
                                              &ngx_unknown_error;
 
39
    size = ngx_min(size, msg->len);
 
40
 
 
41
    return ngx_cpymem(errstr, msg->data, size);
 
42
}
 
43
 
 
44
 
 
45
ngx_int_t
 
46
ngx_strerror_init(void)
 
47
{
 
48
    char       *msg;
 
49
    u_char     *p;
 
50
    size_t      len;
 
51
    ngx_err_t   err;
 
52
 
 
53
    /*
 
54
     * ngx_strerror() is not ready to work at this stage, therefore,
 
55
     * malloc() is used and possible errors are logged using strerror().
 
56
     */
 
57
 
 
58
    len = NGX_SYS_NERR * sizeof(ngx_str_t);
 
59
 
 
60
    ngx_sys_errlist = malloc(len);
 
61
    if (ngx_sys_errlist == NULL) {
 
62
        goto failed;
 
63
    }
 
64
 
 
65
    for (err = 0; err < NGX_SYS_NERR; err++) {
 
66
        msg = strerror(err);
 
67
        len = ngx_strlen(msg);
 
68
 
 
69
        p = malloc(len);
 
70
        if (p == NULL) {
 
71
            goto failed;
 
72
        }
 
73
 
 
74
        ngx_memcpy(p, msg, len);
 
75
        ngx_sys_errlist[err].len = len;
 
76
        ngx_sys_errlist[err].data = p;
 
77
    }
 
78
 
 
79
    return NGX_OK;
 
80
 
 
81
failed:
 
82
 
 
83
    err = errno;
 
84
    ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len, err, strerror(err));
 
85
 
 
86
    return NGX_ERROR;
 
87
}