From e45468e3f0a9680703d42282b7493a42d296697a Mon Sep 17 00:00:00 2001 From: Erez Zadok Date: Sun, 28 Aug 2005 00:37:17 +0000 Subject: [PATCH] * libamu/xutil.c: amd_program_number is a u_long now. (unregister_amq): if pmap_unset failed to de-register Amd from the portmapper, print an error message. (get_amd_program_number): returns a u_long now. (set_amd_program_number): take a u_long now. * include/am_utils.h: get_amd_program_number() returns u_long now. set_amd_program_number() takes a u_long now. * amq/amq.c: amd_program_number is a u_long, not int. * amd/nfs_start.c (mount_automounter): when registering Amd with the portmapper (for Amq service), don't fail if just one of TCP or UDP failed to register, but only if both transports failed. That way Amq can still contact Amd using the transport that did register correctly. However, now, if both transports failed to register, then set amd_state to "Done" so it would shutdown cleanly. * conf/transp/transp_{sockets,tli{}.c (amu_svc_register): better comments. --- ChangeLog | 22 ++++++++++++++++++++++ amd/nfs_start.c | 30 +++++++++++++++++++----------- amq/amq.c | 2 +- conf/transp/transp_sockets.c | 4 +++- conf/transp/transp_tli.c | 7 +++++-- include/am_utils.h | 4 ++-- libamu/xutil.c | 17 ++++++++++++----- 7 files changed, 64 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8e102e1..286eac5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,27 @@ 2005-08-27 Erez Zadok + * libamu/xutil.c: amd_program_number is a u_long now. + (unregister_amq): if pmap_unset failed to de-register Amd from the + portmapper, print an error message. + (get_amd_program_number): returns a u_long now. + (set_amd_program_number): take a u_long now. + + * include/am_utils.h: get_amd_program_number() returns u_long now. + set_amd_program_number() takes a u_long now. + + * amq/amq.c: amd_program_number is a u_long, not int. + + * amd/nfs_start.c (mount_automounter): when registering Amd with + the portmapper (for Amq service), don't fail if just one of TCP or + UDP failed to register, but only if both transports failed. That + way Amq can still contact Amd using the transport that did + register correctly. However, now, if both transports failed to + register, then set amd_state to "Done" so it would shutdown + cleanly. + + * conf/transp/transp_{sockets,tli{}.c (amu_svc_register): better + comments. + * libamu/xutil.c: debug_flags should always be initialized to D_CONTROL (amq,daemon,fork). (debug_option): allow setting initial immutable debug_flags via diff --git a/amd/nfs_start.c b/amd/nfs_start.c index 04b458f..86ef19c 100644 --- a/amd/nfs_start.c +++ b/amd/nfs_start.c @@ -422,21 +422,29 @@ mount_automounter(int ppid) /* * Complete registration of amq (first TCP service then UDP) */ + int tcp_ok = 0, udp_ok = 0; + unregister_amq(); /* unregister leftover Amd, if any, just in case */ - ret = amu_svc_register(tcp_amqp, get_amd_program_number(), AMQ_VERSION, - amq_program_1, IPPROTO_TCP, tcp_amqncp); - if (ret != 1) { - plog(XLOG_FATAL, "unable to register (AMQ_PROGRAM=%d, AMQ_VERSION, tcp)", get_amd_program_number()); + tcp_ok = amu_svc_register(tcp_amqp, get_amd_program_number(), AMQ_VERSION, + amq_program_1, IPPROTO_TCP, tcp_amqncp); + if (!tcp_ok) + plog(XLOG_FATAL, + "unable to register (AMQ_PROGRAM=%lu, AMQ_VERSION, tcp)", + get_amd_program_number()); + + udp_ok = amu_svc_register(udp_amqp, get_amd_program_number(), AMQ_VERSION, + amq_program_1, IPPROTO_UDP, udp_amqncp); + if (!udp_ok) + plog(XLOG_FATAL, + "unable to register (AMQ_PROGRAM=%lu, AMQ_VERSION, udp)", + get_amd_program_number()); + + /* return error only if both failed */ + if (!tcp_ok && !udp_ok) { + amd_state = Done; return 3; } - - ret = amu_svc_register(udp_amqp, get_amd_program_number(), AMQ_VERSION, - amq_program_1, IPPROTO_UDP, udp_amqncp); - if (ret != 1) { - plog(XLOG_FATAL, "unable to register (AMQ_PROGRAM=%d, AMQ_VERSION, udp)", get_amd_program_number()); - return 4; - } } /* diff --git a/amq/amq.c b/amq/amq.c index a0bfc0c..ae4dd1d 100644 --- a/amq/amq.c +++ b/amq/amq.c @@ -58,7 +58,7 @@ static int getpid_flag; static int unmount_flag; static int stats_flag; static int getvers_flag; -static int amd_program_number = AMQ_PROGRAM; +static u_long amd_program_number = AMQ_PROGRAM; static int use_tcp_flag, use_udp_flag; static int getpwd_flag; static char *debug_opts; diff --git a/conf/transp/transp_sockets.c b/conf/transp/transp_sockets.c index e4a36c7..27ba8e3 100644 --- a/conf/transp/transp_sockets.c +++ b/conf/transp/transp_sockets.c @@ -237,13 +237,15 @@ amu_svc_getcaller(SVCXPRT *xprt) /* - * register an RPC server + * Register an RPC server: + * return 1 on success, 0 otherwise. */ int amu_svc_register(SVCXPRT *xprt, u_long prognum, u_long versnum, void (*dispatch)(struct svc_req *rqstp, SVCXPRT *transp), u_long protocol, struct netconfig *dummy) { + /* on Sockets: svc_register returns 1 on success, 0 otherwise */ return svc_register(xprt, prognum, versnum, dispatch, protocol); } diff --git a/conf/transp/transp_tli.c b/conf/transp/transp_tli.c index a90f809..a2b5ea0 100644 --- a/conf/transp/transp_tli.c +++ b/conf/transp/transp_tli.c @@ -296,11 +296,14 @@ amu_svc_getcaller(SVCXPRT *xprt) /* - * register an RPC server + * Register an RPC server: + * return 1 on success, 0 otherwise. */ int -amu_svc_register(SVCXPRT *xprt, u_long prognum, u_long versnum, void (*dispatch)(), u_long protocol, struct netconfig *ncp) +amu_svc_register(SVCXPRT *xprt, u_long prognum, u_long versnum, + void (*dispatch)(), u_long protocol, struct netconfig *ncp) { + /* on TLI: svc_reg returns 1 on success, 0 otherwise */ return svc_reg(xprt, prognum, versnum, dispatch, ncp); } diff --git a/include/am_utils.h b/include/am_utils.h index badb9cd..d7b4843 100644 --- a/include/am_utils.h +++ b/include/am_utils.h @@ -295,7 +295,7 @@ extern int bind_resv_port(int, u_short *); extern int cmdoption(char *, struct opt_tab *, u_int *); extern int compute_automounter_mount_flags(mntent_t *); extern int compute_mount_flags(mntent_t *); -extern int get_amd_program_number(void); +extern u_long get_amd_program_number(void); extern int getcreds(struct svc_req *, uid_t *, gid_t *, SVCXPRT *); extern int hasmntval(mntent_t *, char *); extern char *hasmnteq(mntent_t *, char *); @@ -326,7 +326,7 @@ extern void plog(int, const char *,...) __attribute__ ((__format__ (__printf__, 2, 3))); extern void rmdirs(char *); extern void rpc_msg_init(struct rpc_msg *, u_long, u_long, u_long); -extern void set_amd_program_number(int program); +extern void set_amd_program_number(u_long program); extern void show_opts(int ch, struct opt_tab *); extern void xstrlcpy(char *dst, const char *src, size_t len); extern void xstrlcat(char *dst, const char *src, size_t len); diff --git a/libamu/xutil.c b/libamu/xutil.c index 274e565..524fe6b 100644 --- a/libamu/xutil.c +++ b/libamu/xutil.c @@ -65,7 +65,7 @@ u_int debug_flags = D_CONTROL; /* set regardless if compiled with debugging */ int syslogging; #endif /* HAVE_SYSLOG */ static u_int xlog_level = XLOG_DEFAULT; -static int amd_program_number = AMQ_PROGRAM; +static u_long amd_program_number = AMQ_PROGRAM; time_t clock_valid = 0; time_t xclock_valid = 0; @@ -855,9 +855,15 @@ switch_to_logfile(char *logfile, int old_umask, int truncate_log) void unregister_amq(void) { - if (amuDebug(D_AMQ)) + + if (amuDebug(D_AMQ)) { /* find which instance of amd to unregister */ - pmap_unset(get_amd_program_number(), AMQ_VERSION); + u_long amd_prognum = get_amd_program_number(); + + if (pmap_unset(amd_prognum, AMQ_VERSION) == 1) + plog(XLOG_ERROR, "failed to de-register Amd program %lu, version %lu", + amd_prognum, AMQ_VERSION); + } } @@ -891,7 +897,7 @@ going_down(int rc) /* return the rpc program number under which amd was used */ -int +u_long get_amd_program_number(void) { return amd_program_number; @@ -900,7 +906,8 @@ get_amd_program_number(void) /* set the rpc program number used for amd */ void -set_amd_program_number(int program) +set_amd_program_number(u_long program) + { amd_program_number = program; } -- 2.43.0