Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ngx_errno.c
Go to the documentation of this file.
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  * 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 
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 }