home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.uv.es
/
2014.11.ftp.uv.es.tar
/
ftp.uv.es
/
pub
/
unix
/
elm-2.4-pl20.tar.Z
/
elm-2.4-pl20.tar
/
lib
/
opt_utils.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-12
|
10KB
|
481 lines
static char rcsid[] = "@(#)$Id: opt_utils.c,v 5.4 1992/12/12 01:29:26 syd Exp $";
/*******************************************************************************
* The Elm Mail System - $Revision: 5.4 $ $State: Exp $
*
* Copyright (c) 1988-1992 USENET Community Trust
* Copyright (c) 1986,1987 Dave Taylor
*******************************************************************************
* Bug reports, patches, comments, suggestions should be sent to:
*
* Syd Weinstein, Elm Coordinator
* elm@DSI.COM dsinc!elm
*
*******************************************************************************
* $Log: opt_utils.c,v $
* Revision 5.4 1992/12/12 01:29:26 syd
* Fix double inclusion of sys/types.h
* From: Tom Moore <tmoore@wnas.DaytonOH.NCR.COM>
*
* Revision 5.3 1992/10/30 21:49:38 syd
* Add init of buf
* From: Syd via request from hessmann@unipas.fmi.uni-passau.de (Georg Hessmann)
*
* Revision 5.2 1992/10/24 13:06:23 syd
* make getdomainname optional
* From: Syd
*
* Revision 5.1 1992/10/03 22:41:36 syd
* Initial checkin as of 2.4 Release at PL0
*
*
******************************************************************************/
/** 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"
#include <ctype.h>
#ifdef PWDINSYS
# include <sys/pwd.h>
#else
# include <pwd.h>
#endif
#ifdef BSD
#undef tolower
#undef toupper
#endif
#ifndef GETHOSTNAME
# ifdef DOUNAME
# include <sys/utsname.h>
# endif
#endif
char *index();
#ifndef GETHOSTNAME
gethostname(cur_hostname,size) /* get name of current host */
char *cur_hostname;
int size;
{
/** Return the name of the current host machine. **/
#if (defined(XENIX) || defined(M_UNIX)) & !defined(DOUNAME)
char buf[32];
FILE *fp;
char *p;
buf[0] = '\0';
if ((fp = fopen("/etc/systemid", "r")) != 0) {
fgets(buf, sizeof(buf) - 1, fp);
fclose(fp);
if ((p = index(buf, '\n')) != NULL)
*p = '\0';
(void) strncpy(cur_hostname, buf, size - 1);
cur_hostname[size - 1] = '\0';
return 0;
}
#else /* neither XENIX nor SCO UNIX */
#ifdef DOUNAME
/** This routine compliments of Scott McGregor at the HP
Corporate Computing Center **/
int uname();
struct utsname name;
(void) uname(&name);
(void) strncpy(cur_hostname,name.nodename,size-1);
#else
(void) strncpy(cur_hostname, HOSTNAME, size-1);
#endif /* DOUNAME */
cur_hostname[size - 1] = '\0';
return 0;
#endif /* XENIX or SCO UNIX */
}
#endif /* GETHOSTNAME */
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
strncpy(buf, DEFAULT_DOMAIN, sizeof(buf) - 1);
}
if (buf[0] != '\0' && buf[0] != '.') {
*hostdom++ = '.';
--size;
}
(void) strncpy(hostdom, buf, size - 1);
hostdom[size - 1] = '\0';
return 0;
}
#ifndef HAS_CUSERID
char *cuserid(uname)
char *uname;
{
/** Added for compatibility with Bell systems, this is the last-ditch
attempt to get the users login name, after getlogin() fails. It
instantiates "uname" to the name of the user...(it also tries
to use "getlogin" again, just for luck)
**/
/** This wasn't really compatible. According to our man page,
** It was inconsistent. If the parameter is NULL then you return
** the name in a static area. Else the ptr is supposed to be a
** pointer to l_cuserid bytes of memory [probally 9 bytes]...
** It's not mention what it should return if you copy the name
** into the array, so I chose NULL.
** Sept 20, 1988
** **WJL**
**/
struct passwd *password_entry;
#ifndef _POSIX_SOURCE
struct passwd *getpwuid();
#endif
char *name, *getlogin();
static char buf[10];
register returnonly = 0;
if (uname == NULL) ++returnonly;
if ((name = getlogin()) != NULL) {
if (returnonly) {
return(name);
} else {
strcpy(uname, name);
return name;
}
}
else
if (( password_entry = getpwuid(getuid())) != NULL)
{
if (returnonly)
{
return(password_entry->pw_name);
}
else
{
strcpy(uname, password_entry->pw_name);
return name;
}
}
else
{
return NULL;
}
}
#endif
#if defined(BSD) && !defined(_POSIX_SOURCE)
/** some supplementary string functions for Berkeley Unix systems **/
int
tolower(ch)
int ch;
{
/** This should be a macro call, but if you use this as a macro
calls to 'tolower' where the argument is a function call will
cause the function to be called TWICE which is obviously the
wrong behaviour. On the other hand, to just blindly translate
assuming the character is always uppercase can cause BIG
problems, so...
**/
return ( isupper(ch) ? ch - 'A' + 'a' : ch );
}
int
toupper(ch)
int ch;
{
/** see comment for above routine - tolower() **/
return ( islower(ch) ? ch - 'a' + 'A' : ch );
}
#endif
#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
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
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;
if (dir == NULL) {
dir = "/usr/tmp";
} else if (*dir == '\0') {
dir = "/usr/tmp";
}
if (pfx == NULL) {
pfx = "";
}
sprintf(space, "%s%s%d.%d", dir, pfx, getpid(), cnt);
cnt++;
newspace = malloc(strlen(space) + 1);
if (newspace != NULL) {
strcpy(newspace, space);
}
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
#ifndef RENAME
int rename(tmpfname, fname)
#ifdef ANSI_C
const
#endif
char *tmpfname, *fname;
{
int status;
(void) unlink(fname);
if ((status = link(tmpfname, fname)) != 0)
return(status);
(void) unlink(tmpfname);
return(0);
}
#endif