static char rcsid[] = "@(#)$Id: opt_utils.c,v 1.10 2006/04/30 17:54:55 hurtta Exp $";
/******************************************************************************
* The Elm (ME+) Mail System - $Revision: 1.10 $ $State: Exp $
*
* Modified by: Kari Hurtta <hurtta+elm@posti.FMI.FI>
* (was hurtta+elm@ozone.FMI.FI)
******************************************************************************
* The Elm Mail System
*
* Copyright (c) 1988-1992 USENET Community Trust
* Copyright (c) 1986,1987 Dave Taylor
*****************************************************************************/
/** This file contains routines that might be needed for the various
machines that the mailer can run on. Please check the Makefile
for more help and/or information.
**/
#include "headers.h"
#include "s_error.h"
#ifdef PWDINSYS
# include <sys/pwd.h>
#else
# include <pwd.h>
#endif
int gethostdomain(hostdom, size) /* get domain of current host */
char *hostdom;
int size;
{
char buf[64];
FILE *fp;
char *p;
if (size < 2)
return -1;
buf[0] = '\0';
if ((fp = fopen(hostdomfile, "r")) != 0) {
fgets(buf, sizeof(buf) - 1, fp);
fclose(fp);
if ((p = index(buf, '\n')) != NULL)
*p = '\0';
}
else {
#ifdef USEGETDOMAINNAME
if (getdomainname(buf, sizeof(buf)) != 0)
#endif
#ifdef MYDOMAIN
strfcpy(buf, MYDOMAIN, sizeof(buf));
#else
return -1;
#endif
}
if (buf[0] != '\0' && buf[0] != '.') {
*hostdom++ = '.';
--size;
}
(void) strfcpy(hostdom, buf, size);
return 0;
}
#ifndef STRTOK
char *strtok(source, keys)
char *source, *keys;
{
/** This function returns a pointer to the next word in source
with the string considered broken up at the characters
contained in 'keys'. Source should be a character pointer
when this routine is first called, then NULL subsequently.
When strtok has exhausted the source string, it will
return NULL as the next word.
WARNING: This routine will DESTROY the string pointed to
by 'source' when first invoked. If you want to keep the
string, make a copy before using this routine!!
**/
register int last_ch;
static char *sourceptr;
char *return_value;
if (source != NULL)
sourceptr = source;
if (*sourceptr == '\0')
return(NULL); /* we hit end-of-string last time!? */
sourceptr += strspn(sourceptr, keys); /* skip leading crap */
if (*sourceptr == '\0')
return(NULL); /* we've hit end-of-string */
last_ch = strcspn(sourceptr, keys); /* end of good stuff */
return_value = sourceptr; /* and get the ret */
sourceptr += last_ch; /* ...value */
if (*sourceptr != '\0') /* don't forget if we're at END! */
sourceptr++; /* and skipping for next time */
return_value[last_ch] = '\0'; /* ..ending right */
return((char *) return_value); /* and we're outta here! */
}
#endif
#ifndef STRPBRK
char *strpbrk(source, keys)
char *source, *keys;
{
/** Returns a pointer to the first character of source that is any
of the specified keys, or NULL if none of the keys are present
in the source string.
**/
register char *s, *k;
for (s = source; *s != '\0'; s++) {
for (k = keys; *k; k++)
if (*k == *s)
return(s);
}
return(NULL);
}
#endif
#ifndef STRSPN
int strspn(source, keys)
char *source, *keys;
{
/** This function returns the length of the substring of
'source' (starting at zero) that consists ENTIRELY of
characters from 'keys'. This is used to skip over a
defined set of characters with parsing, usually.
**/
register int loc = 0, key_index = 0;
while (source[loc] != '\0') {
key_index = 0;
while (keys[key_index] != source[loc])
if (keys[key_index++] == '\0')
return(loc);
loc++;
}
return(loc);
}
#endif
#ifndef STRCSPN
int strcspn(source, keys)
char *source, *keys;
{
/** This function returns the length of the substring of
'source' (starting at zero) that consists entirely of
characters NOT from 'keys'. This is used to skip to a
defined set of characters with parsing, usually.
NOTE that this is the opposite of strspn() above
**/
register int loc = 0, key_index = 0;
while (source[loc] != '\0') {
key_index = 0;
while (keys[key_index] != '\0')
if (keys[key_index++] == source[loc])
return(loc);
loc++;
}
return(loc);
}
#endif
#ifndef TEMPNAM
/* and a tempnam for temporary files */
static int cnt = 0;
char *tempnam( dir, pfx)
char *dir, *pfx;
{
char space[SLEN];
char *newspace;
int Len;
if (dir == NULL) {
dir = "/usr/tmp";
} else if (*dir == '\0') {
dir = "/usr/tmp";
}
if (pfx == NULL) {
pfx = "";
}
elm_sfprintf(space, sizeof space,
FRM("%s%s%d.%d"), dir, pfx, getpid(), cnt);
cnt++;
Len = strlen(space) + 1;
newspace = malloc(Len);
if (newspace != NULL) {
strfcpy(newspace, space, Len);
}
return newspace;
}
#endif
#ifndef GETOPT
/*LINTLIBRARY*/
#define NULL 0
#define EOF (-1)
#define ERR(s, c) if(opterr){\
extern int strlen(), write();\
char errbuf[2];\
errbuf[0] = c; errbuf[1] = '\n';\
(void) write(2, argv[0], (unsigned)strlen(argv[0]));\
(void) write(2, s, (unsigned)strlen(s));\
(void) write(2, errbuf, 2);}
extern int strcmp();
int opterr = 1;
int optind = 1;
int optopt;
char *optarg;
int getopt(argc, argv, opts)
int argc;
char **argv, *opts;
{
static int sp = 1;
register int c;
register char *cp;
if(sp == 1)
if(optind >= argc ||
argv[optind][0] != '-' || argv[optind][1] == '\0')
return(EOF);
else if(strcmp(argv[optind], "--") == NULL) {
optind++;
return(EOF);
}
optopt = c = argv[optind][sp];
if(c == ':' || (cp=index(opts, c)) == NULL) {
ERR(": illegal option -- ", c);
if(argv[optind][++sp] == '\0') {
optind++;
sp = 1;
}
return('?');
}
if(*++cp == ':') {
if(argv[optind][sp+1] != '\0')
optarg = &argv[optind++][sp+1];
else if(++optind >= argc) {
cp = catgets(elm_msg_cat, ErrorSet, ErrorGetoptReq,
": option requires an argument -- ");
ERR(cp, c);
sp = 1;
return('?');
} else
optarg = argv[optind++];
sp = 1;
} else {
if(argv[optind][++sp] == '\0') {
sp = 1;
optind++;
}
optarg = NULL;
}
return(c);
}
#endif
/*
* Local Variables:
* mode:c
* c-basic-offset:4
* buffer-file-coding-system: iso-8859-1
* End:
*/
syntax highlighted by Code2HTML, v. 0.9.1