1 /* Provide a working getlogin_r for systems which lack it. 2 3 Copyright (C) 2005 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2, or (at your option) 8 any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software Foundation, 17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 18 19 /* written by Paul Eggert and Derek Price */ 20 21 #ifdef HAVE_CONFIG_H 22 # include <config.h> 23 #endif 24 25 #include "getlogin_r.h" 26 27 #include <errno.h> 28 #include <string.h> 29 30 #if HAVE_UNISTD_H 31 # include <unistd.h> 32 #endif 33 34 #if !HAVE_DECL_GETLOGIN 35 char *getlogin (void); 36 #endif 37 38 /* See getlogin_r.h for documentation. */ 39 int 40 getlogin_r (char *name, size_t size) 41 { 42 char *n; 43 size_t nlen; 44 45 errno = 0; 46 n = getlogin (); 47 48 /* A system function like getlogin_r is never supposed to set errno 49 to zero, so make sure errno is nonzero here. ENOENT is a 50 reasonable errno value if getlogin returns NULL. */ 51 if (!errno) 52 errno = ENOENT; 53 54 if (!n) 55 return errno; 56 nlen = strlen (n); 57 if (size <= nlen) 58 return ERANGE; 59 memcpy (name, n, nlen + 1); 60 return 0; 61 } 62