Note: "permalinks" may not be as permanent as we would like,
direct links of old sources may well be a few messages off.
/ 2004-04-27 14:59:53 +0000
\ Ron O'Hara:
> Why not use 'which' to check if 'ip' is installed, and then if
> 'ifconfig' is installed... as a side benefit this approach also caters
> for non-standard installation locations. Eg.
everyone happy with this?
Lars Ellenberg
diff -u -p -r1.1.2.45 drbdadm_main.c
--- drbdadm_main.c 26 Apr 2004 08:36:29 -0000 1.1.2.45
+++ drbdadm_main.c 27 Apr 2004 16:30:14 -0000
@@ -355,12 +355,12 @@ int m_system(int may_sleep,char** argv)
pid = fork();
if(pid == -1) {
- fprintf(stderr,"Can not fork");
+ fprintf(stderr,"Can not fork\n");
exit(E_exec_error);
}
if(pid == 0) {
execv(argv[0],argv);
- fprintf(stderr,"Can not exec");
+ fprintf(stderr,"Can not exec\n");
exit(E_exec_error);
}
@@ -596,44 +596,13 @@ void print_usage()
exit(E_usage);
}
-int m_shell_match(const char *subcmd, const char *pattern)
-{
- int ex, pid;
- char *cmd = NULL;
-
-#ifdef DEBUG
- ex = asprintf(&cmd, "[[ `%s` == %s ]]", subcmd, pattern);
-#else
- ex = asprintf(&cmd, "[[ `%s` == %s ]] &>/dev/null", subcmd, pattern);
-#endif
- if (ex < 0) { perror("asprintf"); exit(E_thinko); }
-
- pid = fork();
- if (pid == -1) { fprintf(stderr, "Can not fork"); exit(E_exec_error); }
- if (pid == 0) {
- execl("/bin/bash", progname,
-#ifdef DEBUG
- "-vxc",
-#else
- "-c",
-#endif
- cmd, NULL);
- fprintf(stderr, "Can not exec");
- exit(E_exec_error);
- }
- waitpid(pid, &ex, 0);
- free(cmd);
- return ex;
-}
-
/* if not verifyable, prints a message to stderr,
* and sets config_valid = 0 if INVALID_IP_IS_INVALID_CONF is defined */
void verify_ips(struct d_resource* res)
{
- char *cmd = NULL;
- char *pat = NULL;
char *my_ip = NULL;
char *his_ip = NULL;
+ char *argv[] = { "/bin/bash", "-c", NULL, "drbdadm:verify_ips", NULL };
int ex;
if (!(res && res->me && res->me->address
@@ -643,13 +612,22 @@ void verify_ips(struct d_resource* res)
}
my_ip = res->me->address;
his_ip = res->peer->address;
- ex = asprintf(&cmd, "/sbin/ip -o addr show scope global to %s", my_ip);
- if (ex < 0) { perror("asprintf"); exit(E_thinko); }
- ex = asprintf(&pat, "*inet\\ %s/*", my_ip);
+
+ ex = asprintf(&argv[2],
+ "IP=%s; IP=${IP//./\\\\.};"
+ "LANG=; PATH=/sbin/:$PATH;"
+ "if which ipLA &>/dev/null ; then"
+ " ip addr show | grep -qE 'inet '$IP/;"
+ "elif which ifconfig &>/dev/null ; then"
+ " ifconfig | grep -qE ' inet addr:'$IP' ';"
+ "else"
+ " echo >&2 $0: 'neither ip nor ifconfig found!';"
+ "fi",
+ my_ip);
if (ex < 0) { perror("asprintf"); exit(E_thinko); }
- ex = m_shell_match(cmd, pat);
- free(cmd); cmd = NULL;
- free(pat); pat = NULL;
+ ex = m_system(1,argv);
+ free(argv[2]); argv[2] = NULL;
+
if (ex != 0) {
ENTRY e, *ep;
e.key = e.data = ep = NULL;
@@ -664,13 +642,21 @@ void verify_ips(struct d_resource* res)
free(e.key);
return;
}
- asprintf(&cmd, "/sbin/ip -o route get to %s", his_ip);
- if (ex < 0) { perror("asprintf"); exit(E_thinko); }
- asprintf(&pat, "%s\\ dev*src\\ %s\\ \\\\*", his_ip, my_ip);
+
+ ex = asprintf(&argv[2],
+ "IP=%s; IPQ=${IP//./\\\\.};"
+ "peerIP=%s; peerIPQ=${peerIP//./\\\\.};"
+ "LANG=; PATH=/sbin/:$PATH;"
+ "if which ipLA &>/dev/null ; then "
+ " ip -o route get to $peerIP 2>/dev/null |"
+ " grep -qE $peerIPQ' dev .* src '$IPQ' ';"
+ "else"
+ " echo >&2 $0: 'cannot check route to peer';"
+ "fi",
+ my_ip,his_ip);
if (ex < 0) { perror("asprintf"); exit(E_thinko); }
- ex = m_shell_match(cmd, pat);
- free(cmd); cmd = NULL;
- free(pat); pat = NULL;
+ ex = m_system(1,argv);
+ free(argv[2]); argv[2] = NULL;
if (ex != 0) {
ENTRY e, *ep;
e.key = e.data = ep = NULL;
@@ -678,12 +664,11 @@ void verify_ips(struct d_resource* res)
ep = hsearch(e, FIND);
fprintf(stderr, "%s:%d: in resource %s:\n\tNo route from me (%s) to peer (%s).\n",
config_file,(int) ep->data,res->name, my_ip, his_ip);
-#ifdef INVALID_IP_IS_INVALID_CONF
+# ifdef INVALID_IP_IS_INVALID_CONF
config_valid = 0;
-#endif
+# endif
return;
}
-
return;
}
diff -u -p -r1.54.2.30 drbdsetup.c
--- drbdsetup.c 26 Apr 2004 08:36:29 -0000 1.54.2.30
+++ drbdsetup.c 27 Apr 2004 16:30:15 -0000
@@ -855,7 +855,7 @@ int cmd_invalidate(int drbd_fd,char** ar
err=errno;
perror("ioctl() failed");
if(err==EINPROGRESS)
- fprintf(stderr,"Only in 'Connected' cstate possible.");
+ fprintf(stderr,"Only in 'Connected' cstate possible.\n");
return 20;
}
return 0;
@@ -871,7 +871,7 @@ int cmd_invalidate_rem(int drbd_fd,char*
err=errno;
perror("ioctl() failed");
if(err==EINPROGRESS)
- fprintf(stderr,"Only in 'Connected' cstate possible.");
+ fprintf(stderr,"Only in 'Connected' cstate possible.\n");
return 20;
}
return 0;