- define(c, newstr(buf), CurEnv);
- }
-}
-\f/*
-** FREEZE -- freeze BSS & allocated memory
-**
-** This will be used to efficiently load the configuration file.
-**
-** Parameters:
-** freezefile -- the name of the file to freeze to.
-**
-** Returns:
-** none.
-**
-** Side Effects:
-** Writes BSS and malloc'ed memory to freezefile
-*/
-
-# ifdef FROZENCONFIG
-
-union frz
-{
- char frzpad[BUFSIZ]; /* insure we are on a BUFSIZ boundary */
- struct
- {
- time_t frzstamp; /* timestamp on this freeze */
- char *frzbrk; /* the current break */
- char *frzedata; /* address of edata */
- char *frzend; /* address of end */
- char frzver[252]; /* sendmail version */
- } frzinfo;
-};
-
-#if defined(__hpux) || defined(__alpha)
-#define BRK_TYPE int
-#define SBRK_TYPE void *
-#else
-#define BRK_TYPE char *
-#define SBRK_TYPE char *
-#endif
-
-freeze(freezefile)
- char *freezefile;
-{
- int f;
- union frz fhdr;
- extern SBRK_TYPE sbrk();
- extern char edata, end;
- extern char Version[];
-
- if (freezefile == NULL)
- return;
-
- /* try to open the freeze file */
- f = creat(freezefile, FileMode);
- if (f < 0)
- {
- syserr("Cannot freeze %s", freezefile);
- errno = 0;
- return;
- }
-
- /* build the freeze header */
- fhdr.frzinfo.frzstamp = curtime();
- fhdr.frzinfo.frzbrk = sbrk(0);
- fhdr.frzinfo.frzedata = &edata;
- fhdr.frzinfo.frzend = &end;
- (void) strcpy(fhdr.frzinfo.frzver, Version);
-
- /* write out the freeze header */
- if (write(f, (char *) &fhdr, sizeof fhdr) != sizeof fhdr ||
- write(f, (char *) &edata, (int) (fhdr.frzinfo.frzbrk - &edata)) !=
- (int) (fhdr.frzinfo.frzbrk - &edata))
- {
- syserr("Cannot freeze %s", freezefile);
- }
-
- /* fine, clean up */
- (void) close(f);
-}
-\f/*
-** THAW -- read in the frozen configuration file.
-**
-** Parameters:
-** freezefile -- the name of the file to thaw from.
-** binfile -- the name of the sendmail binary (ok to guess).
-**
-** Returns:
-** TRUE if it successfully read the freeze file.
-** FALSE otherwise.
-**
-** Side Effects:
-** reads freezefile in to BSS area.
-*/
-
-thaw(freezefile, binfile)
- char *freezefile;
- char *binfile;
-{
- int f;
- register char *p;
- union frz fhdr;
- char hbuf[60];
- struct stat fst, sst;
- extern char edata, end;
- extern char Version[];
- extern char **myhostname();
- extern BRK_TYPE brk();
-
- if (freezefile == NULL)
- return (FALSE);
-
- /* open the freeze file */
- f = open(freezefile, 0);
- if (f < 0)
- {
- errno = 0;
- return (FALSE);