Subject: Re: mail/drac fails to build
To: Martin Husemann <martin@duskware.de>
From: None <hiramatu@boreas.dti.ne.jp>
List: tech-pkg
Date: 07/24/2003 00:02:16
Hello.

I think this patch does your second suggestion. I tried to build mail/drac
with this rpcgen, and succeeded.

-----
// Hiramatsu Yoshifumi
// hiramatu@boreas.dti.ne.jp


At Sat, 19 Jul 2003 22:00:04 +0200,
Martin Husemann <martin@duskware.de> wrote:
> IMHO rpcgen. A minimal fix would be to add another check to find_cpp(),
> testing for the default when no ${CPP} is defined (that is /usr/bin/cpp).
> A proper fix would check for a leading "/" in ${CPP} and do a ${PATH} walk
> if it is missing.
> 
> Martin
> 

diff -buNr rpcgen.orig/rpc_main.c rpcgen/rpc_main.c
--- rpcgen.orig/rpc_main.c	2003-07-23 23:38:51.000000000 +0900
+++ rpcgen/rpc_main.c	2003-07-23 23:52:46.000000000 +0900
@@ -156,6 +156,7 @@
 static int parseargs __P((int, char *[], struct commandline *));
 static void usage __P((void));
 static void options_usage __P((void));
+static char *padvance(const char **, const char *);
 
 
 int
@@ -321,20 +322,78 @@
 find_cpp()
 {
 	struct stat buf;
+	const char *path;
+	char *cmdname;
 
-	if (stat(CPP, &buf) < 0) {	/* SVR4 or explicit cpp does not exist */
+	if (CPP[0] == '/') {
+		if (stat(CPP, &buf) < 0) {
+			/* SVR4 or explicit cpp does not exist */
 		if (cppDefined) {
-			fprintf(stderr, "cannot find C preprocessor: %s\n", CPP);
+				fprintf(stderr,
+				    "cannot find C preprocessor: %s\n", CPP);
 			crash();
 		} else {	/* try the other one */
 			CPP = SUNOS_CPP;
-			if (stat(CPP, &buf) < 0) {	/* can't find any cpp */
-				fprintf(stderr, "cannot find any C preprocessor (cpp)\n");
+				if (stat(CPP, &buf) < 0) {
+					/* can't find any cpp */
+					fprintf(stderr,
+					    "cannot find any C preprocessor (cpp)\n");
 				crash();
 			}
 		}
 	}
+	} else {
+		path = getenv("PATH");
+		while((cmdname = padvance(&path, "cpp")) != NULL) {
+			if (stat(cmdname, &buf) < 0) {
+				/* not found in this path */
+				free(cmdname);
+				continue;
+			} else {
+				/* found */
+				CPP = cmdname;
+				return;
+			}
+		}
+	}
+}
+
+/* padvance is taken from /bin/sh */
+/*
+ * Do a path search. The variable path (passed by reference) should be
+ * set to the start of the path before the first call; padvance will update
+ * this value as it proceeds.  Successive calls to padvance will return
+ * the possible path expansions in sequence.
+ */
+char *
+padvance(const char **path, const char *name)
+{
+	int len;
+	const char *start;
+	const char *p;
+	char *q;
+	char *ret;
+
+	if (*path == NULL)
+		return NULL;
+	start = *path;
+	for (p = start ; *p && *p != ':' ; p++);
+	len = p - start + strlen(name) + 2;	/* "2" is for '/' and '\0' */
+	ret = q = malloc(len);
+	if (p != start) {
+		strncpy(q, start, p - start);
+		q += p - start;
+		*q++ = '/';
+	}
+	strcpy(q, name);
+	if (*p == ':')
+		*path = p + 1;
+	else
+		*path = NULL;
+
+	return ret;
 }
+
 /*
  * Open input file with given define for C-preprocessor
  */