diff options
Diffstat (limited to 'libblkid/lib/readutmp.c')
-rw-r--r-- | libblkid/lib/readutmp.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/libblkid/lib/readutmp.c b/libblkid/lib/readutmp.c new file mode 100644 index 000000000..b11e9a4d2 --- /dev/null +++ b/libblkid/lib/readutmp.c @@ -0,0 +1,78 @@ +/* GNU's read utmp module. + + Copyright (C) 1992-2001, 2003-2006, 2009-2014 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +/* Written by jla; revised by djm */ +/* extracted for util-linux by ooprala */ + +#include <errno.h> +#include <stdio.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <signal.h> +#include <stdbool.h> +#include <string.h> +#include <stdlib.h> +#include <stdint.h> + +#include "xalloc.h" +#include "readutmp.h" + +/* Read the utmp entries corresponding to file FILE into freshly- + malloc'd storage, set *UTMP_BUF to that pointer, set *N_ENTRIES to + the number of entries, and return zero. If there is any error, + return -1, setting errno, and don't modify the parameters. + If OPTIONS & READ_UTMP_CHECK_PIDS is nonzero, omit entries whose + process-IDs do not currently exist. */ +int +read_utmp (char const *file, size_t *n_entries, struct utmp **utmp_buf) +{ + size_t n_read = 0; + size_t n_alloc = 0; + struct utmp *utmp = NULL; + struct utmp *u; + + /* Ignore the return value for now. + Solaris' utmpname returns 1 upon success -- which is contrary + to what the GNU libc version does. In addition, older GNU libc + versions are actually void. */ + utmpname(file); + + setutent(); + + errno = 0; + while ((u = getutent()) != NULL) { + if (n_read == n_alloc) { + n_alloc += 32; + utmp = xrealloc(utmp, n_alloc * sizeof (struct utmp)); + if (!utmp) + return -1; + } + utmp[n_read++] = *u; + } + if (!u && errno) { + free(utmp); + return -1; + } + + endutent(); + + *n_entries = n_read; + *utmp_buf = utmp; + + return 0; +} |