X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fusers.c;h=cd3c01e83a3da5511b32f4bf2242784b51e3b39c;hb=6526b47b2c63c9f46b63d3a5e72cbe71b04d60ac;hp=cc8b67da049747b67cf709c35341cbea1f079978;hpb=934c3a94e85c4cc98c58903e35dc2001be714e0e;p=monky diff --git a/src/users.c b/src/users.c index cc8b67d..cd3c01e 100644 --- a/src/users.c +++ b/src/users.c @@ -1,4 +1,7 @@ -/* Conky, a system monitor, based on torsmo +/* -*- mode: c; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: t -*- + * vim: ts=4 sw=4 noet ai cindent syntax=c + * + * Conky, a system monitor, based on torsmo * * Any original torsmo code is licensed under the BSD license * @@ -7,7 +10,7 @@ * Please see COPYING for details * * Copyright (c) 2004, Hannu Saransaari and Lauri Hakkarainen - * Copyright (c) 2005-2007 Brenden Matthews, Philip Kovacs, et. al. + * Copyright (c) 2005-2010 Brenden Matthews, Philip Kovacs, et. al. * (see AUTHORS) * All rights reserved. * @@ -23,16 +26,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . * - * $Id$ - * */ #include "conky.h" #include -#include -#include -#include #include +#include + +#define BUFLEN 512 static void user_name(char *ptr) { @@ -41,7 +42,9 @@ static void user_name(char *ptr) setutent(); while ((usr = getutent()) != NULL) { if (usr->ut_type == USER_PROCESS) { - strncat(ptr, usr->ut_name, 9); + if (strlen(ptr) + strlen(usr->ut_name) + 1 <= BUFLEN) { + strncat(ptr, usr->ut_name, UT_NAMESIZE); + } } } } @@ -65,42 +68,52 @@ static void user_term(char *ptr) setutent(); while ((usr = getutent()) != NULL) { if (usr->ut_type == USER_PROCESS) { - strncat(ptr, usr->ut_line, 13); + if (strlen(ptr) + strlen(usr->ut_line) + 1 <= BUFLEN) { + strncat(ptr, usr->ut_line, UT_LINESIZE); + } } } } static void user_time(char *ptr) { const struct utmp *usr; - time_t login, real, diff; - struct tm *dtime; - char buf[512] = ""; + time_t log_in, real, diff; + char buf[BUFLEN] = ""; setutent(); while ((usr = getutent()) != NULL) { if (usr->ut_type == USER_PROCESS) { - login = usr->ut_time; + log_in = usr->ut_time; time(&real); - diff = difftime(real, login); - dtime = localtime(&diff); - dtime->tm_year = dtime->tm_year - 70; - dtime->tm_mon = dtime->tm_mon - 1; - dtime->tm_mday = dtime->tm_mday - 1; - if (dtime->tm_year > 0) { - strftime(buf, 512, "%yy %mm %dd %Hh %Mm", dtime); - } else if (dtime->tm_mon > 0) { - strftime(buf, 512, "%mm %dd %Hh %Mm", dtime); - } else if (dtime->tm_mday > 0) { - strftime(buf, 512, "%dd %Hh %Mm", dtime); - } else if (dtime->tm_hour > 0) { - strftime(buf, 512, "%Hh %Mm", dtime); - } else if (dtime->tm_min > 0) { - strftime(buf, 512, "%Mm", dtime); + diff = difftime(real, log_in); + format_seconds(buf, BUFLEN, diff); + if (strlen(ptr) + strlen(buf) + 1 <= BUFLEN) { + strncat(ptr, buf, BUFLEN-strlen(ptr)-1); } - strncat(ptr, buf, 512); } } } +static void tty_user_time(char *ptr, char *tty) +{ + time_t real, diff, log_in; + char buf[BUFLEN] = ""; + + struct utmp *usr, line; + + setutent(); + strcpy(line.ut_line, tty); + usr = getutline(&line); + if (usr == NULL ) { + return; + } + + log_in = usr->ut_time; + + time(&real); + diff = difftime(real, log_in); + format_seconds(buf, BUFLEN, diff); + strncpy(ptr, buf, BUFLEN-1); +} static void users_alloc(struct information *ptr) { @@ -116,10 +129,38 @@ static void users_alloc(struct information *ptr) } } -void update_users() +void update_user_time(char *tty) +{ + struct information *current_info = &info; + char temp[BUFLEN] = ""; + + if (current_info->users.ctime == NULL) { + current_info->users.ctime = malloc(text_buffer_size); + } + + tty_user_time(temp, tty); + + if (temp != NULL) { + if (current_info->users.ctime) { + free(current_info->users.ctime); + current_info->users.ctime = 0; + } + current_info->users.ctime = malloc(text_buffer_size); + strncpy(current_info->users.ctime, temp, text_buffer_size); + } else { + if (current_info->users.ctime) { + free(current_info->users.ctime); + current_info->users.ctime = 0; + } + current_info->users.ctime = malloc(text_buffer_size); + strncpy(current_info->users.ctime, "broken", text_buffer_size); + } +} + +void update_users(void) { struct information *current_info = &info; - char temp[512] = ""; + char temp[BUFLEN] = ""; int t; users_alloc(current_info); user_name(temp);