summaryrefslogtreecommitdiff
path: root/source3/smbd/utmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/smbd/utmp.c')
-rw-r--r--source3/smbd/utmp.c63
1 files changed, 46 insertions, 17 deletions
diff --git a/source3/smbd/utmp.c b/source3/smbd/utmp.c
index f79cd43c5b..cc52db8462 100644
--- a/source3/smbd/utmp.c
+++ b/source3/smbd/utmp.c
@@ -127,7 +127,7 @@ Notes:
#endif
/****************************************************************************
-obtain/release a small number (0 upwards) unique within and across smbds
+ Obtain/release a small number (0 upwards) unique within and across smbds.
****************************************************************************/
/*
* Need a "small" number to represent this connection, unique within this
@@ -154,8 +154,9 @@ obtain/release a small number (0 upwards) unique within and across smbds
*/
/****************************************************************************
-Default paths to various {u,w}tmp{,x} files
+ Default paths to various {u,w}tmp{,x} files.
****************************************************************************/
+
#ifdef HAVE_UTMPX_H
static const char *ux_pathname =
@@ -260,9 +261,11 @@ static void uw_pathname(pstring fname, const char *uw_name, const char *uw_defau
}
#ifndef HAVE_PUTUTLINE
+
/****************************************************************************
-Update utmp file directly. No subroutine interface: probably a BSD system.
+ Update utmp file directly. No subroutine interface: probably a BSD system.
****************************************************************************/
+
static void pututline_my(pstring uname, struct utmp *u, BOOL claim)
{
DEBUG(1,("pututline_my: not yet implemented\n"));
@@ -271,10 +274,12 @@ static void pututline_my(pstring uname, struct utmp *u, BOOL claim)
#endif /* HAVE_PUTUTLINE */
#ifndef HAVE_UPDWTMP
+
/****************************************************************************
-Update wtmp file directly. No subroutine interface: probably a BSD system.
-Credit: Michail Vidiassov <master@iaas.msu.ru>
+ Update wtmp file directly. No subroutine interface: probably a BSD system.
+ Credit: Michail Vidiassov <master@iaas.msu.ru>
****************************************************************************/
+
static void updwtmp_my(pstring wname, struct utmp *u, BOOL claim)
{
int fd;
@@ -311,8 +316,9 @@ static void updwtmp_my(pstring wname, struct utmp *u, BOOL claim)
#endif /* HAVE_UPDWTMP */
/****************************************************************************
-Update via utmp/wtmp (not utmpx/wtmpx)
+ Update via utmp/wtmp (not utmpx/wtmpx).
****************************************************************************/
+
static void utmp_nox_update(struct utmp *u, const char *host, BOOL claim)
{
pstring uname, wname;
@@ -369,8 +375,26 @@ static void utmp_nox_update(struct utmp *u, const char *host, BOOL claim)
}
/****************************************************************************
-Update via utmpx/wtmpx (preferred) or via utmp/wtmp
+ Copy a string in the utmp structure.
****************************************************************************/
+
+static void utmp_strcpy(char *dest, const char *src, size_t n)
+{
+ size_t len;
+
+ len = strlen(src);
+ if (len >= n) {
+ memcpy(dest, src, n);
+ } else {
+ memcpy(dest, src, len);
+ memset(dest + len, '\0', n - len);
+ }
+}
+
+/****************************************************************************
+ Update via utmpx/wtmpx (preferred) or via utmp/wtmp.
+****************************************************************************/
+
static void sys_utmp_update(struct utmp *u, const char *hostname, BOOL claim)
{
#if !defined(HAVE_UTMPX_H)
@@ -391,10 +415,12 @@ static void sys_utmp_update(struct utmp *u, const char *hostname, BOOL claim)
getutmpx(u, &ux);
#if defined(HAVE_UX_UT_SYSLEN)
- if (hostname) ux.ut_syslen = strlen(hostname) + 1; /* include end NULL */
- else ux.ut_syslen = 0;
+ if (hostname)
+ ux.ut_syslen = strlen(hostname) + 1; /* include end NULL */
+ else
+ ux.ut_syslen = 0;
#endif
- safe_strcpy(ux.ut_host, hostname, sizeof(ux.ut_host)-1);
+ utmp_strcpy(ux.ut_host, hostname, sizeof(ux.ut_host));
uw_pathname(uname, "utmpx", ux_pathname);
uw_pathname(wname, "wtmpx", wx_pathname);
@@ -424,8 +450,9 @@ static void sys_utmp_update(struct utmp *u, const char *hostname, BOOL claim)
#if defined(HAVE_UT_UT_ID)
/****************************************************************************
-encode the unique connection number into "ut_id"
+ Encode the unique connection number into "ut_id".
****************************************************************************/
+
static int ut_id_encode(int i, char *fourbyte)
{
int nbase;
@@ -467,9 +494,9 @@ static BOOL sys_utmp_fill(struct utmp *u,
* rather than to try to detect and optimise.
*/
#if defined(HAVE_UT_UT_USER)
- safe_strcpy(u->ut_user, username, sizeof(u->ut_user)-1);
+ utmp_strcpy(u->ut_user, username, sizeof(u->ut_user));
#elif defined(HAVE_UT_UT_NAME)
- safe_strcpy(u->ut_name, username, sizeof(u->ut_name)-1);
+ utmp_strcpy(u->ut_name, username, sizeof(u->ut_name));
#endif
/*
@@ -485,7 +512,7 @@ static BOOL sys_utmp_fill(struct utmp *u,
id_str, sizeof(u->ut_line)));
return False;
}
- memcpy(u->ut_line, id_str, sizeof(u->ut_line));
+ utmp_strcpy(u->ut_line, id_str, sizeof(u->ut_line));
#if defined(HAVE_UT_UT_PID)
u->ut_pid = sys_getpid();
@@ -508,7 +535,7 @@ static BOOL sys_utmp_fill(struct utmp *u,
#endif
#if defined(HAVE_UT_UT_HOST)
- safe_strcpy(u->ut_host, hostname, sizeof(u->ut_host)-1);
+ utmp_strcpy(u->ut_host, hostname, sizeof(u->ut_host));
#endif
#if defined(HAVE_UT_UT_ADDR)
@@ -529,8 +556,9 @@ static BOOL sys_utmp_fill(struct utmp *u,
}
/****************************************************************************
-close a connection
+ Close a connection.
****************************************************************************/
+
void sys_utmp_yield(const char *username, const char *hostname,
const char *id_str, int id_num)
{
@@ -553,8 +581,9 @@ void sys_utmp_yield(const char *username, const char *hostname,
}
/****************************************************************************
-claim a entry in whatever utmp system the OS uses
+ Claim a entry in whatever utmp system the OS uses.
****************************************************************************/
+
void sys_utmp_claim(const char *username, const char *hostname,
const char *id_str, int id_num)
{