This is sysstuff.c in view mode; [Download] [Up]
/* $Id: sysstuff.c,v 1.2 1995/12/19 19:30:47 eilts Exp eilts $ */
#include "bbs.h"
#ifdef NO_DBOPEN
DBASE_DB *dbase_open(const char *file, int flags, int mode, DBTYPE type,
const void *openinfo)
{
char path[PATH_MAX+1];
DBASE_DB *db;
if ((db=(DBASE_DB *)malloc(sizeof(DBASE_DB))) == NULL) return NULL;
if (file == NULL) {
if (tmpnam(path) == NULL) return NULL;
}
else {
strcpy(path,file);
}
db->dbm = dbm_open(path,flags,mode);
if (file == NULL) {
unlink(path);
*db->file = '\0';
}
else {
strcpy(db->file,file);
}
if (db->dbm == NULL) {
free(db);
return NULL;
}
db->mode = mode;
db->close = dbase_close;
db->del = dbase_del;
db->get = dbase_get;
db->put = dbase_put;
db->seq = dbase_seq;
db->sync = dbase_sync;
return db;
}
int dbase_close(DBASE_DB *db)
{
dbm_close(db->dbm);
free(db);
return 0;
}
int dbase_del(const DBASE_DB *db, const datum *key, U_INT flags)
{
return dbm_delete(db->dbm,*key);
}
int dbase_get(const DBASE_DB *db, const datum *key, datum *data, U_INT flags)
{
*data = dbm_fetch(db->dbm,*key);
if (data->dptr == NULL) return 1;
return 0;
}
int dbase_put(const DBASE_DB *db, datum *key, const datum *data, U_INT flags)
{
return dbm_store(db->dbm,*key,*data,
flags == R_NOOVERWRITE ? DBM_INSERT : DBM_REPLACE);
}
int dbase_seq(const DBASE_DB *db, datum *key, datum *data, U_INT flags)
{
int n;
if (flags == R_FIRST) {
*key = dbm_firstkey(db->dbm);
}
else {
*key = dbm_nextkey(db->dbm);
}
n = key->dptr == NULL ? 1 : 0;
if (n == 0) {
*data = dbm_fetch(db->dbm,*key);
if (data->dptr == NULL) n = -1;
}
return n;
}
int dbase_sync(const DBASE_DB *db, U_INT flags)
{
dbm_close(db->dbm);
if (dbm_open(db->file,O_RDWR,db->mode) == NULL) return -1;
return 0;
}
int dbase_unlink(const char *dbfile)
{
char path[PATH_MAX+1];
strcpy(path,dbfile);
strcat(path,".pag");
unlink(path);
strcpy(path,dbfile);
strcat(path,".dir");
return unlink(path);
}
#endif
int f_close(FILE *stream)
{
if (stream == NULL) {
errno = EBADF;
return -1;
}
return fclose(stream);
}
#if defined(BBSDNAME) || defined(BBSMAILNAME)
#ifdef BSD4_4
# undef TRUE
# undef FALSE
# include <vm/vm.h>
# include <machine/vmparam.h>
# include <sys/exec.h>
# ifdef PS_STRINGS
# define SETPROC_STATIC static
# endif
#else
# ifdef __hpux
# include <sys/pstat.h>
# endif
#endif
#ifndef SETPROC_STATIC
# define SETPROC_STATIC
#endif
void setproctitle(char *argv[], const SIZE_T mlen, char *fmt, ...)
{
char *p;
int k;
SETPROC_STATIC char buf[PATH_MAX+1];
va_list ap;
#ifdef __hpux
union pstun pst;
#endif
p = buf;
/* print daemon-name */
strcpy(p, "bbsd: ");
p += strlen(p);
/* print the argument string */
va_start(ap, fmt);
vsprintf(p, fmt, ap);
va_end(ap);
k = strlen(buf);
#ifdef __hpux
pst.pst_command = buf;
pstat(PSTAT_SETCMD, pst, k, 0, 0);
#else
#ifdef PS_STRINGS
PS_STRINGS->ps_nargvstr = 1;
PS_STRINGS->ps_argvstr = buf;
#else
strmaxcpy(argv[0], buf, mlen-2);
if (k < mlen-2) {
while (k < mlen-2) argv[0][k++] = ' ';
}
#endif
#endif
return;
}
#endif
int getdatenum(const char *datestr)
{
int p, n;
char str[31], *splits[5], *sp;
strmaxcpy(str,datestr,30);
n = splitstring(splits,str,' ',4);
if ((sp=strchr(splits[0],',')) != NULL) *sp = '\0';
if (getdaynum(splits[0]) > 0) {
/* Fri, 18 Nov 1994 */
p = 1;
}
else {
/* 18 Nov 1994 */
p = 0;
}
if ((n=getmonthnum(splits[p+1])) < 0) return -1;
return atoi(splits[p]) + 31 * (n + 12 * atoi(splits[p+2]));
}
int getdaynum(const char *day)
{
if (strcmp(day,"Mon") == 0) {
return 1;
}
else if (strcmp(day,"Tue") == 0) {
return 2;
}
else if (strcmp(day,"Wed") == 0) {
return 3;
}
else if (strcmp(day,"Thu") == 0) {
return 4;
}
else if (strcmp(day,"Fri") == 0) {
return 5;
}
else if (strcmp(day,"Sat") == 0) {
return 6;
}
else if (strcmp(day,"Sun") == 0) {
return 7;
}
return -1;
}
int getmonthnum(const char *month)
{
if (strcmp(month,"Jan") == 0) {
return 1;
}
else if (strcmp(month,"Feb") == 0) {
return 2;
}
else if (strcmp(month,"Mar") == 0) {
return 3;
}
else if (strcmp(month,"Apr") == 0) {
return 4;
}
else if (strcmp(month,"May") == 0) {
return 5;
}
else if (strcmp(month,"Jun") == 0) {
return 6;
}
else if (strcmp(month,"Jul") == 0) {
return 7;
}
else if (strcmp(month,"Aug") == 0) {
return 8;
}
else if (strcmp(month,"Sep") == 0) {
return 9;
}
else if (strcmp(month,"Oct") == 0) {
return 10;
}
else if (strcmp(month,"Nov") == 0) {
return 11;
}
else if (strcmp(month,"Dec") == 0) {
return 12;
}
return -1;
}
char *gettime()
{
TIME_T clock;
static char str[ASCIITIMESTRLEN];
clock = time((TIME_T)0);
strcpy(str,asctime(localtime(&clock)));
str[24] = '\0';
return str;
}
#ifndef NO_TV_USEC
double microtime(void)
{
struct timeval tp;
struct timezone tzp;
gettimeofday(&tp,&tzp);
return((double)(tp.tv_sec + 0.000001*tp.tv_usec));
}
#endif
int mklockfile(const char *pathname)
/*
legt ein Lockfile pathname an
*/
{
int fd;
if ((fd=open(pathname,O_RDWR|O_CREAT|O_EXCL,0644))<0) {
bgerror("mklockfile","open %s: %m",pathname);
return -1;
}
writen(fd,(void *)"LOCKED",(SIZE_T)7);
close(fd);
return 0;
}
int fgetnln(char str[], const int maxlen, FILE *datei)
/*
Liest eine Zeile aus einem File und kopiert maximal maxlen Zeichen
in str.
Rueckgabewerte: -1 bei EOF, maxlen+1 wenn die Zeile zu lang war
*/
{
char c;
int k;
boolean ret=TRUE;
if ( datei == NULL ) return -1;
k = 0;
do {
c = fgetc( datei );
if ( c != EOF ) str[k++] = c;
} while ( k <= maxlen && c!= '\n' && c != '\0' && c != EOF );
if ( c == '\n' ) {
ret = TRUE;
str[--k] = '\0';
}
else if ( c == '\0' ) {
ret = FALSE;
--k;
}
else if ( k > maxlen && c != '\n' && c != '\0' ) {
ret = FALSE;
str[k-1] = '\0';
}
else if ( c == EOF ) {
ret = TRUE;
str[k] = '\0';
k = -1;
}
if ( ! ret ) {
do{
c = fgetc( datei );
} while( c != '\n' && c != EOF );
if ( c == EOF ) k = -1;
}
return k;
}
SSIZE_T readn(int fd, void *vptr, SIZE_T n)
{
SIZE_T nleft;
SSIZE_T nread;
void *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ((nread=read(fd,ptr,nleft)) < 0) {
return(nread);
}
else if (nread == 0) {
break;
}
nleft -= (SIZE_T)nread;
ptr = (char *)ptr + nread*sizeof(char);
}
return(SSIZE_T)(n-nleft);
}
SSIZE_T writen(int fd, const void *vptr, SIZE_T n)
{
SIZE_T nleft;
SSIZE_T nwritten;
const void *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ((nwritten=write(fd,ptr,nleft)) <= 0) {
return(nwritten);
}
nleft -= (SIZE_T)nwritten;
ptr = (char *)ptr + nwritten*sizeof(char);
}
return(SSIZE_T)n;
}
SSIZE_T recvn(int s, void *buf, SIZE_T len, int flags)
{
SIZE_T bytesleft;
SSIZE_T n;
void *ptr;
ptr = buf;
bytesleft = len;
while (bytesleft > 0) {
if ((n=recv(s,ptr,bytesleft,flags)) < 0) {
return(n);
}
bytesleft -= (SIZE_T)n;
ptr = (char *)ptr + n*sizeof(char);
}
return(SSIZE_T)(len-bytesleft);
}
SSIZE_T sendn(int s, const void *buf, SIZE_T len, int flags)
{
SIZE_T bytesleft;
SSIZE_T n;
const void *ptr;
ptr = buf;
bytesleft = len;
while (bytesleft > 0) {
if ((n=send(s,(const void *)ptr,bytesleft,flags)) < 0) {
return(n);
}
if (n == 0) break;
bytesleft -= (SIZE_T)n;
ptr = (char *)ptr + n*sizeof(char);
}
return(SSIZE_T)len;
}
void (*setsighandler(int sig, void (*handler)(int)))(int)
{
struct sigaction act, oact;
act.sa_handler = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if (sig == SIGALRM) {
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT;
#endif
}
else {
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART;
#endif
}
if (sigaction(sig,&act,&oact) < 0) {
return(SIG_ERR);
}
return(oact.sa_handler);
}
void (*setsighandler2(int sig, SIGSET_T sigset, void (*handler)(int)))(int)
{
struct sigaction act, oact;
act.sa_handler = handler;
act.sa_mask = sigset;
act.sa_flags = 0;
if (sig == SIGALRM) {
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT;
#endif
}
else {
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART;
#endif
}
if (sigaction(sig,&act,&oact) < 0) {
return(SIG_ERR);
}
return(oact.sa_handler);
}
void syslogn(int priority, const char *message, ...)
{
va_list ap;
va_start(ap, message);
vsyslogn(priority, message, ap);
va_end(ap);
return;
}
void vsyslogn(int priority, const char *message, va_list args)
{
int k;
char c, *cp1, *cp2, msg[SYSLOGBUF], buf[MSG_MAX+1], fmt_cpy[MSG_MAX+1];
for (cp1=fmt_cpy; (c=*message)!='\0'; ++message) {
if (c=='%' && message[1]=='m') {
++message;
for (cp2=strerror(errno); (*cp1=*cp2++)!='\0'; ++cp1);
}
else {
*cp1++ = c;
}
}
*cp1 = '\0';
vsprintf(buf, fmt_cpy, args);
cp1 = buf;
while (*cp1 != '\0') {
k = 0;
while (*cp1!='\0' && k<SYSLOGBUF-81) {
msg[k++] = *cp1++;
}
msg[k] = '\0';
syslog(priority, msg);
}
return;
}
#ifdef NO_USLEEP
void usleep(U_INT microseconds)
{
#ifndef NO_TV_USEC
struct timeval tp;
tp.tv_sec = microseconds / 1000000;
tp.tv_usec = microseconds - tp.tv_sec;
while (select(0,NULL,NULL,NULL,&tp) == EINTR) ;
return;
#else
sleep((microseconds + 999999) / 1000000);
#endif
return;
}
#endif
extern char **environ;
SIZE_T environlen(void)
{
char **ep;
size_t len=1;
for (ep=environ; *ep!=NULL; ep++) {
len += strlen(*ep) + 1;
}
return(len);
}
int mdefenv(const char *env, const char *fmt, ...)
{
va_list ap;
int len;
char *sp, str[PATH_MAX+1];
va_start(ap, fmt);
vsprintf(str, fmt, ap);
va_end(ap);
len = strlen(env) + strlen(str) + 2;
if ((sp=(char *)malloc(len*sizeof(char))) == NULL) {
bgerror("mdefenv","cannot malloc: %m");
return(-1);
}
sprintf(sp,"%s=%s",env,str);
return putenv(sp);
}
int mputenv(const char *str)
{
char *sp;
if ((sp=(char *)malloc((strlen(str)+1)*sizeof(char))) == NULL) {
bgerror("mputenv","cannot malloc: %m");
return(-1);
}
strcpy(sp,str);
return putenv(sp);
}
#ifdef NO_PUTENV
/* Copyright (C) 1991 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
extern char **environ;
/* Put STRING, which is of the form "NAME=VALUE", in the environment. */
int
putenv (string)
const char *string;
{
char *name_end = (char *)strchr (string, '=');
register SIZE_T size;
register char **ep;
if (name_end == NULL)
{
/* Remove the variable from the environment. */
size = strlen (string);
for (ep = environ; *ep != NULL; ++ep)
if (!strncmp (*ep, string, size) && (*ep)[size] == '=')
{
while (ep[1] != NULL)
{
ep[0] = ep[1];
++ep;
}
*ep = NULL;
return 0;
}
}
size = 0;
for (ep = environ; *ep != NULL; ++ep)
if (!strncmp (*ep, string, name_end - string) &&
(*ep)[name_end - string] == '=')
break;
else
++size;
if (*ep == NULL)
{
static char **last_environ = NULL;
char **new_environ = (char **) malloc ((size + 2) * sizeof (char *));
if (new_environ == NULL)
return -1;
(void) bcopy ((char *) environ, (char *) new_environ, size * sizeof (char *));
new_environ[size] = (char *) string;
new_environ[size + 1] = NULL;
if (last_environ != NULL)
free ((char *) last_environ);
last_environ = new_environ;
environ = new_environ;
}
else
*ep = (char *) string;
return 0;
}
#endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.