Newer
Older
/* Synchronet C-exported statistics retrieval functions */
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright Rob Swindell - http://www.synchro.net/copyright.html *
* *
* 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 2 *
* of the License, or (at your option) any later version. *
* See the GNU General Public License for more details: gpl.txt or *
* http://www.fsf.org/copyleft/gpl.html *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#include "getstats.h"
#include "nopen.h"
#include "smblib.h"
/****************************************************************************/
/* Reads data from dsts.dab into stats structure */
/* If node is zero, reads from ctrl\dsts.dab, otherwise from each node */
/****************************************************************************/
BOOL DLLCALL getstats(scfg_t* cfg, char node, stats_t* stats)
{
char str[MAX_PATH+1];
int file;
sprintf(str,"%sdsts.dab",node ? cfg->node_path[node-1] : cfg->ctrl_dir);
if((file=nopen(str,O_RDONLY))==-1) {
return(FALSE);
}
lseek(file,4L,SEEK_SET); /* Skip update time/date */
/* TODO: Direct read of unpacked struct */
read(file,stats,sizeof(stats_t));
close(file);
return(TRUE);
}
/****************************************************************************/
/* Returns the number of files in the directory 'dirnum' */
/****************************************************************************/
long DLLCALL getfiles(scfg_t* cfg, uint dirnum)
{
char str[256];
long l;
if(dirnum>=cfg->total_dirs) /* out of range */
return(0);
sprintf(str,"%s%s.ixb",cfg->dir[dirnum]->data_dir, cfg->dir[dirnum]->code);
l=(long)flength(str);
if(l>0L)
return(l/F_IXBSIZE);
return(0);
}
/****************************************************************************/
/* Returns total number of posts in a sub-board */
/****************************************************************************/
ulong DLLCALL getposts(scfg_t* cfg, uint subnum)
{

Rob Swindell
committed
if(cfg->sub[subnum]->misc & SUB_NOVOTING) {
char path[MAX_PATH + 1];
off_t l;

Rob Swindell
committed
SAFEPRINTF2(path, "%s%s.sid", cfg->sub[subnum]->data_dir, cfg->sub[subnum]->code);
l = flength(path);
if(l < sizeof(idxrec_t))
return 0;
return l / sizeof(idxrec_t);
}
smb_t smb = {{0}};
SAFEPRINTF2(smb.file, "%s%s", cfg->sub[subnum]->data_dir, cfg->sub[subnum]->code);
smb.retry_time = cfg->smb_retry_time;
smb.subnum = subnum;
if(smb_open_index(&smb) != SMB_SUCCESS)
return 0;
size_t result = smb_msg_count(&smb, (1 << SMB_MSG_TYPE_NORMAL) | (1 << SMB_MSG_TYPE_POLL));
smb_close(&smb);
return result;
BOOL inc_sys_upload_stats(scfg_t* cfg, ulong files, ulong bytes)
{
char str[MAX_PATH+1];
int file;
uint32_t val;
if((file=nopen(str,O_RDWR))==-1)
return(FALSE);
(void)lseek(file,20L,SEEK_SET); /* Skip timestamp, logons and logons today */
(void)read(file,&val,4); /* Uploads today */
val+=files;
(void)lseek(file,-4L,SEEK_CUR);
(void)write(file,&val,4);
(void)read(file,&val,4); /* Upload bytes today */
val+=bytes;
(void)lseek(file,-4L,SEEK_CUR);
(void)write(file,&val,4);
close(file);
return(TRUE);
}
BOOL inc_sys_download_stats(scfg_t* cfg, ulong files, ulong bytes)
{
char str[MAX_PATH+1];
int file;
uint32_t val;
if((file=nopen(str,O_RDWR))==-1)
return(FALSE);
(void)lseek(file,28L,SEEK_SET); /* Skip timestamp, logons and logons today */
(void)read(file,&val,4); /* Downloads today */
val+=files;
(void)lseek(file,-4L,SEEK_CUR);
(void)write(file,&val,4);
(void)read(file,&val,4); /* Download bytes today */
val+=bytes;
(void)lseek(file,-4L,SEEK_CUR);
(void)write(file,&val,4);
close(file);
return(TRUE);
}