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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  svr_lib.c  -  high level support library of GNU SQL server
  3.  *
  4.  *  This file is a part of GNU SQL Server
  5.  *
  6.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  7.  *  Developed at the Institute of System Programming
  8.  *  This file is written by Michael Kimelman
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  *
  24.  *  Contact: gss@ispras.ru
  25.  *
  26.  */
  27. /* $Id: svr_lib.c,v 1.246 1997/03/31 11:02:54 kml Exp $ */
  28. #include "setup_os.h"
  29. #include <sys/types.h>
  30. #if HAVE_SYS_IPC_H
  31. #include <sys/ipc.h>
  32. #endif
  33. #if HAVE_SYS_MSG_H
  34. #include <sys/msg.h>
  35. #endif
  36. #ifdef HAVE_UNISTD_H
  37. #include <unistd.h>
  38. #endif
  39. #include <signal.h>
  40. #include "global.h"
  41. #include "destrn.h"
  42. #include "strml.h"
  43. #include "inpop.h"
  44. #include "totdecl.h"
  45. static time_t last_req_tm;
  46. static i4_t    max_wait;   /* if client hasn't sent any request last *
  47.    * max_wait seconds => exit               */
  48. static struct msg_buf rbuf, sbuf;
  49. #define ALARM { last_req_tm = time (NULL); if (max_wait > 0) alarm (max_wait); }
  50. static volatile i4_t res_ready  = 0;
  51. static volatile i4_t need_ans   = 0;
  52. i4_t      rpc_program_id = 0;
  53. i4_t      static_sql_fl   = 1;    /* == 0 for dynamic SQL */
  54. extern pid_t     parent;
  55. extern i4_t       msqida, msqidt;
  56. extern i4_t       TRNUM;
  57. extern i4_t      minidnt;
  58. void trans_init (i4_t argc,char *args[]);
  59. /* 
  60.  * server signals SIGUSR1 && SIGUSR2 && SIGALRM handler 
  61.  */
  62. static RETSIGTYPE
  63. sig_serv_hnd (i4_t sig_num
  64. #if SA_SIGINFO
  65.               , siginfo_t *usr_info, void *addp
  66. #endif
  67.               )
  68. {
  69. #if SA_SIGINFO
  70.   if (usr_info)
  71.     {
  72.       if ( usr_info->si_pid != parent || 
  73.    ( (sig_num != SIGUSR1) && (sig_num != SIGUSR2)))
  74. return;
  75.     }
  76.   else if (sig_num != SIGALRM)
  77.       return;
  78. #endif
  79.   
  80.   switch (sig_num)
  81.     {
  82.     case SIGUSR1 : /* message from dispatcher is arrived */
  83.       rbuf.mtype = 0;
  84.       
  85.       PRINTF (("sig_serv_hnd: Waiting for message from dispatchern"));
  86.       
  87.       while (msgrcv (msqidt, (MSGBUFP)&rbuf, sizeof(i4_t), 0, 0) < 0) {}
  88.       
  89.       PRINTF (("sig_serv_hnd: Message received mtype = %dn",
  90.                (int)rbuf.mtype));
  91.       
  92.       if (rbuf.mtype == GETMIT)
  93. minidnt = t4bunpack (rbuf.mtext);
  94.       else /* rbuf.mtype == FINIT : finishing all works */
  95. exit(0);
  96.       break;
  97.       
  98.     case SIGUSR2 : /* dispatcher asks to send RES_READY when processing *
  99.                     * of current request'll be finished                 */
  100.       if (res_ready)
  101. {
  102.   t2bpack (RES_READY, sbuf.mtext);
  103.   ADM_SEND (TRNUM, size2b, "TRN.msgsnd: RES_READY to ADM");
  104.   need_ans = 0;
  105. }
  106.       else
  107. need_ans = 1;
  108.       break;
  109.       
  110.     case SIGALRM :   /* client hasn't been working with  *
  111.       * transaction for a i4_t time      */
  112.       if (res_ready) /* i_send isn't working now */
  113. {
  114.   i4_t wt_rest = last_req_tm + max_wait - time (NULL);
  115.   
  116.   if (wt_rest > 0)
  117.     alarm ((unsigned int)wt_rest);
  118.   else
  119.     exit(0);
  120. }
  121.     }
  122. } /* sig_usr_hnd */
  123. /* Server (transaction process) initialization */
  124. /* returns 0 if O'K or <0 if base.dat was not readed */
  125. int
  126. server_init (i4_t argc, char *args[])
  127. {
  128.   struct sigaction act;
  129.   sigset_t         set;
  130.   i4_t             res = 0;
  131.   
  132.   sigemptyset (&set);
  133.   sigaddset (&set, SIGUSR1);
  134.   sigaddset (&set, SIGUSR2);
  135. #ifdef SA_SIGINFO
  136.   act.sa_handler = NULL;
  137.   act.sa_sigaction = sig_serv_hnd;
  138.   act.sa_mask = set;
  139.   act.sa_flags = SA_SIGINFO;
  140. #else
  141.   act.sa_handler = sig_serv_hnd;
  142.   act.sa_mask = set;
  143.   act.sa_flags = 0;
  144. #endif
  145.   
  146.   if (sigaction (SIGUSR1, &act, NULL) ||
  147.       sigaction (SIGUSR2, &act, NULL) ||
  148.       sigaction (SIGALRM, &act, NULL)   )
  149.     exit (1);
  150.   res = initbas();
  151.   trans_init (argc, args);
  152.   
  153.   max_wait    = atoi(args[11]);
  154.   ALARM;
  155.   
  156.   rpc_program_id = atoi(args[12]);
  157.   if (argc > 13 )
  158.     current_user_login_name = savestring(args[13]);
  159.   return res;
  160. } /* server_init */
  161. void 
  162. start_processing(void)
  163. {
  164.   res_ready = 0;
  165.   need_ans  = 0;
  166.   ALARM;
  167. }
  168. i4_t 
  169. finish_processing(void)
  170. {
  171.   res_ready=1;
  172.   ALARM;
  173.   if (need_ans) /* client isn't waiting for result from i_send *
  174.  * client will take it from i_rcv              */
  175.     {
  176.       t2bpack (RES_READY, sbuf.mtext);
  177.       ADM_SEND (TRNUM, size2b, "TRN.msgsnd: RES_READY to ADM");
  178.       need_ans = 0;
  179.       return 0;
  180.     }
  181.   return 1;
  182. }
  183. #undef is_ready_1
  184. #undef is_ready_1_svc
  185. RPC_SVC_PROTO(i4_t,void,is_started,1)
  186. {
  187.   static i4_t rc = 1;
  188.   finish_processing();
  189.   return &rc;
  190. }