/*
*----------------------------------------------------------------------------
* Copyright (c) 2002, Daniel B. Hemmerich
* All rights reserved.
*----------------------------------------------------------------------------
*
* * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * 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.
*
* * Neither the name of the ipex developers nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
*----------------------------------------------------------------------------
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 REGENTS 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.
*----------------------------------------------------------------------------
*/
#ifndef lint
static const char rcsid[] = \
"@(#) $Header: /usr/cvs/ipex/time.c,v 1.2 2004/08/05 23:00:35 modulus Exp $";
#endif
#include "ipex_includes.h"
const static char ncharset[] = "1234567890";
const static char scharset[] = "smhd";
void isvalid(char *expr);
unsigned long int
timer_secs(char *arg)
{
unsigned long int secs = 0;
char unit = 0;
if (strchr(scharset, arg[strlen(arg) - 1])) {
unit = arg[strlen(arg) - 1];
arg[strlen(arg) - 1] = '\0';
}
switch(unit) {
case 'm':
secs = atol(arg) * 60;
break;
case 'h':
secs = atol(arg) * 3600;
break;
case 'd':
secs = atol(arg) * 86400;
break;
case 's':
default:
secs = atol(arg);
break;
}
return (secs);
}
void
set_timer(char *arg)
{
struct itimerval itv;
isvalid(arg);
memset(&itv, 0, sizeof(itv));
itv.it_interval.tv_sec = 0;
itv.it_interval.tv_usec = 0;
itv.it_value.tv_sec = timer_secs(arg);
if (setitimer(ITIMER_REAL, &itv, NULL) == -1)
errx(EX_OSERR, "fatal: setitimer: %s", strerror(errno));
}
void
isvalid(char *expr)
{
int nc = 0;
while(*expr) {
if (*(expr + 1) == '\0') {
if (strchr(ncharset, *expr)) {
nc++;
break;
}
if (!nc)
errx(EX_USAGE, "fatal: at least one digit " \
"for -t is required");
if (!strchr(scharset, *expr))
errx(EX_USAGE, "fatal: suffix for -t must be " \
"s m h or d");
nc++;
break;
}
if (!strchr(ncharset, *expr))
errx(EX_USAGE, "fatal: -t requires a numeric unit" \
" with optional suffix (%c invalid)", *expr);
expr++;
nc++;
}
if (!nc)
errx(EX_USAGE, "fatal: -t requires a numeric unit with" \
" optional suffix");
}
syntax highlighted by Code2HTML, v. 0.9.1