home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
APPS
/
elm.lzh
/
ELM
/
SRC
/
SAVE_OPTS.C
< prev
next >
Wrap
Text File
|
1991-01-11
|
11KB
|
401 lines
static char rcsid[] = "@(#)$Id: save_opts.c,v 4.1 90/04/28 22:44:00 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: save_opts.c,v $
* Revision 4.1 90/04/28 22:44:00 syd
* checkin of Elm 2.3 as of Release PL0
*
*
******************************************************************************/
/** This file contains the routine needed to allow the users to change the
Elm parameters and then save the configuration in a ".elm/elmrc" file in
their home directory. With any luck this will allow them never to have
to actually EDIT the file!!
**/
#include "headers.h"
#include <errno.h>
#undef onoff
#define onoff(n) (n == 1? "ON":"OFF")
#define absolute(x) ((x) < 0? -(x) : (x))
extern int errno;
extern char version_buff[];
char *error_name(), *sort_name();
long ftell();
#include "save_opts.h"
FILE *elminfo; /* informational file as needed... */
save_options()
{
/** Save the options currently specified to a file. This is a
fairly complex routine since it tries to put in meaningful
comments and such as it goes along. The comments are
extracted from the file ELMRC_INFO as defined in the sysdefs.h
file. THAT file has the format;
varname
<comment>
<comment>
<blank line>
and each comment is written ABOVE the variable to be added. This
program also tries to make 'pretty' stuff like the alternatives
and such.
**/
FILE *newelmrc;
char oldfname[SLEN], newfname[SLEN];
sprintf(newfname, "%s/%s", home, elmrcfile);
sprintf(oldfname, "%s/%s", home, old_elmrcfile);
/** first off, let's see if they already HAVE a .elm/elmrc file **/
save_file_stats(newfname);
if (access(newfname, ACCESS_EXISTS) != -1) {
/** YES! Copy it to the file ".old.elmrc".. **/
if (rename(newfname, oldfname) < 0)
dprint(2, (debugfile, "Unable to rename %s to %s\n",
newfname, oldfname));
(void) ochown(oldfname, userid, groupid);
}
/** now let's open the datafile if we can... **/
if ((elminfo = fopen(ELMRC_INFO, "r")) == NULL)
error1("Warning: saving without comments! Can't get to %s.",
ELMRC_INFO);
/** next, open the new .elm/elmrc file... **/
if ((newelmrc = fopen(newfname, "w")) == NULL) {
error2("Can't save configuration! Can't write to %s [%s].",
newfname, error_name(errno));
return;
}
save_user_options(elminfo, newelmrc);
restore_file_stats(newfname);
error1("Options saved in file %s.", newfname);
}
save_user_options(elminfo_fd, newelmrc)
FILE *elminfo_fd, *newelmrc;
{
/** save the information in the file. If elminfo_fd == NULL don't look
for comments!
**/
if (elminfo_fd != NULL)
build_offset_table(elminfo_fd);
fprintf(newelmrc,
"#\n# .elm/elmrc - options file for the ELM mail system\n#\n");
if (strlen(full_username) > 0)
fprintf(newelmrc, "# Saved automatically by ELM %s for %s\n#\n\n",
version_buff, full_username);
else
fprintf(newelmrc, "# Saved automatically by ELM %s\n#\n\n", version_buff);
fprintf(newelmrc,"# For yes/no settings with ?, ON means yes, OFF means no\n\n");
save_option_string(CALENDAR, raw_calendar_file, newelmrc, FALSE);
save_option_string(EDITOR, raw_editor, newelmrc, FALSE);
save_option_char(ESCAPECHAR, escape_char, newelmrc);
save_option_string(FULLNAME, full_username, newelmrc, FALSE);
save_option_string(RECEIVEDMAIL, raw_recvdmail, newelmrc, FALSE);
save_option_string(MAILDIR, raw_folders, newelmrc, FALSE);
save_option_string(TMPDIR, temp_dir, newelmrc, FALSE);
save_option_string(PAGER, raw_pager, newelmrc, FALSE);
save_option_string(PREFIX, prefixchars, newelmrc, TRUE);
save_option_string(PRINT, raw_printout, newelmrc, FALSE);
save_option_string(SENTMAIL, raw_sentmail, newelmrc, FALSE);
save_option_string(SHELL, raw_shell, newelmrc, FALSE);
save_option_string(LOCALSIGNATURE, raw_local_signature,
newelmrc, FALSE);
save_option_string(REMOTESIGNATURE, raw_remote_signature,
newelmrc, FALSE);
save_option_on_off(SIGDASHES, sig_dashes, newelmrc);
save_option_sort(SORTBY, newelmrc);
save_option_on_off(ALWAYSDELETE, always_del, newelmrc);
save_option_on_off(ALWAYSSTORE, always_store, newelmrc);
save_option_on_off(ALWAYSKEEP, always_keep, newelmrc);
save_option_on_off(ARROW, arrow_cursor, newelmrc);
save_option_on_off(ASK, question_me, newelmrc);
save_option_on_off(ASKCC, prompt_for_cc, newelmrc);
save_option_string(ATTRIBUTION, attribution, newelmrc, FALSE);
save_option_on_off(AUTOCOPY, auto_copy, newelmrc);
save_option_number(BOUNCEBACK, bounceback, newelmrc);
save_option_on_off(COPY, auto_cc, newelmrc);
save_option_on_off(FORCENAME, force_name, newelmrc);
save_option_on_off(FORMS, (allow_forms != NO), newelmrc);
save_option_on_off(KEEPEMPTY, keep_empty_files, newelmrc);
save_option_on_off(KEYPAD, hp_terminal, newelmrc);
save_option_on_off(MENU, mini_menu, newelmrc);
save_option_on_off(MOVEPAGE, move_when_paged, newelmrc);
save_option_on_off(NAMES, names_only, newelmrc);
save_option_on_off(NOHEADER, noheader, newelmrc);
save_option_on_off(POINTNEW, point_to_new, newelmrc);
save_option_on_off(PROMPTAFTER, prompt_after_pager, newelmrc);
save_option_on_off(RESOLVE, resolve_mode, newelmrc);
save_option_on_off(SAVENAME, save_by_name, newelmrc);
save_option_on_off(SOFTKEYS, hp_softkeys, newelmrc);
save_option_number(TIMEOUT, (int) timeout, newelmrc);
save_option_on_off(TITLES, title_messages, newelmrc);
save_option_number(USERLEVEL, user_level, newelmrc);
save_option_on_off(WARNINGS, warnings, newelmrc);
save_option_on_off(WEED, filter, newelmrc);
save_option_weedlist(WEEDOUT, newelmrc);
save_option_alternatives(ALTERNATIVES, alternative_addresses, newelmrc);
fclose(newelmrc);
if ( elminfo_fd != NULL ) {
fclose(elminfo_fd);
}
}
save_option_string(iindex, value, fd, underscores)
int iindex, underscores;
char *value;
FILE *fd;
{
/** Save a string option to the file... only subtlety is when we
save strings with spaces in 'em - translate to underscores!
**/
char buffer[SLEN], *bufptr;
add_comment(iindex, fd);
strcpy(buffer, value);
if (underscores)
for (bufptr = buffer; *bufptr; bufptr++)
if (*bufptr == SPACE) *bufptr = '_';
fprintf(fd, "%s = %s\n\n", save_info[iindex].name, buffer);
}
save_option_sort(iindex, fd)
int iindex;
FILE *fd;
{
/** save the current sorting option to a file **/
add_comment(iindex, fd);
fprintf(fd, "%s = %s\n\n", save_info[iindex].name,
sort_name(SHORT));
}
save_option_char(iindex, value, fd)
int iindex;
char value;
FILE *fd;
{
/** Save a character option to the file **/
add_comment(iindex, fd);
fprintf(fd, "%s = %c\n\n", save_info[iindex].name, value);
}
save_option_number(iindex, value, fd)
int iindex, value;
FILE *fd;
{
/** Save a binary option to the file - boy is THIS easy!! **/
add_comment(iindex, fd);
fprintf(fd, "%s = %d\n\n", save_info[iindex].name, value);
}
save_option_on_off(iindex, value, fd)
int iindex, value;
FILE *fd;
{
/** Save a binary option to the file - boy is THIS easy!! **/
add_comment(iindex, fd);
fprintf(fd, "%s = %s\n\n", save_info[iindex].name, onoff(value));
}
save_option_weedlist(iindex, fd)
int iindex;
FILE *fd;
{
/** save a list of weedout headers to the file **/
int length_so_far = 0, i;
add_comment(iindex, fd);
length_so_far = strlen(save_info[iindex].name) + 4;
fprintf(fd, "%s = ", save_info[iindex].name);
/** first off, skip till we get past the default list **/
for (i = 0; i < weedcount; i++)
if (strcmp(weedlist[i],"*end-of-defaults*") == 0)
break;
while (i < weedcount) {
if (strcmp(weedlist[i], "*end-of-defaults*") != 0)
break;
i++; /* and get PAST it too! */
}
while (i < weedcount) {
if (strlen(weedlist[i]) + length_so_far > 78) {
fprintf(fd, "\n\t");
length_so_far = 8;
}
fprintf(fd, "\"%s\" ", weedlist[i]);
length_so_far += (strlen(weedlist[i]) + 4);
i++;
}
fprintf(fd, "\t\"*end-of-user-headers*\"\n\n");
}
save_option_alternatives(iindex, list, fd)
int iindex;
struct addr_rec *list;
FILE *fd;
{
/** save a list of options to the file **/
int length_so_far = 0;
struct addr_rec *alternate;
if (list == NULL) return; /* nothing to do! */
add_comment(iindex, fd);
alternate = list; /* don't LOSE the top!! */
length_so_far = strlen(save_info[iindex].name) + 4;
fprintf(fd, "%s = ", save_info[iindex].name);
while (alternate != NULL) {
if (strlen(alternate->address) + length_so_far > 78) {
fprintf(fd, "\n\t");
length_so_far = 8;
}
fprintf(fd, "%s ", alternate->address);
length_so_far += (strlen(alternate->address) + 3);
alternate = alternate->next;
}
fprintf(fd, "\n\n");
}
add_comment(iindex, fd)
int iindex;
FILE *fd;
{
/** get to and add the comment to the file **/
char buffer[SLEN];
/** first off, add the comment from the comment file, if available **/
if (save_info[iindex].offset > 0L) {
if (fseek(elminfo, save_info[iindex].offset, 0) == -1) {
dprint(1,(debugfile,
"** error %s seeking to %ld in elm-info file!\n",
error_name(errno), save_info[iindex].offset));
}
else while (fgets(buffer, SLEN, elminfo) != NULL) {
if (buffer[0] != '#')
break;
else
fprintf(fd, "%s", buffer);
}
}
}
build_offset_table(elminfo_fd)
FILE *elminfo_fd;
{
/** read in the info file and build the table of offsets.
This is a rather laborious puppy, but at least we can
do a binary search through the array for each element and
then we have it all at once!
**/
char line_buffer[SLEN];
while (fgets(line_buffer, SLEN, elminfo_fd) != NULL) {
if (strlen(line_buffer) > 1)
if (line_buffer[0] != '#' && !whitespace(line_buffer[0])) {
no_ret(line_buffer);
if (find_and_store_loc(line_buffer, ftell(elminfo_fd))) {
dprint(1, (debugfile,"** Couldn't find and store \"%s\" **\n",
line_buffer));
}
}
}
}
find_and_store_loc(name, offset)
char *name;
long offset;
{
/** given the name and offset, find it in the table and store it **/
int first = 0, last, middle, compare;
last = NUMBER_OF_SAVEABLE_OPTIONS;
while (first <= last) {
middle = (first+last) / 2;
if ((compare = strcmp(name, save_info[middle].name)) < 0) /* a < b */
last = middle - 1;
else if (compare == 0) { /* a = b */
save_info[middle].offset = offset;
return(0);
}
else /* greater */ /* a > b */
first = middle + 1;
}
return(-1);
}