|  |  | 
|  | /* | 
|  | * Copyright (C) Igor Sysoev | 
|  | */ | 
|  |  | 
|  |  | 
|  | #include <ngx_config.h> | 
|  | #include <ngx_core.h> | 
|  |  | 
|  |  | 
|  | #if (NGX_HAVE_STRERROR_R) | 
|  |  | 
|  | u_char *ngx_strerror_r(int err, u_char *errstr, size_t size) | 
|  | { | 
|  | if (size == 0) { | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | errstr[0] = '\0'; | 
|  |  | 
|  | strerror_r(err, (char *) errstr, size); | 
|  |  | 
|  | while (*errstr && size) { | 
|  | errstr++; | 
|  | size--; | 
|  | } | 
|  |  | 
|  | return errstr; | 
|  | } | 
|  |  | 
|  | #elif (NGX_HAVE_GNU_STRERROR_R) | 
|  |  | 
|  | /* Linux strerror_r() */ | 
|  |  | 
|  | u_char *ngx_strerror_r(int err, u_char *errstr, size_t size) | 
|  | { | 
|  | char  *str; | 
|  |  | 
|  | if (size == 0) { | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | errstr[0] = '\0'; | 
|  |  | 
|  | str = strerror_r(err, (char *) errstr, size); | 
|  |  | 
|  | if (str != (char *) errstr) { | 
|  | return ngx_cpystrn(errstr, (u_char *) str, size); | 
|  | } | 
|  |  | 
|  | while (*errstr && size) { | 
|  | errstr++; | 
|  | size--; | 
|  | } | 
|  |  | 
|  | return errstr; | 
|  | } | 
|  |  | 
|  | #endif |