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

Compare this file to the similar file:
Show the results in this format:

/*
 * 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 -------------------------------------*/