|  | 
 | /* | 
 |  * 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 errstr; | 
 |     } | 
 |  | 
 |     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 errstr; | 
 |     } | 
 |  | 
 |     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 |