* libamu/xutil.c: amd_program_number is a u_long now.
authorErez Zadok <ezk@cs.sunysb.edu>
Sun, 28 Aug 2005 00:37:17 +0000 (00:37 +0000)
committerErez Zadok <ezk@cs.sunysb.edu>
Sun, 28 Aug 2005 00:37:17 +0000 (00:37 +0000)
(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
amd/nfs_start.c
amq/amq.c
conf/transp/transp_sockets.c
conf/transp/transp_tli.c
include/am_utils.h
libamu/xutil.c

index 8e102e1294567a55b7cbe978cc56976efb36dd8c..286eac514374e8018bbea9627dfa21fa82103470 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,27 @@
 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
index 04b458fadb740d668f051cdd45f9aba421c6b6b8..86ef19c38088039592b0dd50a5fd995d079c13da 100644 (file)
@@ -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;
-    }
   }
 
   /*
index a0bfc0c2fa0fe4bbbf15169fcc5e81a2c1c0b09b..ae4dd1d7eee8e7737a7792296115d6aaee06e8cd 100644 (file)
--- 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;
index e4a36c7931631488888efe8d300318837d7a535c..27ba8e3d3a2241195689cc0eb903c568092461a0 100644 (file)
@@ -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);
 }
 
index a90f8090ab2cfe099ada5f168aa9a18488c36f2b..a2b5ea0349179e88c1d56e380103dec669901449 100644 (file)
@@ -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);
 }
 
index badb9cd911b26f4369be4040e9bd816299f11d1e..d7b4843b78e0c4d56626311eb452987d110d7812 100644 (file)
@@ -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);
index 274e5658eb0d7313f6efd5fc3534ba2f2394674f..524fe6bbe3fd5fc2feff000953c2e273539efc0a 100644 (file)
@@ -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;
 }