2 * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 *---------------------------------------------------------------------------
27 * isdntel - isdn4bsd telephone answering machine support
28 * ======================================================
30 * $Id: main.c,v 1.12 1999/12/13 21:25:26 hm Exp $
32 * $FreeBSD: src/usr.sbin/i4b/isdntel/main.c,v 1.8.2.1 2001/08/01 17:45:07 obrien Exp $
34 * last edit-date: [Mon Dec 13 21:54:26 1999]
36 *----------------------------------------------------------------------------*/
43 static void usage( void );
45 static int top_dis = 0;
46 static int bot_dis = 0;
47 static int cur_pos_scr = 0;
49 static void makecurrent(int cur_pos, struct onefile *cur_file, int cold);
51 /*---------------------------------------------------------------------------*
53 *---------------------------------------------------------------------------*/
55 main(int argc, char **argv)
60 char *spooldir = SPOOLDIR;
61 char *playstring = PLAYCMD;
62 char *aliasfile = ALIASFILE;
63 int rrtimeout = REREADTIMEOUT;
67 setlocale( LC_ALL, "");
69 while ((i = getopt(argc, argv, "a:d:p:t:")) != -1)
88 rrtimeout = strtoul(optarg, NULL, 10);
106 if((chdir(spooldir)) != 0)
107 fatal("cannot change directory to spooldir %s!", spooldir);
109 init_alias(aliasfile);
120 struct timeval timeout;
123 FD_SET(STDIN_FILENO, &set);
124 timeout.tv_sec = rrtimeout;
127 /* if no char is available within timeout, reread spool */
129 if((select(STDIN_FILENO + 1, &set, NULL, NULL, &timeout)) <= 0)
135 kchar = wgetch(main_w); /* get char */
147 case KEY_UP: /* up-move cursor */
148 if(cur_file && cur_file->prev)
150 cur_file = cur_file->prev;
157 case KEY_DOWN: /* down-move cursor */
158 if(cur_file && cur_file->next)
160 cur_file = cur_file->next;
165 case KEY_HOME: /* move cursor to first dir */
168 case KEY_LL: /* move cursor to last file */
175 case CNTRL_L: /* refresh */
181 makecurrent(cur_pos, cur_file, 0);
189 /*---------------------------------------------------------------------------*
190 * handle horizontal selection bar movement
191 *---------------------------------------------------------------------------*/
193 makecurrent(int cur_pos, struct onefile *cur_file, int cold)
196 static struct onefile *lastfile;
199 /* un-higlight current horizontal bar */
201 if(!cold && lastfile && cur_file)
203 sprintf(buffer, "%s %s %-16s %-16s %-20s %-6s%*s",
204 lastfile->date, lastfile->time,
205 lastfile->dstnumber, lastfile->srcnumber,
206 lastfile->alias == NULL ? "-/-" : lastfile->alias,
208 COLS - LAST_POS - 2, "");
210 wattroff(main_w, A_REVERSE);
211 mvwprintw(main_w, lastpos, 0, "%s", buffer);
212 wattroff(main_w, A_REVERSE);
217 lastpos = cur_pos_scr;
222 /* have to scroll up or down ? */
224 if(cur_pos >= bot_dis)
232 cur_pos_scr = LINES-START_O-3;
234 else if(cur_pos < top_dis)
246 cur_pos_scr = cur_pos - top_dis;
249 sprintf(buffer, "%s %s %-16s %-16s %-20s %-6s%*s",
250 cur_file->date, cur_file->time,
251 cur_file->dstnumber, cur_file->srcnumber,
252 cur_file->alias == NULL ? "-/-" : cur_file->alias,
254 COLS - LAST_POS - 2, "");
256 wattron(main_w, A_REVERSE);
257 mvwprintw(main_w, cur_pos_scr, 0, "%s", buffer);
258 wattroff(main_w, A_REVERSE);
260 lastpos = cur_pos_scr;
266 /*---------------------------------------------------------------------------*
268 *---------------------------------------------------------------------------*/
279 /*---------------------------------------------------------------------------*
280 * usage display and exit
281 *---------------------------------------------------------------------------*/
285 fprintf(stderr, "\n");
286 fprintf(stderr, "isdntel - isdn telephone answering management support utility (version %d.%d.%d)\n", VERSION, REL, STEP);
287 fprintf(stderr, " usage: isdntel -a <filename> -d <directory> -p <command> -t <timeout>\n");
288 fprintf(stderr, " -a <filename> use filename as alias file\n");
289 fprintf(stderr, " -d <directory> use directory as spool directory\n");
290 fprintf(stderr, " -p <command> specify commandline for play command\n");
291 fprintf(stderr, " -t <timeout> spool directory reread timeout in seconds\n");
292 fprintf(stderr, "\n");
296 /*---------------------------------------------------------------------------*
298 *---------------------------------------------------------------------------*/
300 fatal(char *fmt, ...)
314 fprintf(stderr, "\nFatal error: ");
315 vfprintf(stderr, fmt, ap);
316 fprintf(stderr, "\n\n");
323 /*---------------------------------------------------------------------------*
325 *---------------------------------------------------------------------------*/
327 error(char *fmt, ...)
335 wprintw(main_w, "ERROR: ");
336 vwprintw(main_w, fmt, ap);
337 wprintw(main_w, "\n");
342 fprintf(stderr, "ERROR: ");
343 vfprintf(stderr, fmt, ap);
344 fprintf(stderr, "\n");
350 /*---------------------------------------------------------------------------*
351 * read files and fill display
352 *---------------------------------------------------------------------------*/
354 init_files(int inipos)
358 nofiles = fill_list();
371 for(i=0; (i < nofiles) && (i < (LINES-START_O-2)); i++)
373 mvwprintw(main_w, i, 0, "%s %s", cur_file->date, cur_file->time);
374 mvwprintw(main_w, i, DST_POS, "%s", cur_file->dstnumber);
375 mvwprintw(main_w, i, SRC_POS, "%s", cur_file->srcnumber);
376 mvwprintw(main_w, i, ALI_POS,"%s", cur_file->alias == NULL ? "-/-" : cur_file->alias);
377 mvwprintw(main_w, i, SEC_POS,"%s", cur_file->seconds);
381 if((cur_file = cur_file->next) == NULL)
389 for(i=0; i < inipos; i++)
391 if(cur_file->next != NULL)
392 cur_file = cur_file->next;
397 makecurrent(cur_pos, cur_file, 1);