home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Lib / tai / init_tai.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  6.7 KB  |  371 lines

  1. /* init_tai.c: tailoring initialisation */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/tai/RCS/init_tai.c,v 6.0 1991/12/18 20:24:59 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Lib/tai/RCS/init_tai.c,v 6.0 1991/12/18 20:24:59 jpo Rel $
  9.  *
  10.  * $Log: init_tai.c,v $
  11.  * Revision 6.0  1991/12/18  20:24:59  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "head.h"
  19. #include <sys/stat.h>
  20. #include <isode/tailor.h>
  21. #include <fcntl.h>
  22. #include <varargs.h>
  23.  
  24. #define MAXTAIARGS    100
  25. #define COMMENTCHAR    '#'
  26.  
  27.  
  28. extern char        *pptailor,
  29.             *isodelogpath,
  30.             *tbldfldir,
  31.             *logdfldir;
  32.  
  33. static char        *getlines();
  34. static void pp_tailor_export ();
  35. static void pp_log_init ();
  36. extern void err_abrt ();
  37. static void pp_log_export ();
  38. static int  tai_read();
  39. extern void siginit ();
  40. extern char chrcnv[];
  41.  
  42. /* ---------------------  Begin     Routines  -------------------------------- */
  43.  
  44. #define LEXEQU(a,b)    (chrcnv[(a[0])] == chrcnv[(b[0])] && lexequ((a),(b))== 0)
  45.  
  46.  
  47. int sys_init (name)
  48. char    *name;
  49. {
  50.     return pp_initialise (name, TAI_ALL);
  51. }
  52.  
  53. pp_initialise (name, flags)
  54. char    *name;
  55. int    flags;
  56. {
  57.     char        buf[BUFSIZ],
  58.             *args[MAXTAIARGS],
  59.             *lineptr,
  60.             *rname;
  61.     static char onceonly = 0;
  62.     int        ac;
  63.  
  64.  
  65.     if ((rname = rindex (name, '/')) != NULLCP)
  66.         rname ++;
  67.     if (rname == NULLCP || *rname == 0)
  68.         rname = name;
  69.  
  70.  
  71.     ll_hdinit (pp_log_oper, rname);
  72.     ll_hdinit (pp_log_stat, rname);
  73.     ll_hdinit (pp_log_norm, rname);
  74.     isodetailor (rname, 0);
  75.  
  76.     if (onceonly ++)
  77.         return OK;
  78.  
  79.     if (flags & TAI_SIGNALS)
  80.         siginit();
  81.  
  82.     pp_log_init (flags);
  83.  
  84.     (void) sprintf (buf, "%s/", logdfldir);
  85.     isodelogpath = strdup (buf);
  86.  
  87.  
  88.     if (tai_read (pptailor) == NOTOK)
  89.         err_abrt (RP_FIO,
  90.               "Lib/init_tai.c: Cannot open tailor file '%s'",
  91.               pptailor);
  92.  
  93.     while ((lineptr = getlines ()) != NULLCP) {
  94.         if (*lineptr == '\0')
  95.             continue;
  96.         PP_DBG (("tailor line='%s'", buf));
  97.         if ((ac = sstr2arg (lineptr, MAXTAIARGS,
  98.                     args, " \t,")) == NOTOK)
  99.             err_abrt (RP_MECH,
  100.                   "Lib/init_tai.c: too many tailor params");
  101.  
  102.         if (ac <= 1)
  103.             continue;
  104.  
  105.         
  106.         if (LEXEQU (args[0], "chan") &&
  107.             chan_tai (ac, args) == OK)
  108.             continue;
  109.  
  110.         if (LEXEQU (args[0], "tbl") &&
  111.             tbl_tai (ac, args) == OK)
  112.             continue;
  113.             
  114.         if (sys_tai (ac, args) == OK)
  115.             continue;
  116.  
  117.         if (LEXEQU (rname, args[0])) {
  118.             PP_DBG (("Adding tailor %s for %s",
  119.                  args[1], rname));
  120.             (void) sys_tai (ac - 1, &args[1]);
  121.         }
  122.     }
  123.  
  124.     pp_tailor_export (flags);
  125.     if (flags & TAI_LOGS)
  126.         pp_log_export ();
  127.     return OK;
  128. }
  129.  
  130.  
  131.  
  132.  
  133. /* ---------------------  Static  Routines  ------------------------------- */
  134.  
  135.  
  136.  
  137.  
  138. static void pp_tailor_export (flags)
  139. int    flags;
  140. {
  141.     extern char    *cmddfldir, *chndfldir, *formdfldir,
  142.             *quedfldir,
  143.             *ppdbm, *wrndfldir, *x400_mta, *loc_dom_mta;
  144.     extern char    *dupfpath();
  145.     char        buf[BUFSIZ];
  146.  
  147.  
  148.     if (flags & TAI_LOGS) {
  149.         if (isodelogpath)
  150.             free (isodelogpath);
  151.  
  152.         (void) sprintf (buf, "%s/", logdfldir);
  153.         isodelogpath = strdup (buf);
  154.     }
  155.     isodexport (NULLCP);
  156.  
  157.     chndfldir        = dupfpath (cmddfldir, chndfldir);
  158.     formdfldir        = dupfpath (cmddfldir, formdfldir);
  159.     ppdbm            = dupfpath (tbldfldir, ppdbm);
  160.     wrndfldir        = dupfpath (tbldfldir, wrndfldir);
  161.     if (x400_mta == NULLCP)
  162.         x400_mta = strdup (loc_dom_mta);
  163. }
  164.  
  165. static char *pp_tailor_str, *ppt_ptr;
  166. static int tlineno;
  167.  
  168. static int tai_read (file)
  169. char *file;
  170. {
  171.     int fd;
  172.     struct stat st;
  173.  
  174.     tlineno = 1;
  175.     if ((fd = open (file, O_RDONLY, 0)) == NOTOK)
  176.         return NOTOK;
  177.     if (fstat (fd, &st) == NOTOK) {
  178.         (void) close (fd);
  179.         return NOTOK;
  180.     }
  181.     ppt_ptr = pp_tailor_str = smalloc ((int)st.st_size + 1);
  182.     if (read (fd, pp_tailor_str, (int)st.st_size) != st.st_size) {
  183.         (void) close (fd);
  184.         return NOTOK;
  185.     }
  186.     pp_tailor_str[st.st_size] = 0;
  187.     (void) close (fd);
  188.     return OK;
  189. }
  190.  
  191.  
  192.  
  193. static char    *getlines ()
  194. {
  195.     register char *p = ppt_ptr;
  196.     char *base;
  197.     register char *lastp;
  198.  
  199. #define skipto(x)  while(*p && *p != (x)) p ++;
  200.  
  201.     while (*p == COMMENTCHAR || *p == '\n') {
  202.         skipto ('\n');
  203.         tlineno ++;
  204.         if (p) p++;
  205.     }
  206.  
  207.     if (*p == '\0') {
  208.         ppt_ptr = p;
  209.         return NULLCP;
  210.     }
  211.  
  212.     base = p;
  213.     lastp = NULLCP;
  214.     while (1) {
  215.         skipto ('\n');
  216.         tlineno ++;
  217.         if (*p == '\n')
  218.             *p = ' ';
  219.         else break;
  220.         if (lastp == NULLCP) lastp = p;
  221.         if (p[1] == COMMENTCHAR) {
  222.             continue;
  223.         } else if (p[1] == ' ' || p[1] == '\t') {
  224.             if (lastp)
  225.                 while (lastp < p) *lastp++ = ' ';
  226.             lastp = NULLCP;
  227.             continue;
  228.         }
  229.         break;
  230.     }
  231. #undef skipto
  232.     if (p && *p) *p++ = '\0';
  233.     if (lastp) *lastp = '\0';
  234.     ppt_ptr = p;
  235.     return base;
  236. }
  237.  
  238.  
  239. static void tai_def_eh (str)
  240. char *str;
  241. {
  242.     PP_LOG (LLOG_EXCEPTIONS, ("%s", str));
  243. }
  244.  
  245. static VFP teh = tai_def_eh;
  246.  
  247. void tai_seterrorhandler (fnx)
  248. VFP fnx;
  249. {
  250.     if (fnx == NULLVFP)
  251.         teh = tai_def_eh;
  252.     else
  253.         teh = fnx;
  254. }
  255.  
  256. #ifdef lint
  257. /* VARARGS1 */
  258. void tai_error (fmt)
  259. char *fmt;
  260. {
  261.     tai_error (fmt);
  262. }
  263. #else
  264. void tai_error (va_alist)
  265. va_dcl
  266. {
  267.     char buf[BUFSIZ];
  268.     char buf2[BUFSIZ];
  269.     va_list ap;
  270.  
  271.     va_start (ap);
  272.     _asprintf (buf, NULLCP, ap);
  273.     (void) sprintf (buf2, "Tailor error in entry ending line %d: %s\n",
  274.             tlineno, buf);
  275.     (teh)(buf2);
  276.     va_end (ap);
  277. }
  278. #endif
  279. /* ------------------------------------------------------------------ */
  280. struct logpairs {
  281.     LLog    **isode_log;
  282.     LLog    **isode_save;
  283.     char    *name;
  284.     char    *level;
  285. };
  286.  
  287.  
  288. #define NULLOG    ((LLog **)0)
  289.  
  290. static LLog
  291. #ifdef X25
  292.     *log_x25,
  293. #endif
  294.     *log_acsap,
  295.     *log_addr,
  296.     *log_compat,
  297.     *log_psap,
  298.     *log_psap2,
  299.     *log_rosap,
  300.     *log_rtsap,
  301.     *log_ssap,
  302.     *log_tsap;
  303.  
  304. static struct logpairs logpairs[] = {
  305.     &acsap_log,    &log_acsap,    "acsap",    "acsaplevel",
  306.     &addr_log,    &log_addr,    "addr",        "addrlevel",
  307.     &compat_log,    &log_compat,    "compat",    "compatlevel",
  308.     &psap2_log,    &log_psap2,    "psap2",    "psap2level",
  309.     &psap_log,    &log_psap,    "psap",        "psaplevel",
  310.     &rosap_log,    &log_rosap,    "rosap",    "rosaplevel",
  311.     &rtsap_log,    &log_rtsap,    "rtsap",    "rtsaplevel",
  312.     &ssap_log,    &log_ssap,    "ssap",        "ssaplevel",
  313.     &tsap_log,    &log_tsap,    "tsap",        "tsaplevel",
  314. #ifdef X25
  315.     &x25_log,    &log_x25,    "x25",        "x25level",
  316. #endif
  317.     0
  318. };
  319.  
  320. static LLog zdummy = {
  321.     "dummy.log", NULLCP, NULLCP,
  322.     LLOG_FATAL | LLOG_EXCEPTIONS | LLOG_NOTICE, LLOG_FATAL, -1,
  323.     LLOGCLS | LLOGCRT | LLOGZER, NOTOK
  324. };
  325. static LLog *dummy = &zdummy;
  326.  
  327.  
  328. static void pp_log_init (flags)
  329. int    flags;
  330. {
  331.     struct logpairs *lp;
  332.  
  333.     for (lp = logpairs; lp -> name; lp ++) {
  334.         if (flags & TAI_LOGS)
  335.             **(lp -> isode_log) = *pp_log_norm;
  336.         *(lp -> isode_save) = *(lp -> isode_log);
  337.         if (flags & TAI_LOGS)
  338.             *(lp -> isode_log) = dummy;
  339.     }
  340. }
  341.  
  342. static void pp_log_export()
  343. {
  344.     struct logpairs *lp;
  345.  
  346.     for (lp = logpairs; lp -> name; lp++)
  347.         *(lp -> isode_log) = *(lp -> isode_save);
  348. }
  349.  
  350. void pp_setlog (argv, argc)
  351. char    *argv[];
  352. int    argc;
  353. {
  354.     struct logpairs *lp;
  355.  
  356.     if (argc < 1)
  357.         return;
  358.  
  359.     for (lp = logpairs; lp -> name; lp ++) {
  360.         if (lexequ (argv[0], lp -> level) == 0)
  361.             break;
  362.     }
  363.  
  364.     if (lp -> name == NULLCP) {
  365.         PP_LOG (LLOG_EXCEPTIONS, ("level %s not found",
  366.                       argv[0]));
  367.         return;
  368.     }
  369.     log_tai (*(lp -> isode_save), &argv[1], argc - 1);
  370. }
  371.