mars-nwe/tools.c

215 lines
5.0 KiB
C

/* tools.c 18-Nov-95 */
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
*
* 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.
*
* 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, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "net.h"
#include <stdarg.h>
#include <sys/vfs.h>
int nw_debug=0;
char *xmalloc(uint size)
{
char *p = (size) ? (char *)malloc(size) : (char*)NULL;
if (p == (char *)NULL && size){
fprintf(stderr, "not enough core, need %d Bytes\n", size);
exit(1);
}
return(p);
}
void x_x_xfree(char **p)
{
if (*p != (char *)NULL){
free(*p);
*p = (char*)NULL;
}
}
int strmaxcpy(char *dest, char *source, int len)
{
int slen = (source != (char *)NULL) ? min(len, strlen(source)) : 0;
if (slen) memcpy(dest, source, slen);
dest[slen] = '\0';
return(slen);
}
int x_x_xnewstr(uint8 **p, uint8 *s)
{
int len = (s == NULL) ? 0 : strlen(s);
if (*p != (uint8 *)NULL) free((char*)*p);
*p = (uint8*)xmalloc(len+1);
if (len) strcpy((char*)(*p), (char*)s);
else **p = '\0';
return (len);
}
void dprintf(char *p, ...)
{
va_list ap;
if (nw_debug){
va_start(ap, p);
vprintf(p, ap);
va_end(ap);
fflush(stdout);
}
}
void xdprintf(int dlevel, char *p, ...)
{
va_list ap;
if (nw_debug >= dlevel) {
va_start(ap, p);
vprintf(p, ap);
va_end(ap);
fflush(stdout);
}
}
FILE *open_nw_ini(void)
{
char *fname=FILENAME_NW_INI;
FILE *f=fopen(fname, "r");
if (f == (FILE*)NULL) fprintf(stderr, "Cannot open ini file `%s`\n", fname);
return(f);
}
int get_ini_entry(FILE *f, int entry, char *str, int strsize)
/* liefert ini_entry zurueck bzw. 0, falls nichts gefunden */
{
char buff[512];
int do_open = ((FILE*) NULL == f);
if (do_open) f = open_nw_ini();
if ((FILE*) NULL != f) {
while (fgets((char*)buff, sizeof(buff), f) != NULL){
int len = strlen(buff);
char *ppi = NULL;
int se = 0;
int j = -1;
while (++j < len){
char *pp=(buff+j);
if (*pp == '#' || *pp == '\r' || *pp == '\n') {
*pp = '\0';
len = j;
break;
} else if ( *pp == 32 || *pp == '\t') {
if (!se) se = j;
} else if ((!ppi) && se) {
ppi = pp;
}
}
if (len > se+1 && se > 0 && se < 4 && ppi){
char sx[10];
int fentry;
strmaxcpy(sx, buff, se);
fentry = atoi(sx);
if (fentry > 0 && ((!entry) || entry == fentry)) {
strmaxcpy(str, ppi, strsize-1);
if (do_open) fclose(f);
return(fentry);
}
}
} /* while */
if (do_open) fclose(f);
}
return(0);
}
char *get_exec_path(char *buff, char *progname)
{
sprintf(buff, "%s/%s", PATHNAME_PROGS, progname);
return(buff);
}
void get_ini_debug(int what)
/* what:
* 1 = nwserv
* 2 = ncpserv
* 3 = nwconn
*/
{
char buff[10];
if (get_ini_entry(NULL, 100+what, buff, sizeof(buff))) {
int debug;
if (1==sscanf(buff, "%d", &debug)) nw_debug=debug;
}
}
uint8 down_char(uint8 ch)
{
if (ch > 64 && ch < 91) return(ch + 32);
switch(ch){
case 142: ch = 132; break;
case 153: ch = 148; break;
case 154: ch = 129; break;
default :break;
}
return(ch);
}
uint8 up_char(uint8 ch)
{
if (ch > 96 && ch < 123) return(ch - 32);
switch(ch) {
case 132: ch = 142; break;
case 148: ch = 153; break;
case 129: ch = 154; break;
default : break;
}
return(ch);
}
uint8 *upstr(uint8 *s)
{
if (!s) return((uint8*)NULL);
for (;*s;s++) *s=up_char(*s);
return(s);
}
uint8 *downstr(uint8 *s)
{
if (!s) return((uint8*)NULL);
for (;*s;s++) *s=down_char(*s);
return(s);
}
/* next is stolen from GNU-fileutils */
static long adjust_blocks (long blocks, int fromsize, int tosize)
{
if (fromsize == tosize) /* E.g., from 512 to 512. */
return blocks;
else if (fromsize > tosize) /* E.g., from 2048 to 512. */
return blocks * (fromsize / tosize);
else /* E.g., from 256 to 512. */
return (blocks + (blocks < 0 ? -1 : 1)) / (tosize / fromsize);
}
int get_fs_usage(char *path, struct fs_usage *fsp)
{
struct statfs fsd;
if (statfs (path, &fsd) < 0) return (-1);
#define convert_blocks(b) adjust_blocks ((b), fsd.f_bsize, 512)
fsp->fsu_blocks = convert_blocks (fsd.f_blocks);
fsp->fsu_bfree = convert_blocks (fsd.f_bfree);
fsp->fsu_bavail = convert_blocks (fsd.f_bavail);
fsp->fsu_files = fsd.f_files;
fsp->fsu_ffree = fsd.f_ffree;
return(0);
}