You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
337 lines
7.4 KiB
C
337 lines
7.4 KiB
C
/*
|
|
* binkleyforce -- unix FTN mailer project
|
|
*
|
|
* Copyright (c) 1998-2000 Alexander Belkin, 2:5020/1398.11
|
|
*
|
|
* 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.
|
|
*
|
|
* $Id$
|
|
*/
|
|
|
|
#include "includes.h"
|
|
#include "confread.h"
|
|
#include "logger.h"
|
|
#include "util.h"
|
|
|
|
/*
|
|
* Array of mask aliases, you may add new values if you need
|
|
*/
|
|
struct magfname {
|
|
const char *alias;
|
|
const char *masks;
|
|
} magfname[] = {
|
|
{ "netmail", "*.pkt *.out *.cut *.hut *.dut *.iut" },
|
|
{ "arcmail", "*.su? *.mo? *.tu? *.we? *.th? *.fr? *.sa?" },
|
|
{ "ticfile", "*.tic" },
|
|
{ "archive", "*.tgz *.bz2 *.zip *.rar *.arj *.lha *.ha" },
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Allocate memory, check for errors
|
|
*
|
|
* Arguments:
|
|
* size number of bytes to allocate
|
|
*
|
|
* Return value:
|
|
* Pointer to the allocated memory
|
|
*/
|
|
void *xmalloc(size_t size)
|
|
{
|
|
char *tmp;
|
|
|
|
if( size <= 0 )
|
|
{
|
|
log("requested to allocate %ld bytes", (long)size);
|
|
size = 1;
|
|
}
|
|
|
|
if( (tmp = (char *)malloc(size)) == NULL )
|
|
{
|
|
log("failed to allocate %ld bytes -> abort", (long)size);
|
|
abort();
|
|
}
|
|
|
|
return tmp;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
* Change the size of allready allocated memory
|
|
*
|
|
* Arguments:
|
|
* buf pointer to the memory block which size we want change
|
|
* size new block size
|
|
*
|
|
* Return value:
|
|
* Pointer to the reallocated memory
|
|
*/
|
|
void *xrealloc(void *buf, size_t size)
|
|
{
|
|
char *tmp;
|
|
|
|
if( size <= 0 )
|
|
{
|
|
tmp = NULL;
|
|
log("requested to reallocate %ld bytes", (long)size);
|
|
if( buf ) free(buf);
|
|
}
|
|
else if( (tmp = (char*)(buf ? realloc(buf, size) : malloc(size))) == NULL )
|
|
{
|
|
log("failed to reallocate %ld bytes -> abort", size);
|
|
abort();
|
|
}
|
|
|
|
return tmp;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
* Make copy of memory block
|
|
*
|
|
* Arguments:
|
|
* buffer pointer to the memory block which we want to duplicate
|
|
* size memory block size
|
|
*
|
|
* Return value:
|
|
* Pointer to the memory block copy (must be freed)
|
|
*/
|
|
void *xmemcpy(const void *buffer, size_t buflen)
|
|
{
|
|
void *ptr = xmalloc(buflen);
|
|
|
|
memcpy(ptr, buffer, buflen);
|
|
|
|
return ptr;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
* Compare string for matching to the mask. Special characters for the mask:
|
|
* '?' - any one chracter (except '\0');
|
|
* '*' - any group of chracters (including '\0');
|
|
* '\' - next chracter will be compared directly (including '?' and '*')
|
|
*
|
|
* Arguments:
|
|
* str pointer to the null-terminated string
|
|
* mask pointer to the null-terminated mask
|
|
*
|
|
* Return value:
|
|
* zero value if string matchs pattern, and non-zero if not
|
|
*/
|
|
int strcasemask(const char *str, const char *mask)
|
|
{
|
|
const char *s, *m;
|
|
char c;
|
|
|
|
ASSERT(str != NULL && mask != NULL);
|
|
|
|
s = str;
|
|
m = mask;
|
|
|
|
while( *s )
|
|
{
|
|
switch( c = *m++ ) {
|
|
case '\0':
|
|
return 1;
|
|
|
|
case '\\':
|
|
if( *m )
|
|
{
|
|
if( toupper(*m++) != toupper(*s++) )
|
|
return 1;
|
|
}
|
|
else if( *s++ == '\\' && *s == '\0' )
|
|
return 0;
|
|
else
|
|
return 1;
|
|
break;
|
|
|
|
case '?':
|
|
++s;
|
|
break;
|
|
|
|
case '*':
|
|
if( *m )
|
|
{
|
|
do {
|
|
/* anti stack overflow */
|
|
while( *m == '*' ) m++;
|
|
|
|
if( *m != '\\' && *m != '?' )
|
|
while( *s && toupper(*s) != toupper(*m) ) ++s;
|
|
|
|
if( *s && !strcasemask(s, m) )
|
|
return 0;
|
|
} while( *s++ );
|
|
|
|
return 1;
|
|
}
|
|
return 0;
|
|
|
|
default:
|
|
if( toupper(c) != toupper(*s++) )
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return( *s != '\0' || *m != '\0' );
|
|
}
|
|
|
|
/*****************************************************************************
|
|
* Check whether masks list (e.g. "*.zip *.rar *.tic") conforms to the file
|
|
* name. For the masks description look string_pattern() info.
|
|
*
|
|
* Arguments:
|
|
* masks pointer to the null-terminated masks list
|
|
* str pointer to the null-terminated file name
|
|
*
|
|
* Return value:
|
|
* non-zero value if file name match masks, and zero if not
|
|
*/
|
|
int checkmasks(const char *masks, const char *str)
|
|
{
|
|
int i = 0, not = 0;
|
|
char *p = NULL;
|
|
char *n = NULL;
|
|
char *strs;
|
|
int yield = 1;
|
|
|
|
ASSERT(masks != NULL && str != NULL);
|
|
|
|
strs = xstrcpy(masks);
|
|
|
|
for( p = string_token(strs, &n, NULL, 1); p;
|
|
p = string_token(NULL, &n, NULL, 1) )
|
|
{
|
|
DEB((D_INFO, "checkmasks: checking \"%s\" in \"%s\"", str, p));
|
|
|
|
not = ( p[0] == '!' );
|
|
|
|
if( not )
|
|
++p;
|
|
|
|
if( p[0] == '%' )
|
|
{
|
|
for( i = 0; magfname[i].alias; i++ )
|
|
if( strcasecmp(p+1, magfname[i].alias) == 0 )
|
|
{
|
|
if( !checkmasks(magfname[i].masks, str) )
|
|
{
|
|
free(strs);
|
|
return not;
|
|
}
|
|
else if( not )
|
|
yield = 0;
|
|
|
|
break;
|
|
}
|
|
}
|
|
else if( !strcasemask(str, p) )
|
|
{
|
|
free(strs);
|
|
return not;
|
|
}
|
|
else if( not )
|
|
yield = 0;
|
|
}
|
|
|
|
free(strs);
|
|
return yield;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
* Put long integer (4 bytes) to the buffer
|
|
*
|
|
* Arguments:
|
|
* buffer pointer to the destination buffer
|
|
* val value that we want put to the buffer
|
|
*
|
|
* Return value:
|
|
* Pointer to the specified buffer
|
|
*/
|
|
char *buffer_putlong(char *buffer, long val)
|
|
{
|
|
buffer[0] = ( ((unsigned long) val) ) & 0xff;
|
|
buffer[1] = ( ((unsigned long) val) >> 8 ) & 0xff;
|
|
buffer[2] = ( ((unsigned long) val) >> 16 ) & 0xff;
|
|
buffer[3] = ( ((unsigned long) val) >> 24 ) & 0xff;
|
|
|
|
return buffer;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
* Put integer (2 bytes) to the buffer
|
|
*
|
|
* Arguments:
|
|
* buffer pointer to the destination buffer
|
|
* val value that we want put to the buffer
|
|
*
|
|
* Return value:
|
|
* Pointer to the specified buffer
|
|
*/
|
|
char *buffer_putint(char *buffer, int val)
|
|
{
|
|
buffer[0] = ( ((unsigned int) val) ) & 0xff;
|
|
buffer[1] = ( ((unsigned int) val) >> 8 ) & 0xff;
|
|
|
|
return buffer;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
* Get long integer (4 bytes) from the buffer
|
|
*
|
|
* Arguments:
|
|
* buffer pointer to the buffer
|
|
*
|
|
* Return value:
|
|
* Extracted value
|
|
*/
|
|
long buffer_getlong(const char *buffer)
|
|
{
|
|
return ( (unsigned long) ((unsigned char) buffer[0]) )
|
|
| ( (unsigned long) ((unsigned char) buffer[1]) << 8 )
|
|
| ( (unsigned long) ((unsigned char) buffer[2]) << 16 )
|
|
| ( (unsigned long) ((unsigned char) buffer[3]) << 24 );
|
|
}
|
|
|
|
/*****************************************************************************
|
|
* Get integer (2 bytes) from the buffer
|
|
*
|
|
* Arguments:
|
|
* buffer pointer to the buffer
|
|
*
|
|
* Return value:
|
|
* Extracted value
|
|
*/
|
|
int buffer_getint(const char *buffer)
|
|
{
|
|
return ( (unsigned int) ((unsigned char) buffer[0]) )
|
|
| ( (unsigned int) ((unsigned char) buffer[1]) << 8 );
|
|
}
|
|
|
|
void printf_usage(const char *ident, const char *fmt, ...)
|
|
{
|
|
va_list args;
|
|
|
|
if( ident )
|
|
printf("%s %s %s\n\n", BF_BANNERVER, ident, BF_COPYRIGHT);
|
|
else
|
|
printf("%s %s\n\n", BF_BANNERVER, BF_COPYRIGHT);
|
|
|
|
if( fmt )
|
|
{
|
|
va_start(args, fmt);
|
|
vprintf(fmt, args);
|
|
va_end(args);
|
|
}
|
|
else
|
|
printf("Sorry, no usage information available\n\n");
|
|
|
|
printf("Mail bug reports to <adb@newmail.ru>\n");
|
|
|
|
fflush(stdout);
|
|
}
|
|
|
|
/* end of u_misc.c */
|