home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Spezial
/
SPEZIAL2_97.zip
/
SPEZIAL2_97.iso
/
ANWEND
/
ONLINE
/
ELM23-2
/
ELM23-2.ZIP
/
utils
/
expand.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-03
|
4KB
|
150 lines
static char rcsid[] = "@(#)$Id: expand.c,v 4.1 90/04/28 22:44:37 syd Exp $";
/*******************************************************************************
* The Elm Mail System - $Revision: 4.1 $ $State: Exp $
*
* Copyright (c) 1986, 1987 Dave Taylor
* Copyright (c) 1988, 1989, 1990 USENET Community Trust
*******************************************************************************
* Bug reports, patches, comments, suggestions should be sent to:
*
* Syd Weinstein, Elm Coordinator
* elm@DSI.COM dsinc!elm
*
*******************************************************************************
* $Log: expand.c,v $
* Revision 4.1 90/04/28 22:44:37 syd
* checkin of Elm 2.3 as of Release PL0
*
*
******************************************************************************/
/** This is a library routine for the various utilities that allows
users to have the standard 'Elm' folder directory nomenclature
for all filenames (e.g. '+', '=' or '%'). It should be compiled
and then linked in as needed.
**/
#include <stdio.h>
#include <pwd.h>
#include "defs.h"
char *expand_define();
static struct passwd *pass;
static char *home;
int
expand(filename)
char *filename;
{
/** Expand the filename since the first character is a meta-
character that should expand to the "maildir" variable
in the users ".elmrc" file...
Note: this is a brute force way of getting the entry out
of the .elmrc file, and isn't recommended for the faint
of heart!
**/
FILE *rcfile;
char buffer[SLEN], *expanded_dir, *bufptr;
int foundit = 0;
bufptr = (char *) buffer; /* same address */
if((pass = getpwuid(getuid())) == NULL) {
printf("You have no password entry!\n");
exit(1);
}
home = pass->pw_dir;
sprintf(buffer, "%s/%s", home, elmrcfile);
if ((rcfile = fopen(buffer, "r")) == NULL) {
printf("Can't open your \".elmrc\" file (%s) for reading!\n",
buffer);
return(NO);
}
while (fgets(buffer, SLEN, rcfile) != NULL && ! foundit) {
if (strncmp(buffer, "maildir", 7) == 0 ||
strncmp(buffer, "folders", 7) == 0) {
while (*bufptr != '=' && *bufptr)
bufptr++;
bufptr++; /* skip the equals sign */
while (whitespace(*bufptr) && *bufptr)
bufptr++;
home = bufptr; /* remember this address */
while (! whitespace(*bufptr) && *bufptr != '\n')
bufptr++;
*bufptr = '\0'; /* remove trailing space */
foundit++;
}
}
fclose(rcfile); /* be nice... */
if (! foundit) {
printf("Couldn't find \"maildir\" in your .elmrc file!\n");
return(NO);
}
/** Home now points to the string containing your maildir, with
no leading or trailing white space...
**/
if ((expanded_dir = expand_define(home)) == NULL)
return(NO);
sprintf(buffer, "%s%s%s", expanded_dir,
(expanded_dir[strlen(expanded_dir)-1] == '/' ||
filename[0] == '/') ? "" : "/", (char *) filename+1);
strcpy(filename, buffer);
return(YES);
}
char *expand_define(maildir)
char *maildir;
{
/** This routine expands any occurances of "~" or "$var" in
the users definition of their maildir directory out of
their .elmrc file.
Again, another routine not for the weak of heart or staunch
of will!
**/
static char buffer[SLEN]; /* static buffer AIEE!! */
char name[SLEN], /* dynamic buffer!! (?) */
*nameptr, /* pointer to name?? */
*value; /* char pointer for munging */
if (*maildir == '~')
sprintf(buffer, "%s%s", home, ++maildir);
else if (*maildir == '$') { /* shell variable */
/** break it into a single word - the variable name **/
strcpy(name, (char *) maildir + 1); /* hurl the '$' */
nameptr = (char *) name;
while (*nameptr != '/' && *nameptr) nameptr++;
*nameptr = '\0'; /* null terminate */
/** got word "name" for expansion **/
if ((value = getenv(name)) == NULL) {
printf("Couldn't expand shell variable $%s in .elmrc!\n", name);
return(NULL);
}
sprintf(buffer, "%s%s", value, maildir + strlen(name) + 1);
}
else strcpy(buffer, maildir);
return( ( char *) buffer);
}