NetBSD/usr.sbin/isdn/isdntel/files.c

300 lines
7.6 KiB
C

/*
* Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*---------------------------------------------------------------------------
*
* isdntel - isdn4bsd telephone answering machine support
* ======================================================
*
* $Id: files.c,v 1.5 2004/10/30 08:31:39 dsl Exp $
*
* $FreeBSD$
*
* last edit-date: [Sat Jan 6 13:04:44 2001]
*
*----------------------------------------------------------------------------*/
#include "defs.h"
struct onefile * store(struct onefile *new, struct onefile *top);
void free_list(void);
/*---------------------------------------------------------------------------*
* create a doubly linked list in sorted order, return pointer to new
* first element of list
*---------------------------------------------------------------------------*/
struct onefile *store
(struct onefile *new, /* new entry to store into list */
struct onefile *top) /* current first entry in list */
{
struct onefile *old, *p;
if (last == NULL) /* enter very first element ? */
{
new->next = NULL;
new->prev = NULL;
last = new; /* init last */
return (new); /* return new first */
}
p = top; /* p = old first element */
old = NULL;
while (p)
{
if ((strcmp(p->fname, new->fname)) < 0) /* current less new ? */
{
old = p;
p = p->next;
}
else
{ /* current >= new */
if (p->prev)
{
p->prev->next = new;
new->next = p;
new->prev = p->prev;
p->prev = new;
return (top);
}
new->next = p;
new->prev = NULL;
p->prev = new;
return (new);
}
}
old->next = new;
new->next = NULL;
new->prev = old;
last = new;
return (first);
}
/*---------------------------------------------------------------------------*
* read current directory and build up a doubly linked sorted list
*---------------------------------------------------------------------------*/
int
fill_list(void)
{
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
register struct dirent *dp;
#else
register struct direct *dp;
#endif
register struct onefile *new_entry;
register DIR *dirp;
int flcnt = 0;
char tmp[80];
char *s, *d;
if ((dirp = opendir(spooldir)) == NULL)
fatal("cannot open spooldirectory %s!\n", spooldir);
for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
{
if (!isdigit((unsigned char)*(dp->d_name)))
continue;
if ((new_entry = (struct onefile *) malloc(sizeof(struct onefile))) == NULL)
{
fatal("files.c, fill_list(): structure onefile malloc failed");
}
/* alloc filename memory and copy name into it */
if ((new_entry->fname = strdup(dp->d_name)) == NULL)
{
fatal("files.c, fill_list(): malloc filename string memory failed");
}
/* fill in remaining fields from filename */
tmp[0] = dp->d_name[4]; /* day msb */
tmp[1] = dp->d_name[5]; /* day lsb */
tmp[2] = '.';
tmp[3] = dp->d_name[2]; /* month msb */
tmp[4] = dp->d_name[3]; /* month lsb */
tmp[5] = '.';
tmp[6] = dp->d_name[0]; /* year msb */
tmp[7] = dp->d_name[1]; /* year lsb */
tmp[8] = '\0';
if ((new_entry->date = strdup(tmp)) == NULL)
{
fatal("files.c, fill_list(): malloc date string memory failed");
}
tmp[0] = dp->d_name[6]; /* hour msb */
tmp[1] = dp->d_name[7]; /* hour lsb */
tmp[2] = ':';
tmp[3] = dp->d_name[8]; /* minute msb */
tmp[4] = dp->d_name[9]; /* minute lsb */
tmp[5] = ':';
tmp[6] = dp->d_name[10]; /* second msb */
tmp[7] = dp->d_name[11]; /* second lsb */
tmp[8] = '\0';
if ((new_entry->time = strdup(tmp)) == NULL)
{
fatal("files.c, fill_list(): malloc time string memory failed");
}
/* destination number */
s = &dp->d_name[13];
d = &tmp[0];
while(*s && (*s != '-'))
*d++ = *s++;
*d = '\0';
if ((new_entry->dstnumber = strdup(tmp)) == NULL)
{
fatal("files.c, fill_list(): malloc dstnumber string memory failed");
}
/* source number */
s++;
d = &tmp[0];
while(*s && (*s != '-'))
*d++ = *s++;
*d = '\0';
if ((new_entry->srcnumber = strdup(tmp)) == NULL)
{
fatal("files.c, fill_list(): malloc srcnumber string memory failed");
}
/* length in seconds */
s++;
d = &tmp[0];
while(*s && (*s != '-'))
*d++ = *s++;
*d = '\0';
if ((new_entry->seconds = strdup(tmp)) == NULL)
{
fatal("files.c, fill_list(): malloc seconds string memory failed");
}
/* search for alias and add if found */
new_entry->alias = get_alias(new_entry->srcnumber);
/* sort entry into linked list */
first = store(new_entry, first);
flcnt++; /* increment file count */
}
closedir(dirp); /* close current dir */
return(flcnt); /* ok return */
}
/*---------------------------------------------------------------------------*
* free the current malloc'ed list
*---------------------------------------------------------------------------*/
void
free_list(void)
{
register struct onefile *dir;
register struct onefile *tmp;
dir = first; /* start of linked list */
while (dir) /* free all */
{
tmp = dir->next; /* save ptr to next entry */
free(dir->fname); /* free filename space */
free(dir->date);
free(dir->time);
free(dir->srcnumber);
free(dir->dstnumber);
free(dir->seconds);
free(dir); /* free struct space */
dir = tmp; /* ptr = ptr to next entry */
}
first = NULL; /* first ptr = NULL */
last = NULL; /* last ptr = NULL */
}
/*---------------------------------------------------------------------------*
* delete a file
*---------------------------------------------------------------------------*/
void
delete(struct onefile *this)
{
char buffer[MAXPATHLEN+1];
if (this == NULL)
return;
snprintf(buffer, sizeof(buffer), "%s", this->fname);
unlink(buffer);
free_list();
wclear(main_w);
init_files(cur_pos);
}
/*---------------------------------------------------------------------------*
* reread the spool directory
*---------------------------------------------------------------------------*/
void
reread(void)
{
free_list();
wclear(main_w);
init_files(cur_pos);
}
/*---------------------------------------------------------------------------*
* play a file
*---------------------------------------------------------------------------*/
void
play(struct onefile *this)
{
char buffer[MAXPATHLEN+1];
if (this == NULL)
return;
snprintf(buffer, sizeof(buffer), playstring, this->fname);
system(buffer);
}
/*---------------------------------- EOF -------------------------------------*/