mjipc.c
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:5k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  mjipc.c  -  Interprocess communications of Microjournal
  3.  *              Kernel of GNU SQL-server. Microjournal 
  4.  *
  5.  *  This file is a part of GNU SQL Server
  6.  *
  7.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  8.  *  Developed at the Institute of System Programming
  9.  *  This file is written by  Vera Ponomarenko
  10.  *
  11.  *  This program is free software; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program; if not, write to the Free Software
  23.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24.  *
  25.  *  Contacts:   gss@ispras.ru
  26.  *
  27.  */
  28. /* $Id: mjipc.c,v 1.246 1997/03/31 11:05:11 kml Exp $ */
  29. #include "setup_os.h"
  30. #include "xmem.h"
  31. #include <sys/types.h>
  32. #if HAVE_FCNTL_H
  33. #include <fcntl.h>
  34. #endif
  35. #if HAVE_UNISTD_H
  36. #include <unistd.h>
  37. #endif
  38. #if HAVE_SYS_IPC_H
  39. #include <sys/ipc.h>
  40. #endif
  41. #if HAVE_SYS_MSG_H
  42. #include <sys/msg.h>
  43. #endif
  44. #include "rnmtp.h"
  45. #include "pupsi.h"
  46. #include "strml.h"
  47. #include "inpop.h"
  48. #include "fdeclmj.h"
  49. i4_t    msqidl, msqidm;
  50. extern i4_t     fdmj;
  51. extern i4_t     REDLINE;
  52. extern i4_t     MPAGE;
  53. extern struct  ADBL ABLOCK;
  54. void
  55. main (i4_t argc, char **argv)
  56. {
  57.   i4_t op, rep;
  58.   key_t keymj, keylj;
  59.   struct msg_buf rbuf, sbuf;
  60.   char *pnt, *mj_name;
  61.   u2_t trnum, sz;
  62.   struct ADBL admj;
  63.   MEET_DEBUGGER;
  64.   
  65.   setbuf (stdout, NULL);
  66.   mj_name = argv[1];
  67.   sscanf (argv[2], "%d", &REDLINE);
  68.   sscanf (argv[3], "%d", &MPAGE);
  69.   {
  70.     i4_t long_key;
  71.     sscanf (argv[4], "%d", &long_key);
  72.     keymj = long_key;
  73.     sscanf (argv[5], "%d", &long_key);
  74.     keylj = long_key;
  75.     }
  76.   PRINTF (("MJ.main: mj_name = %s, REDLINE = %d, MPAGE = %dn",
  77.            mj_name, REDLINE, MPAGE));
  78.   rep = INI (mj_name); /* MJ-file name */
  79.   
  80.   if ((msqidm = msgget (keymj, IPC_CREAT | DEFAULT_ACCESS_RIGHTS)) < 0)
  81.     {
  82.       perror ("MJ.msgget: Queue for MJ");
  83.       exit (1);
  84.     }
  85.   ans_mj (rep);
  86.   PRINTF (("MJ.main: after ans_mj keymj = %d, keylj = %dn", keymj, keylj));
  87.   __MSGRCV(msqidm, &rbuf, 0, INIMJ, 0,"MJ.msgrcv: INI MJ");
  88.   PRINTF (("MJ.main: before MSG_INIT mj_name = %sn", mj_name));
  89.   MSG_INIT (msqidl, keylj, "MJ");
  90.   
  91.   for (;;)
  92.     {
  93.       __MSGRCV(msqidm, &rbuf, RPAGE, -(ANSMJ - 1), 0,"MJ.msgrcv: Queue for MJ");
  94.       op = rbuf.mtype;
  95.       pnt = rbuf.mtext;
  96.       switch (op)
  97. {
  98. case PUTBL:
  99.   BUFUPACK(pnt,trnum);
  100.   BUFUPACK(pnt,sz);
  101.   putbl (sz, pnt);
  102.   sbuf.mtype = trnum;
  103.   TPACK(ABLOCK,sbuf.mtext);
  104.   __MSGSND(msqidm, &sbuf, sizeof (struct ADBL), 0,
  105.                    "MJ.msgsnd: Answer to TRN");
  106.   break;
  107. case GETBL:
  108.   BUFUPACK(pnt,trnum);
  109.           bcopy (pnt, (char *) &admj, sizeof (struct ADBL));
  110.   get_rec (sbuf.mtext, admj, fdmj);
  111.   sbuf.mtype = trnum;
  112.   __MSGSND(msqidm, &sbuf, SZMSGBUF, 0,"MJ.msgsnd: Answer to TRN");
  113.   break;
  114. case OUTDISK:
  115.   outdisk (t2bunpack (pnt));
  116.   ans_buf ();
  117.   break;
  118. case DOFIX:
  119.   /*                     dofix((struct TOPJOUR *)pnt); */
  120.   dofix (pnt);
  121.   ans_buf ();
  122.   break;
  123. case STATEMJ:
  124. /*        rep=ask();*/
  125.   ans_mj (rep);
  126.   break;
  127. case FINIT:
  128.   finit (mj_name);
  129.   break;
  130. default:
  131.   perror ("MJ.main: No such operation");
  132.   break;
  133. }
  134.     }
  135. }
  136. void
  137. LJ_ovflmj ()
  138. {
  139.   struct msg_buf sbuf;
  140.   sbuf.mtype = OVFLMJ;
  141.   __MSGSND(msqidl, &sbuf, 0, 0,"MJ.msgsnd: OVFLMJ");
  142. }
  143. void
  144. ans_buf ()
  145. {
  146.   struct msg_buf sbuf;
  147.   sbuf.mtype = ANSMJ;
  148.   __MSGSND(msqidm, &sbuf, 0, 0,"MJ.msgsnd: Answer BUF");
  149. }
  150. void
  151. ans_mj (char rep)
  152. {
  153.   struct msg_buf sbuf;
  154.   sbuf.mtype = ANSMJ;
  155.   sbuf.mtext[0] = rep;
  156.   __MSGSND(msqidm, &sbuf, 1, 0,"MJ.msgsnd: Answer ADM");
  157. }
  158. int
  159. ask ()
  160. {
  161.   i4_t rep;
  162.   rep = 0;
  163.   return (rep);
  164. }
  165. void
  166. ADM_ERRFU (i4_t p)
  167. {
  168. #if 1 
  169.   perror ("MJ. ERRFU");
  170. #else
  171.   struct msg_buf sbuf;
  172.   sbuf.mtype = ERRFU;
  173.   sbuf.mtext[0] = (char) p;
  174.   sbuf.mtext[1] = MJ_PPS;
  175.   __MSGSND(msqida, &sbuf, 2, 0,"MJ. ERRFU");
  176. #endif
  177. }
  178. void
  179. finit (char *mj_name)
  180. {
  181.   i4_t rep;
  182.   mjini (mj_name);
  183.   rep = close (fdmj);
  184.   ans_mj (rep);
  185.   exit(0);
  186. }
  187. void
  188. mjini (char *mj_name)
  189. {
  190.   i4_t NV;
  191.   static i4_t fdmj = 0;
  192.   char page[RPAGE];
  193.   /* the initialization of MJ */
  194.   NV = 0;
  195.   if (fdmj != 0)
  196.     close (fdmj);
  197.   unlink (mj_name);
  198.   if ((fdmj = open (mj_name, O_RDWR | O_CREAT, DEFAULT_ACCESS_RIGHTS)) < 0)
  199.     {
  200.       perror ("MJ: open error");
  201.       exit (1);
  202.     }
  203.   t4bpack (NV, page);
  204.   if (write (fdmj, page, RPAGE) != RPAGE)
  205.     {
  206.       perror ("MJ: write error");
  207.       exit (1);
  208.     }
  209. }