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

  1. /* rd_msg.c: read in a msg from the queue + write addr offset routines */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/io/RCS/rd_msg.c,v 6.0 1991/12/18 20:22:26 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Lib/io/RCS/rd_msg.c,v 6.0 1991/12/18 20:22:26 jpo Rel $
  9.  *
  10.  * $Log: rd_msg.c,v $
  11.  * Revision 6.0  1991/12/18  20:22:26  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. /*
  19. -- These routines are 'high level' taking care of most of the housekeeping. --
  20. */
  21.  
  22.  
  23.  
  24. #include        "head.h"
  25. #include        "q.h"
  26. #include        <fcntl.h>
  27. #include        <isode/cmd_srch.h>
  28. #include        "prm.h"
  29.  
  30.  
  31. extern    void getfpath ();
  32. extern    long lseek ();
  33.  
  34. extern  int     errno;
  35. extern  char    *aquefile,
  36.         *no2txt3();
  37. static  FILE    *msg_fp;
  38. static  char    msgname[MAXPATHLENGTH];
  39. int             ad_count;
  40.  
  41.  
  42. void    rd_end ();
  43.  
  44. /* ---------------------  Read Message Routines  -------------------------- */
  45.  
  46.  
  47.  
  48. int rd_msg_file (mdir, prm, que, sender, recip, rcount, mode)
  49. char            *mdir;
  50. struct prm_vars *prm;
  51. Q_struct        *que;
  52. ADDR            **sender;
  53. ADDR            **recip;
  54. int             *rcount;
  55. int        mode;
  56. {
  57.     int     retval;
  58.     extern char *quedfldir;
  59.  
  60.     (void) sprintf (msgname, "%s/%s", mdir, aquefile);
  61.     PP_DBG (("Lib/io/rd_msg(%s)", msgname));
  62.  
  63.     switch (mode) {
  64.         default:
  65.         return RP_MECH;
  66.  
  67.         case RDMSG_RDONLY:
  68.         if ((msg_fp = fopen (msgname, "r")) == NULLFILE) {
  69.             PP_SLOG (LLOG_EXCEPTIONS, msgname,
  70.                  ("Lib/io/rd_msg flckopen error"));
  71.             return RP_FOPN;
  72.         }
  73.         break;
  74.         case RDMSG_RDWR:
  75.         case RDMSG_RDONLYLCK:
  76.         if ((msg_fp = flckopen (msgname,
  77.                     mode == RDMSG_RDWR ? "r+" : "r"))
  78.             == NULLFILE) {
  79.             PP_SLOG (LLOG_EXCEPTIONS, msgname,
  80.                  ("Lib/io/rd_msg flckopen error"));
  81.             return (RP_FOPN);
  82.         }
  83.         break;
  84.     }
  85.  
  86.     if (rp_isbad (retval = rd_prm (prm, msg_fp))) {
  87.         PP_LOG (LLOG_EXCEPTIONS,
  88.             ("Lib/io/rd_msg/rd_prm err: '%s'", msgname));
  89.         rd_end();
  90.         return (retval);
  91.     }
  92.  
  93.     if (rp_isbad (retval = rd_q (que, msg_fp))) {
  94.         PP_LOG (LLOG_EXCEPTIONS,
  95.             ("Lib/io/rd_msg/rd_q err: '%s'", msgname));
  96.         rd_end();
  97.         return (retval);
  98.     }
  99.  
  100.     if (rp_isbad (retval = rd_adr (msg_fp, TRUE, sender))) {
  101.         PP_LOG (LLOG_EXCEPTIONS,
  102.             ("Lib/io/rd_msg/rd_adr sender err: %s %s",
  103.             rp_valstr (retval), msgname));
  104.         rd_end();
  105.         return (retval);
  106.     }
  107.  
  108.     ad_count = 0;
  109.  
  110.     if (rp_isbad (retval = rd_adr (msg_fp, FALSE, recip))) {
  111.         PP_LOG (LLOG_EXCEPTIONS,
  112.             ("Lib/io/rd_msg/rd_adr recip err: %s %s",
  113.             rp_valstr(retval), msgname));
  114.         rd_end();
  115.         return (retval);
  116.     }
  117.  
  118.     que -> Oaddress = *sender;
  119.     que -> Raddress = *recip;
  120.     *rcount = ad_count;
  121.  
  122.     return (RP_OK);
  123. }
  124.  
  125.  
  126.  
  127.  
  128. void rd_end ()
  129. {
  130.     PP_DBG (("Lib/io/rd_end()"));
  131.     if (msg_fp)  (void) flckclose (msg_fp);
  132.     msg_fp = NULLFILE;
  133. }
  134.  
  135.  
  136.  
  137.  
  138. /* ---------------------  Write Address Offset Routines  ------------------ */
  139.  
  140.  
  141.  
  142.  
  143. int wr_ad_status (ap, status)
  144. ADDR    *ap;
  145. int     status;
  146. {
  147.     char                    *str;
  148.     extern  CMD_TABLE       atbl_status[];
  149.  
  150.     PP_DBG (("Lib/io/wr_ad_status()"));
  151.  
  152.     if (msg_fp == NULLFILE) {
  153.         PP_LOG (LLOG_EXCEPTIONS,
  154.             ("Lib/io/wr_ad_status (NULLFILE)"));
  155.         return (RP_MECH);
  156.     }
  157.  
  158.     switch (status) {
  159.         case AD_STAT_PEND:
  160.         case AD_STAT_DONE:
  161.         case AD_STAT_DRREQUIRED:
  162.         case AD_STAT_DRWRITTEN:
  163.         break;
  164.         default:
  165.         PP_LOG (LLOG_EXCEPTIONS,
  166.             ("Lib/io/wr_ad_status unknown"));
  167.         status = AD_STAT_UNKNOWN;
  168.         break;
  169.     }
  170.     str = rcmd_srch (status, atbl_status);
  171.  
  172.     if (lseek (fileno (msg_fp), ap -> ad_stat_offset, 0) == -1) {
  173.         PP_LOG (LLOG_FATAL,
  174.             ("Lib/io/wr_ad_status lseek err %s", msgname));
  175.         return (RP_FIO);
  176.     }
  177.  
  178.  
  179.     if (write (fileno (msg_fp), str, 4) != 4) {
  180.         PP_LOG (LLOG_FATAL,
  181.             ("Lib/io/wr_ad_status write err %s", msgname));
  182.         return (RP_FIO);
  183.     }
  184.     return (RP_OK);
  185. }
  186.  
  187. int wr_ad_rcntno (ap, rcnt)
  188. ADDR    *ap;
  189. int     rcnt;
  190. {
  191.     char    buf[5];
  192.  
  193.     PP_DBG (("Lib/io/wr_ad_rcntno(%d)", rcnt));
  194.  
  195.     if (msg_fp == NULLFILE) {
  196.         PP_LOG (LLOG_EXCEPTIONS, ("Lib/io/wr_ad_rcntno (NULLFILE)"));
  197.         return (RP_MECH);
  198.     }
  199.  
  200.     if (lseek (fileno (msg_fp), ap -> ad_rcnt_offset, 0) == -1) {
  201.         PP_LOG (LLOG_FATAL,
  202.             ("Lib/io/wr_ad_rcntno lseek err %s", msgname));
  203.         return (RP_FIO);
  204.     }
  205.  
  206.     if (write (fileno (msg_fp), no2txt3 (rcnt, &buf[0]), 3) != 3) {
  207.         PP_LOG (LLOG_FATAL,
  208.             ("Lib/io/wr_ad_rcntno write err %s", msgname));
  209.         return (RP_FIO);
  210.     }
  211.     return (RP_OK);
  212. }
  213.  
  214. int wr_q_nwarns (q)
  215. Q_struct    *q;
  216. {
  217.     char    buf[5];
  218.  
  219.     PP_DBG (("Lib/io/wr_q_nwarns(%d)", q->nwarns));
  220.  
  221.     if (msg_fp == NULLFILE) {
  222.         PP_LOG (LLOG_EXCEPTIONS, ("Lib/io/wr_q_nwarns (NULLFILE)"));
  223.         return (RP_MECH);
  224.     }
  225.  
  226.     if (lseek (fileno (msg_fp), q -> nwarns_offset, 0) == -1) {
  227.         PP_LOG (LLOG_FATAL,
  228.             ("Lib/io/wr_q_nwarns lseek err %s", msgname));
  229.         return (RP_FIO);
  230.     }
  231.  
  232.     if (write (fileno (msg_fp), no2txt3 (q->nwarns, &buf[0]), 3) != 3) {
  233.         PP_LOG (LLOG_FATAL,
  234.             ("Lib/io/wr_q_nwarns write err %s", msgname));
  235.         return (RP_FIO);
  236.     }
  237.     return (RP_OK);
  238. }
  239.  
  240.