The unpac monorepo manager self-hosting as a monorepo using unpac
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Use POSIX thread-safe getlogin_r

+41 -5
+2
configure
··· 3169 3169 as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" 3170 3170 as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" 3171 3171 as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" 3172 + as_fn_append ac_func_c_list " getlogin_r HAVE_GETLOGIN_R" 3172 3173 as_fn_append ac_func_c_list " getgrnam_r HAVE_GETGRNAM_R" 3173 3174 as_fn_append ac_func_c_list " getgrgid_r HAVE_GETGRGID_R" 3174 3175 as_fn_append ac_func_c_list " getpwnam_r HAVE_GETPWNAM_R" ··· 21146 21147 ac_func=$ac_item 21147 21148 fi 21148 21149 done 21150 + 21149 21151 21150 21152 21151 21153
+1 -1
configure.ac
··· 2362 2362 AC_DEFINE([HAS_WAIT4], [1]) 2363 2363 ]) 2364 2364 2365 - AC_CHECK_FUNCS_ONCE([getgrnam_r getgrgid_r getpwnam_r getpwuid_r]) 2365 + AC_CHECK_FUNCS_ONCE([getlogin_r getgrnam_r getgrgid_r getpwnam_r getpwuid_r]) 2366 2366 2367 2367 ## getgroups 2368 2368 AC_CHECK_FUNC([getgroups], [AC_DEFINE([HAS_GETGROUPS], [1])])
+38 -4
otherlibs/unix/getlogin.c
··· 13 13 /* */ 14 14 /**************************************************************************/ 15 15 16 - #include <caml/mlvalues.h> 17 16 #include <caml/alloc.h> 18 17 #include "caml/unixsupport.h" 18 + #include <limits.h> 19 + #include <unistd.h> 19 20 #include <errno.h> 20 21 21 - extern char * getlogin(void); 22 + #define CAML_LOGIN_NAME_MAX (256 * 4) 22 23 23 24 CAMLprim value caml_unix_getlogin(value unit) 24 25 { 26 + value res; 25 27 char * name; 28 + #ifdef HAVE_GETLOGIN_R 29 + size_t bufsize; 30 + #ifdef LOGIN_NAME_MAX 31 + bufsize = LOGIN_NAME_MAX; 32 + #else 33 + long initlen = sysconf(_SC_LOGIN_NAME_MAX); 34 + bufsize = initlen <= 0 ? _POSIX_LOGIN_NAME_MAX : (size_t) initlen; 35 + #endif 36 + name = caml_stat_alloc_noexc(bufsize); 37 + if (name == NULL) 38 + caml_unix_error(ENOMEM, "getlogin", Nothing); 39 + int e; 40 + while ((e = getlogin_r(name, bufsize)) == ERANGE) { 41 + bufsize *= 2; 42 + char *newname; 43 + if (bufsize > CAML_LOGIN_NAME_MAX || 44 + (newname = caml_stat_realloc(name)) == NULL) { 45 + caml_stat_free(name); 46 + caml_unix_error(ENOMEM, "getlogin", Nothing); 47 + } 48 + name = newname; 49 + } 50 + if (e != 0) { 51 + caml_stat_free(name); 52 + #else 26 53 name = getlogin(); 27 - if (name == NULL) caml_unix_error(ENOENT, "getlogin", Nothing); 28 - return caml_copy_string(name); 54 + if (name == NULL) { 55 + #endif 56 + caml_unix_error(ENOENT, "getlogin", Nothing); 57 + } 58 + res = caml_copy_string(name); 59 + #ifdef HAVE_GETLOGIN_R 60 + caml_stat_free(name); 61 + #endif 62 + return res; 29 63 }