#ifdef HAVE_UTMPX_H
-static const char *ux_pathname =
+static const char * const ux_pathname =
# if defined (UTMPX_FILE)
UTMPX_FILE ;
# elif defined (_UTMPX_FILE)
"" ;
# endif
-static const char *wx_pathname =
+static const char * const wx_pathname =
# if defined (WTMPX_FILE)
WTMPX_FILE ;
# elif defined (_WTMPX_FILE)
#endif /* HAVE_UTMPX_H */
-static const char *ut_pathname =
+static const char * const ut_pathname =
# if defined (UTMP_FILE)
UTMP_FILE ;
# elif defined (_UTMP_FILE)
"" ;
# endif
-static const char *wt_pathname =
+static const char * const wt_pathname =
# if defined (WTMP_FILE)
WTMP_FILE ;
# elif defined (_WTMP_FILE)
# endif
/* BSD-like systems might want "lastlog" support. */
-/* *** Not yet implemented */
+#if 0 /* *** Not yet implemented */
#ifndef HAVE_PUTUTLINE /* see "pututline_my()" */
static const char *ll_pathname =
# if defined (_PATH_LASTLOG) /* what other names (if any?) */
"" ;
# endif /* _PATH_LASTLOG */
#endif /* HAVE_PUTUTLINE */
+#endif
/*
* Get name of {u,w}tmp{,x} file.
* utmp{,x}: try "utmp dir", then default (a define)
* wtmp{,x}: try "wtmp dir", then "utmp dir", then default (a define)
*/
-static void uw_pathname(pstring fname, const char *uw_name, const char *uw_default)
+static char *uw_pathname(TALLOC_CTX *ctx,
+ const char *uw_name,
+ const char *uw_default)
{
- pstring dirname;
-
- pstrcpy(dirname, "");
+ char *dirname = NULL;
/* For w-files, first look for explicit "wtmp dir" */
if (uw_name[0] == 'w') {
- pstrcpy(dirname,lp_wtmpdir());
+ dirname = talloc_strdup(ctx, lp_wtmpdir());
+ if (!dirname) {
+ return NULL;
+ }
trim_char(dirname,'\0','/');
}
/* For u-files and non-explicit w-dir, look for "utmp dir" */
- if (dirname == 0 || strlen(dirname) == 0) {
- pstrcpy(dirname,lp_utmpdir());
+ if ((dirname == NULL) || (strlen(dirname) == 0)) {
+ dirname = talloc_strdup(ctx, lp_utmpdir());
+ if (!dirname) {
+ return NULL;
+ }
trim_char(dirname,'\0','/');
}
/* If explicit directory above, use it */
- if (dirname != 0 && strlen(dirname) != 0) {
- pstrcpy(fname, dirname);
- pstrcat(fname, "/");
- pstrcat(fname, uw_name);
- return;
+ if (dirname && strlen(dirname) != 0) {
+ return talloc_asprintf(ctx,
+ "%s/%s",
+ dirname,
+ uw_name);
}
/* No explicit directory: attempt to use default paths */
*/
DEBUG(2,("uw_pathname: unable to determine pathname\n"));
}
- pstrcpy(fname, uw_default);
+ return talloc_strdup(ctx, uw_default);
}
#ifndef HAVE_PUTUTLINE
-
/****************************************************************************
Update utmp file directly. No subroutine interface: probably a BSD system.
****************************************************************************/
-static void pututline_my(pstring uname, struct utmp *u, bool claim)
+static void pututline_my(const char *uname, struct utmp *u, bool claim)
{
DEBUG(1,("pututline_my: not yet implemented\n"));
/* BSD implementor: may want to consider (or not) adjusting "lastlog" */
Credit: Michail Vidiassov <master@iaas.msu.ru>
****************************************************************************/
-static void updwtmp_my(pstring wname, struct utmp *u, bool claim)
+static void updwtmp_my(const char *wname, struct utmp *u, bool claim)
{
int fd;
struct stat buf;
static void utmp_nox_update(struct utmp *u, bool claim)
{
- pstring uname, wname;
+ char *uname = NULL;
+ char *wname = NULL;
#if defined(PUTUTLINE_RETURNS_UTMP)
struct utmp *urc;
#endif /* PUTUTLINE_RETURNS_UTMP */
- uw_pathname(uname, "utmp", ut_pathname);
+ uname = uw_pathname(talloc_tos(), "utmp", ut_pathname);
+ if (!uname) {
+ return;
+ }
DEBUG(2,("utmp_nox_update: uname:%s\n", uname));
#ifdef HAVE_PUTUTLINE
}
#endif /* HAVE_PUTUTLINE */
- uw_pathname(wname, "wtmp", wt_pathname);
+ wname = uw_pathname(talloc_tos(), "wtmp", wt_pathname);
+ if (!wname) {
+ return;
+ }
DEBUG(2,("utmp_nox_update: wname:%s\n", wname));
if (strlen(wname) != 0) {
#ifdef HAVE_UPDWTMP
/* Odd. Have utmpx.h but no "getutmpx()". Drop to non-x stuff */
DEBUG(1,("utmp_update: have utmpx.h but no getutmpx() function\n"));
utmp_nox_update(u, claim);
+#elif !defined(HAVE_UPDWTMPX)
+ /* Have utmpx.h but no "updwtmpx()". Drop to non-x stuff */
+ DEBUG(1,("utmp_update: have utmpx.h but no updwtmpx() function\n"));
+ utmp_nox_update(u, claim);
#else
- pstring uname, wname;
+ char *uname = NULL;
+ char *wname = NULL;
struct utmpx ux, *uxrc;
getutmpx(u, &ux);
utmp_strcpy(ux.ut_host, hostname, sizeof(ux.ut_host));
#endif
- uw_pathname(uname, "utmpx", ux_pathname);
- uw_pathname(wname, "wtmpx", wx_pathname);
- DEBUG(2,("utmp_update: uname:%s wname:%s\n", uname, wname));
+ uname = uw_pathname(talloc_tos(), "utmpx", ux_pathname);
+ wname = uw_pathname(talloc_tos(), "wtmpx", wx_pathname);
+ if (uname && wname) {
+ DEBUG(2,("utmp_update: uname:%s wname:%s\n", uname, wname));
+ }
+
/*
* Check for either uname or wname being empty.
* Some systems, such as Redhat 6, have a "utmpx.h" which doesn't
* Also, our local installation has not provided an override.
* Drop to non-x method. (E.g. RH6 has good defaults in "utmp.h".)
*/
- if ((strlen(uname) == 0) || (strlen(wname) == 0)) {
+ if (!uname || !wname || (strlen(uname) == 0) || (strlen(wname) == 0)) {
utmp_nox_update(u, claim);
} else {
utmpxname(uname);