2005-08-27 Erez Zadok <ezk@cs.sunysb.edu>
+ * 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
/*
* 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;
- }
}
/*
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;
/*
- * 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);
}
/*
- * 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);
}
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 *);
__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);
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;
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);
+ }
}
/* return the rpc program number under which amd was used */
-int
+u_long
get_amd_program_number(void)
{
return amd_program_number;
/* 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;
}