? .depend ? nlm_prot_svc.c ? rpc.lockd ? rpc.lockd.8.gz Index: kern.c =================================================================== RCS file: /usr/local/arch/ncvs/src/usr.sbin/rpc.lockd/kern.c,v retrieving revision 1.19 diff -u -r1.19 kern.c --- kern.c 27 May 2006 02:37:37 -0000 1.19 +++ kern.c 5 Jul 2006 11:36:26 -0000 @@ -152,6 +152,7 @@ return (child); } + setproctitle("[kern]"); signal(SIGHUP, (sig_t)client_cleanup); signal(SIGTERM, (sig_t)client_cleanup); Index: lock_proc.c =================================================================== RCS file: /usr/local/arch/ncvs/src/usr.sbin/rpc.lockd/lock_proc.c,v retrieving revision 1.18 diff -u -r1.18 lock_proc.c --- lock_proc.c 3 Feb 2005 22:21:19 -0000 1.18 +++ lock_proc.c 5 Jul 2006 11:36:26 -0000 @@ -62,7 +62,11 @@ #define CLIENT_CACHE_SIZE 64 /* No. of client sockets cached */ #define CLIENT_CACHE_LIFETIME 120 /* In seconds */ -#define getrpcaddr(rqstp) (struct sockaddr *)(svc_getrpccaller((rqstp)->rq_xprt)->buf) +struct sockaddr * +getrpcaddr(struct svc_req *rqstp) +{ + return ((struct sockaddr *)(svc_getrpccaller((rqstp)->rq_xprt)->buf)); +} static void log_from_addr(const char *, struct svc_req *); static void log_netobj(netobj *obj); Index: lockd.c =================================================================== RCS file: /usr/local/arch/ncvs/src/usr.sbin/rpc.lockd/lockd.c,v retrieving revision 1.18 diff -u -r1.18 lockd.c --- lockd.c 16 Jul 2004 19:30:59 -0000 1.18 +++ lockd.c 5 Jul 2006 11:36:26 -0000 @@ -86,6 +86,32 @@ const char *transports[] = { "udp", "tcp", "udp6", "tcp6" }; +static void +sigusr1_lock(void) +{ + sigset_t block; + + sigemptyset(&block); + sigaddset(&block, SIGCHLD); + + if (sigprocmask(SIG_BLOCK, &block, NULL) < 0) { + syslog(LOG_WARNING, "sigusr1_lock failed: %s", strerror(errno)); + } +} + +static void +sigusr1_unlock(void) +{ + sigset_t block; + + sigemptyset(&block); + sigaddset(&block, SIGCHLD); + + if (sigprocmask(SIG_UNBLOCK, &block, NULL) < 0) { + syslog(LOG_WARNING, "sigusr1_unlock failed: %s", strerror(errno)); + } +} + int main(argc, argv) int argc; @@ -93,10 +119,12 @@ { SVCXPRT *transp; int ch, i, maxindex, s; - struct sigaction sigalarm; + struct sigaction sigalarm, sigusr1; int grace_period = 30; struct netconfig *nconf; int maxrec = RPC_MAXDATASIZE; + fd_set readfds, cleanfds; + struct timeval timeout; while ((ch = getopt(argc, argv, "d:g:")) != (-1)) { switch (ch) { @@ -209,6 +237,40 @@ client_pid = client_request(); + bzero(&sigusr1, sizeof(sigusr1)); + sigusr1.sa_handler = (sig_t) sigusr1_handler; + sigusr1.sa_flags = SA_RESTART; + if (sigaction(SIGUSR1, &sigusr1, NULL) != 0) { + syslog(LOG_WARNING, "sigaction(SIGUSR1) failed: %s", + strerror(errno)); + exit(1); + } + setproctitle("[srv]"); + for (;;) { + timeout.tv_sec = 30; + timeout.tv_usec = 0; + + readfds = svc_fdset; + cleanfds = svc_fdset; + switch (select(svc_maxfd+1, &readfds, NULL, NULL, &timeout)) { + case -1: + FD_ZERO(&readfds); + if (errno == EINTR) { + continue; + } + warn("svc_run: - select failed"); + exit(1); + case 0: + sigusr1_lock(); + __svc_clean_idle(&cleanfds, 30, FALSE); + sigusr1_unlock(); + continue; + default: + sigusr1_lock(); + svc_getreqset(&readfds); + sigusr1_unlock(); + } + } svc_run(); /* Should never return */ exit(1); } Index: lockd.h =================================================================== RCS file: /usr/local/arch/ncvs/src/usr.sbin/rpc.lockd/lockd.h,v retrieving revision 1.5 diff -u -r1.5 lockd.h --- lockd.h 29 Nov 2001 17:36:45 -0000 1.5 +++ lockd.h 5 Jul 2006 11:36:26 -0000 @@ -39,3 +39,4 @@ pid_t client_request(void); extern int nsm_state; extern pid_t client_pid; +void sigusr1_handler(void); Index: lockd_lock.c =================================================================== RCS file: /usr/local/arch/ncvs/src/usr.sbin/rpc.lockd/lockd_lock.c,v retrieving revision 1.17 diff -u -r1.17 lockd_lock.c --- lockd_lock.c 20 May 2005 13:01:47 -0000 1.17 +++ lockd_lock.c 5 Jul 2006 11:36:26 -0000 @@ -311,14 +311,11 @@ } } -/* #define DUMP_FILELOCK_VERBOSE */ void dump_filelock(const struct file_lock *fl) { -#ifdef DUMP_FILELOCK_VERBOSE char hbuff[MAXBUFFERSIZE*2]; char cbuff[MAXBUFFERSIZE]; -#endif if (debug_level < 2) { return; @@ -327,35 +324,55 @@ if (fl != NULL) { debuglog("Dumping file lock structure @ %p\n", fl); -#ifdef DUMP_FILELOCK_VERBOSE - dump_static_object((unsigned char *)&fl->filehandle, - sizeof(fl->filehandle), hbuff, sizeof(hbuff), - cbuff, sizeof(cbuff)); - debuglog("Filehandle: %8s ::: %8s\n", hbuff, cbuff); -#endif + if (debug_level >= 3) { + dump_static_object((unsigned char *)&fl->filehandle, + sizeof(fl->filehandle), hbuff, sizeof(hbuff), + cbuff, sizeof(cbuff)); + debuglog("Filehandle: %8s ::: %8s\n", hbuff, cbuff); + } debuglog("Dumping nlm4_holder:\n" "exc: %x svid: %x offset:len %llx:%llx\n", fl->client.exclusive, fl->client.svid, fl->client.l_offset, fl->client.l_len); -#ifdef DUMP_FILELOCK_VERBOSE - debuglog("Dumping client identity:\n"); - dump_netobj(&fl->client.oh); - - debuglog("Dumping client cookie:\n"); - dump_netobj(&fl->client_cookie); - - debuglog("nsm: %d status: %d flags: %d locker: %d" - " fd: %d\n", fl->nsm_status, fl->status, - fl->flags, fl->locker, fl->fd); -#endif + if (debug_level >= 3) { + debuglog("Dumping client identity:\n"); + dump_netobj(&fl->client.oh); + debuglog("client name: %s\n", fl->client_name); + + debuglog("Dumping client cookie:\n"); + dump_netobj(&fl->client_cookie); + + debuglog("nsm: %d status: %d flags: %d\n", + fl->nsm_status, fl->status, fl->flags); + } } else { debuglog("NULL file lock structure\n"); } } void +sigusr1_handler(void) +{ + struct file_lock *ifl; /* Iterator */ + + if (debug_level < 2) { + return; + } + debuglog("NFSLOCKLIST\n"); + LIST_FOREACH(ifl, &nfslocklist_head, nfslocklist) { + dump_filelock(ifl); + } + debuglog("NFSLOCKLIST END\n"); + debuglog("BLOCKEDLOCKLIST\n"); + LIST_FOREACH(ifl, &blockedlocklist_head, nfslocklist) { + dump_filelock(ifl); + } + debuglog("BLOCKEDLOCKLIST END\n"); +} + +void copy_nlm4_lock_to_nlm4_holder(src, exclusive, dest) const struct nlm4_lock *src; const bool_t exclusive;