sm_svc.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 227 行
C
227 行
# ifndef lintstatic char *sccsid = "@(#)sm_svc.c 4.1 (ULTRIX) 7/2/90";# endif not lint/**************************************************************** * * * Licensed to Digital Equipment Corporation, Maynard, MA * * Copyright 1985 Sun Microsystems, Inc. * * All rights reserved. * * * ****************************************************************//**//* * Modification history: * ~~~~~~~~~~~~~~~~~~~~ * * revision comments * -------- ----------------------------------------------- * * 3-Feb-88 fries * Removed commenting to allow parent to exit * if debug == 0 and nofork == 0. * * 18-Jan-88 fries * Added Header and Copyright notice. * * */#include <stdio.h>#include <signal.h>#include <rpc/rpc.h>#include <sys/ioctl.h>#include <rpcsvc/sm_inter.h>#include "sm_statd.h"#define current0 "/etc/sm"#define backup0 "/etc/sm.bak"#define state0 "/etc/state"#define current1 "sm"#define backup1 "sm.bak"#define state1 "state"char STATE[20], CURRENT[20], BACKUP[20];int debug = 0;extern crash_notice(), recovery_notice(), sm_try();/*!!!*/debug_exit(){ exit(2);}static voidsm_prog_1(rqstp, transp) struct svc_req *rqstp; SVCXPRT *transp;{ union { struct sm_name sm_stat_1_arg; struct mon sm_mon_1_arg; struct mon_id sm_unmon_1_arg; struct my_id sm_unmon_all_1_arg; struct stat_chge ntf_arg; } argument; char *result; bool_t (*xdr_argument)(), (*xdr_result)(); char *(*local)(); extern struct sm_stat_res *sm_stat_1(); extern struct sm_stat_res *sm_mon_1(); extern struct sm_stat *sm_unmon_1(); extern struct sm_stat *sm_unmon_all_1(); extern void *sm_simu_crash_1(); extern void *sm_notify(); extern bool_t xdr_notify(); switch (rqstp->rq_proc) { case NULLPROC: svc_sendreply(transp, xdr_void, NULL); return; case SM_STAT: xdr_argument = xdr_sm_name; xdr_result = xdr_sm_stat_res; local = (char *(*)()) sm_stat_1; break; case SM_MON: xdr_argument = xdr_mon; xdr_result = xdr_sm_stat_res; local = (char *(*)()) sm_mon_1; break; case SM_UNMON: xdr_argument = xdr_mon_id; xdr_result = xdr_sm_stat; local = (char *(*)()) sm_unmon_1; break; case SM_UNMON_ALL: xdr_argument = xdr_my_id; xdr_result = xdr_sm_stat; local = (char *(*)()) sm_unmon_all_1; break; case SM_SIMU_CRASH: xdr_argument = xdr_void; xdr_result = xdr_void; local = (char *(*)()) sm_simu_crash_1; break; case SM_NOTIFY: xdr_argument = xdr_notify; xdr_result = xdr_void; local = (char *(*)()) sm_notify; break; default: svcerr_noproc(transp); return; } bzero(&argument, sizeof(argument)); if (! svc_getargs(transp, xdr_argument, &argument)) { svcerr_decode(transp); return; } result = (*local)(&argument); if (! svc_sendreply(transp, xdr_result, result)) { svcerr_systemerr(transp); } if(rqstp->rq_proc != SM_MON) if (! svc_freeargs(transp, xdr_argument, &argument)) { fprintf(stderr,"unable to free arguments\n"); exit(1); }}main(argc, argv)int argc;char **argv;{ SVCXPRT *transp; int t; int c; int ppid; extern int optind; extern char *optarg; int choice = 0;/*!!!*/ int nofork; signal(SIGALRM, sm_try);/*!!!*/ signal(SIGTERM, debug_exit); while((c = getopt(argc, argv, "Dd:")) != EOF) switch(c) { case 'd': sscanf(optarg, "%d", &debug); break; case 'D': choice = 1; break;/*!!!*/ case 'f': nofork = 1; break; default: fprintf(stderr, "in.statd -d[debug] -D\n"); return; } if(choice == 0) { strcpy(CURRENT, current0); strcpy(BACKUP, backup0); strcpy(STATE, state0); } else { strcpy(CURRENT, current1); strcpy(BACKUP, backup1); strcpy(STATE, state1); } if(debug) printf("debug is on, create entry: %s, %s, %s\n", CURRENT, BACKUP, STATE);/*!!!*/ if(!debug && !nofork) { ppid = fork(); if(ppid == -1) { (void) fprintf(stderr, "in.lockd: fork failure\n"); (void) fflush(stderr); abort(); } if(ppid != 0) { exit(0); } for (t = 0; t< 20; t++) { (void) close(t); } (void) open("/dev/console", 2); (void) open("/dev/console", 2); (void) open("/dev/console", 2); setpgrp(0, 0); } pmap_unset(SM_PROG, SM_VERS); transp = svcudp_create(RPC_ANYSOCK); if (transp == NULL) { fprintf(stderr,"cannot create udp service.\n"); exit(1); } if (! svc_register(transp, SM_PROG, SM_VERS, sm_prog_1, IPPROTO_UDP)) { fprintf(stderr,"unable to register (SM_PROG, SM_VERS, udp).\n"); exit(1); } transp = svctcp_create(RPC_ANYSOCK, 0, 0); if (transp == NULL) { fprintf(stderr,"cannot create tcp service.\n"); exit(1); } if (! svc_register(transp, SM_PROG, SM_VERS, sm_prog_1, IPPROTO_TCP)) { fprintf(stderr,"unable to register (SM_PROG, SM_VERS, tcp).\n"); exit(1); } statd_init(); svc_run(); fprintf(stderr,"svc_run returned\n"); exit(1);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?