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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  * Please do not edit this file.
  3.  * It was generated using rpcgen.
  4.  */
  5. #include "gsqltrn.h"
  6. #include <stdio.h>
  7. #include <stdlib.h> /* getenv, exit */
  8. #include <signal.h>
  9. #include <sys/types.h>
  10. #include <memory.h>
  11. #include <stropts.h>
  12. #include <netconfig.h>
  13. #include <sys/resource.h> /* rlimit */
  14. #include <syslog.h>
  15. #ifdef DEBUG
  16. #define RPC_SVC_FG
  17. #endif
  18. #define _RPCSVC_CLOSEDOWN 120
  19. #define main  run_server
  20. #define RPC_SVC_FG
  21. #undef GSQL_TRN
  22. #define GSQL_TRN  rpc_program_id
  23. extern long  rpc_program_id;
  24. static int _rpcpmstart; /* Started by a port monitor ? */
  25. /* States a server can be in wrt request */
  26. #define _IDLE 0
  27. #define _SERVED 1
  28. static int _rpcsvcstate = _IDLE; /* Set when a request is serviced */
  29. static int _rpcsvccount = 0; /* Number of requests being serviced */
  30. static
  31. void _msgout(msg)
  32. char *msg;
  33. {
  34. #ifdef RPC_SVC_FG
  35. if (_rpcpmstart)
  36. syslog(LOG_ERR, msg);
  37. else
  38. (void) fprintf(stderr, "%sn", msg);
  39. #else
  40. syslog(LOG_ERR, msg);
  41. #endif
  42. }
  43. static void
  44. closedown(sig)
  45. int sig;
  46. {
  47. if (_rpcsvcstate == _IDLE && _rpcsvccount == 0) {
  48. extern fd_set svc_fdset;
  49. static int size;
  50. int i, openfd;
  51. struct t_info tinfo;
  52. if (!t_getinfo(0, &tinfo) && (tinfo.servtype == T_CLTS))
  53. exit(0);
  54. if (size == 0) {
  55. struct rlimit rl;
  56. rl.rlim_max = 0;
  57. getrlimit(RLIMIT_NOFILE, &rl);
  58. if ((size = rl.rlim_max) == 0) {
  59. return;
  60. }
  61. }
  62. for (i = 0, openfd = 0; i < size && openfd < 2; i++)
  63. if (FD_ISSET(i, &svc_fdset))
  64. openfd++;
  65. if (openfd <= 1)
  66. exit(0);
  67. } else
  68. _rpcsvcstate = _IDLE;
  69. (void) signal(SIGALRM, (void(*)()) closedown);
  70. (void) alarm(_RPCSVC_CLOSEDOWN/2);
  71. }
  72. static void
  73. gsql_trn_1(rqstp, transp)
  74. struct svc_req *rqstp;
  75. register SVCXPRT *transp;
  76. {
  77. union {
  78. init_params_t init_comp_1_arg;
  79. stmt_info_t compile_1_arg;
  80. seg_del_t del_segment_1_arg;
  81. link_cursor_t link_cursor_1_arg;
  82. string_t load_module_1_arg;
  83. insn_t execute_stmt_1_arg;
  84. } argument;
  85. char *result;
  86. bool_t (*xdr_argument)(), (*xdr_result)();
  87. char *(*local)();
  88. _rpcsvccount++;
  89. switch (rqstp->rq_proc) {
  90. case NULLPROC:
  91. (void) svc_sendreply(transp, xdr_void,
  92. (char *)NULL);
  93. _rpcsvccount--;
  94. _rpcsvcstate = _SERVED;
  95. return;
  96. case INIT_COMP:
  97. xdr_argument = xdr_init_params_t;
  98. xdr_result = xdr_result_t;
  99. local = (char *(*)()) init_comp_1;
  100. break;
  101. case COMPILE:
  102. xdr_argument = xdr_stmt_info_t;
  103. xdr_result = xdr_result_t;
  104. local = (char *(*)()) compile_1;
  105. break;
  106. case DEL_SEGMENT:
  107. xdr_argument = xdr_seg_del_t;
  108. xdr_result = xdr_result_t;
  109. local = (char *(*)()) del_segment_1;
  110. break;
  111. case LINK_CURSOR:
  112. xdr_argument = xdr_link_cursor_t;
  113. xdr_result = xdr_result_t;
  114. local = (char *(*)()) link_cursor_1;
  115. break;
  116. case LOAD_MODULE:
  117. xdr_argument = xdr_string_t;
  118. xdr_result = xdr_result_t;
  119. local = (char *(*)()) load_module_1;
  120. break;
  121. case EXECUTE_STMT:
  122. xdr_argument = xdr_insn_t;
  123. xdr_result = xdr_result_t;
  124. local = (char *(*)()) execute_stmt_1;
  125. break;
  126. case DB_CREATE:
  127. xdr_argument = xdr_void;
  128. xdr_result = xdr_result_t;
  129. local = (char *(*)()) db_create_1;
  130. break;
  131. case RETRY:
  132. xdr_argument = xdr_void;
  133. xdr_result = xdr_result_t;
  134. local = (char *(*)()) retry_1;
  135. break;
  136. case IS_RPC_READY:
  137. xdr_argument = xdr_void;
  138. xdr_result = xdr_int;
  139. local = (char *(*)()) is_rpc_ready_1;
  140. break;
  141. default:
  142. svcerr_noproc(transp);
  143. _rpcsvccount--;
  144. _rpcsvcstate = _SERVED;
  145. return;
  146. }
  147. (void) memset((char *)&argument, 0, sizeof (argument));
  148. if (!svc_getargs(transp, xdr_argument, &argument)) {
  149. svcerr_decode(transp);
  150. _rpcsvccount--;
  151. _rpcsvcstate = _SERVED;
  152. return;
  153. }
  154. result = (*local)(&argument, rqstp);
  155. if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
  156. svcerr_systemerr(transp);
  157. }
  158. if (!svc_freeargs(transp, xdr_argument, &argument)) {
  159. _msgout("unable to free arguments");
  160. exit(1);
  161. }
  162. _rpcsvccount--;
  163. _rpcsvcstate = _SERVED;
  164. return;
  165. }
  166. main()
  167. {
  168. pid_t pid;
  169. int i;
  170. char mname[FMNAMESZ + 1];
  171. (void) sigset(SIGPIPE, SIG_IGN);
  172. if (!ioctl(0, I_LOOK, mname) &&
  173. (!strcmp(mname, "sockmod") || !strcmp(mname, "timod"))) {
  174. char *netid;
  175. struct netconfig *nconf = NULL;
  176. SVCXPRT *transp;
  177. int pmclose;
  178. _rpcpmstart = 1;
  179. openlog("gsqltrn", LOG_PID, LOG_DAEMON);
  180. if ((netid = getenv("NLSPROVIDER")) == NULL) {
  181. /* started from inetd */
  182. pmclose = 1;
  183. } else {
  184. if ((nconf = getnetconfigent(netid)) == NULL)
  185. _msgout("cannot get transport info");
  186. pmclose = (t_getstate(0) != T_DATAXFER);
  187. }
  188. if (strcmp(mname, "sockmod") == 0) {
  189. if (ioctl(0, I_POP, 0) || ioctl(0, I_PUSH, "timod")) {
  190. _msgout("could not get the right module");
  191. exit(1);
  192. }
  193. }
  194. if ((transp = svc_tli_create(0, nconf, NULL, 0, 0)) == NULL) {
  195. _msgout("cannot create server handle");
  196. exit(1);
  197. }
  198. if (nconf)
  199. freenetconfigent(nconf);
  200. if (!svc_reg(transp, GSQL_TRN, BETA0, gsql_trn_1, 0)) {
  201. _msgout("unable to register (GSQL_TRN, BETA0).");
  202. exit(1);
  203. }
  204. if (pmclose) {
  205. (void) signal(SIGALRM, (void(*)()) closedown);
  206. (void) alarm(_RPCSVC_CLOSEDOWN/2);
  207. }
  208. svc_run();
  209. exit(1);
  210. /* NOTREACHED */
  211. } else {
  212. #ifndef RPC_SVC_FG
  213. int size;
  214. struct rlimit rl;
  215. pid = fork();
  216. if (pid < 0) {
  217. perror("cannot fork");
  218. exit(1);
  219. }
  220. if (pid)
  221. exit(0);
  222. rl.rlim_max = 0;
  223. getrlimit(RLIMIT_NOFILE, &rl);
  224. if ((size = rl.rlim_max) == 0)
  225. exit(1);
  226. for (i = 0; i < size; i++)
  227. (void) close(i);
  228. i = open("/dev/console", 2);
  229. (void) dup2(i, 1);
  230. (void) dup2(i, 2);
  231. setsid();
  232. openlog("gsqltrn", LOG_PID, LOG_DAEMON);
  233. #endif
  234. }
  235. if (!svc_create(gsql_trn_1, GSQL_TRN, BETA0, "netpath")) {
  236. _msgout("unable to create (GSQL_TRN, BETA0) for netpath.");
  237. exit(1);
  238. }
  239. svc_run();
  240. _msgout("svc_run returned");
  241. exit(1);
  242. /* NOTREACHED */
  243. }