* details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with these librararies and programs; if not, write
+ * License along with these libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
char *malloc(), *realloc();
void exit();
#endif
-#if defined(macII) && !defined(__STDC__) /* stdlib.h fails to define these */
-char *malloc(), *realloc();
-#endif /* macII */
#ifdef X_NOT_STDC_ENV
extern char *getenv();
#endif
* This define of strerror is copied from (and should be identical to)
* Xos.h, which we don't want to include here for bootstrapping reasons.
*/
-#if defined(X_NOT_STDC_ENV) || (defined(sun) && !defined(SVR4)) || defined(macII)
+#if defined(X_NOT_STDC_ENV) || (defined(sun) && !defined(SVR4))
# ifndef strerror
extern char *sys_errlist[];
extern int sys_nerr;
static void get_ld_version(FILE *);
#endif
#if defined(sun) && defined(__SVR4)
+static char *get_full_path(const char *program);
+static int get_sun_compiler_version(const char *fspec, const char *product,
+ int *cmajor, int *cminor);
static void get_sun_compiler_versions(FILE *);
#endif
static void get_gcc_incdir(FILE *);
tmpMakefile = Makefile;
else {
tmpMakefile = Strdup(tmpMakefile);
- mkstemp(tmpMakefile);
+ int ret = mkstemp(tmpMakefile);
+ (void) ret;
}
AddMakeArg("-f");
AddMakeArg( tmpMakefile );
- sprintf(makeMacro, "MAKE=%s", program);
+ snprintf(makeMacro, BUFSIZ, "MAKE=%s", program);
AddMakeArg( makeMacro );
- sprintf(makefileMacro, "MAKEFILE=%s", Imakefile);
+ snprintf(makefileMacro, BUFSIZ, "MAKEFILE=%s", Imakefile);
AddMakeArg( makefileMacro );
if ((tmpfd = fopen(tmpMakefile, "w+")) == NULL)
{
errno = 0;
if (access(fname, R_OK) == 0) {
- LogMsg(OverrideWarning, fname);
+ if(errno)
+ LogMsg(OverrideWarning, fname);
return (fprintf(inFile, LocalDefineFmt, defsym, fname) < 0 ||
fprintf(inFile, IncludeFmt, defsym) < 0);
}
case 's':
if (arg > 0)
*ptr++ = ' ';
- strcpy(ptr, name->sysname);
+ strncpy(ptr, name->sysname, SYS_NMLN);
ptr += strlen(ptr);
break;
case 'n':
if (arg > 0)
*ptr++ = ' ';
- strcpy(ptr, name->nodename);
+ strncpy(ptr, name->nodename, SYS_NMLN);
ptr += strlen(ptr);
break;
case 'r':
if (arg > 0)
*ptr++ = ' ';
- strcpy(ptr, name->release);
+ strncpy(ptr, name->release, SYS_NMLN);
ptr += strlen(ptr);
break;
case 'v':
if (arg > 0)
*ptr++ = ' ';
- strcpy(ptr, name->version);
+ strncpy(ptr, name->version, SYS_NMLN);
ptr += strlen(ptr);
break;
case 'm':
if (arg > 0)
*ptr++ = ' ';
- strcpy(ptr, name->machine);
+ strncpy(ptr, name->machine, SYS_NMLN);
ptr += strlen(ptr);
break;
/* Parse the buffer. The sscanf() return value is rarely correct. */
*result = '\0';
- (void) sscanf(buf, fmt + arg + 1, result);
+ int ret = sscanf(buf, fmt + arg + 1, result);
+ (void) ret;
}
#endif
/* would like to know what version of the distribution it is */
}
-static const char *libc_c=
+static const char libc_c[]=
"#include <stdio.h>\n"
"#include <ctype.h>\n"
"\n"
"}\n"
;
+#define libc32path "/usr/lib/libc.so"
+#define libc64path "/usr/lib64/libc.so"
+
static void
get_libc_version(FILE *inFile)
{
- static char* libcso = "/usr/lib/libc.so";
+ char* libcso = NULL;
struct stat sb;
char buf[PATH_MAX];
char* ptr;
int libcmajor, libcminor, libcteeny;
+ struct utsname u;
+
+ /*
+ * If we are on a 64-bit Linux system and we see /usr/lib64/libc.so,
+ * we should use it. Otherwise go with /usr/lib/libc.so. It is entirely
+ * possible that someone will be running a 32-bit userland on a 64-bit
+ * system.
+ */
+ if (uname(&u) == -1) {
+ fprintf(stderr, "%s (%d): %s\n", __func__, __LINE__, strerror(errno));
+ abort();
+ }
+
+ if (!strcmp(u.sysname, "Linux") &&
+ (!strcmp(u.machine, "x86_64"))) {
+ if (!lstat (libc64path, &sb) && S_ISREG(sb.st_mode)) {
+ libcso = libc64path;
+ }
+ }
+
+ if (libcso == NULL) {
+ libcso = libc32path;
+ }
if (lstat (libcso, &sb) == 0) {
if (S_ISLNK (sb.st_mode)) {
*/
if (readlink (libcso, buf, PATH_MAX) >= 0) {
for (ptr = buf; *ptr && !isdigit (*ptr); ptr++);
- (void) sscanf (ptr, "%d.%d.%d", &libcmajor, &libcminor, &libcteeny);
- fprintf(inFile, "#define DefaultLinuxCLibMajorVersion %d\n", libcmajor);
- fprintf(inFile, "#define DefaultLinuxCLibMinorVersion %d\n", libcminor);
- fprintf(inFile, "#define DefaultLinuxCLibTeenyVersion %d\n", libcteeny);
+ int ret = sscanf (ptr, "%d.%d.%d", &libcmajor, &libcminor, &libcteeny);
+ (void) ret;
+ fprintf(inFile, "#define DefaultLinuxCLibMajorVersion %d\n", libcmajor);
+ fprintf(inFile, "#define DefaultLinuxCLibMinorVersion %d\n", libcminor);
+ fprintf(inFile, "#define DefaultLinuxCLibTeenyVersion %d\n", libcteeny);
}
} else {
/*
* /usr/lib/libc.so is NOT a symlink -- this is libc 6.x / glibc 2.x
* now we have to figure this out the hard way.
*/
- char *aout = tmpnam (NULL);
+ char aout[PATH_MAX];
+ int fd = -1;
FILE *fp;
const char *format = "%s -o %s -x c -";
char *cc;
int len;
char *command;
+ memset(aout, '\0', PATH_MAX);
+
+ if (!lstat(getenv("TMPDIR"), &sb) && S_ISDIR(sb.st_mode))
+ strncpy(aout, getenv("TMPDIR"), PATH_MAX - 1);
+#ifdef P_tmpdir /* defined by XPG and XOPEN, but don't assume we have it */
+ else if (!lstat(P_tmpdir, &sb) && S_ISDIR(sb.st_mode))
+ strncpy(aout, P_tmpdir, PATH_MAX - 1);
+#endif
+ else if (!lstat("/tmp", &sb) && S_ISDIR(sb.st_mode))
+ strncpy(aout, "/tmp", PATH_MAX - 1);
+ else
+ abort();
+
+ strncat(aout, "/imaketmp.XXXXXX", PATH_MAX - 1);
+
+ if ((fd = mkstemp(aout)) == -1)
+ abort ();
+
+ if (close(fd) == -1)
+ abort ();
+
cc = getenv ("CC");
if (cc == NULL)
cc = "gcc";
abort ();
while (fgets (command, len, fp))
- fprintf (inFile, command);
+ fprintf (inFile, "%s", command);
len = pclose (fp);
remove (aout);
c = fgetc (ldprog);
} while (c != EOF && !isdigit (c));
ungetc (c, ldprog);
- (void) fscanf (ldprog, "%d.%d", &ldmajor, &ldminor);
+ int ret = fscanf (ldprog, "%d.%d", &ldmajor, &ldminor);
+ (void) ret;
fprintf(inFile, "#define DefaultLinuxBinUtilsMajorVersion %d\n",
ldmajor * 10 + ldminor);
pclose (ldprog);
#endif
#if defined(sun) && defined(__SVR4)
-static void
-get_sun_compiler_versions(FILE *inFile)
+
+static char *
+get_full_path(const char *program)
+{
+ char *buf;
+ char *cmd;
+ FILE *proc;
+
+ buf = calloc(1, PATH_MAX);
+ asprintf(&cmd, "command -v %s", program);
+
+ if ((proc = popen (cmd, "r")) != NULL)
+ fgets (buf, PATH_MAX, proc);
+
+ pclose (proc);
+
+ return strtok (buf, "\n"); /* strip newline */
+}
+
+static int
+get_sun_compiler_version(const char *fspec, const char *product,
+ int *cmajor, int *cminor)
{
char buf[PATH_MAX];
char cmd[PATH_MAX];
- static char* sunpro_cc = "/opt/SUNWspro/bin/cc";
- static char* sunpro_CC = "/opt/SUNWspro/bin/CC";
- int cmajor, cminor;
- char* vptr;
+ char *vptr;
struct stat sb;
- FILE* ccproc;
-
- if (lstat (sunpro_cc, &sb) == 0) {
- strcpy (cmd, sunpro_cc);
- strcat (cmd, " -V 2>&1");
- if ((ccproc = popen (cmd, "r")) != NULL) {
- if (fgets (buf, PATH_MAX, ccproc) != NULL) {
- vptr = strrchr (buf, 'C');
- for (; !isdigit(*vptr); vptr++);
- (void) sscanf (vptr, "%d.%d", &cmajor, &cminor);
- fprintf (inFile,
- "#define DefaultSunProCCompilerMajorVersion %d\n",
- cmajor);
- fprintf (inFile,
- "#define DefaultSunProCCompilerMinorVersion %d\n",
- cminor);
+ FILE *ccproc;
+ int ret;
+ char vendor[4];
+
+ if (lstat (fspec, &sb) != 0)
+ return ENOENT;
+
+ strncpy (cmd, fspec, PATH_MAX);
+ strlcpy (vendor, product, 4);
+
+ if (strcmp (vendor, "Sun") == 0)
+ strncat (cmd, " -V 2>&1", 8);
+ else if (strcmp (vendor, "Gnu") == 0)
+ strncat (cmd, " --version 2>&1", 15);
+ else
+ return EINVAL;
+
+ if ((ccproc = popen (cmd, "r")) != NULL) {
+ if (fgets (buf, PATH_MAX, ccproc) != NULL) {
+ for (vptr = buf; !isdigit(*vptr) && *vptr != NULL; vptr++);
+ if (*vptr == NULL) {
+ pclose (ccproc);
+ return EINVAL;
+ } else {
+ ret = sscanf (vptr, "%d.%d", cmajor, cminor);
}
- while (fgets (buf, PATH_MAX, ccproc) != NULL) {};
- pclose (ccproc);
}
+ pclose (ccproc);
+ } else {
+ return EIO;
}
- if (lstat (sunpro_CC, &sb) == 0) {
- strcpy (cmd, sunpro_CC);
- strcat (cmd, " -V 2>&1");
- if ((ccproc = popen (cmd, "r")) != NULL) {
- if (fgets (buf, PATH_MAX, ccproc) != NULL) {
- vptr = strrchr (buf, 'C');
- for (; !isdigit(*vptr); vptr++);
- (void) sscanf (vptr, "%d.%d", &cmajor, &cminor);
- fprintf (inFile,
- "#define DefaultSunProCplusplusCompilerMajorVersion %d\n",
- cmajor);
- fprintf (inFile,
- "#define DefaultSunProCplusplusCompilerMinorVersion %d\n",
- cminor);
- }
- while (fgets (buf, PATH_MAX, ccproc) != NULL) {};
- pclose (ccproc);
+
+ return 0;
+}
+
+static void
+get_sun_compiler_versions(FILE *inFile)
+{
+ static const char *compilers[][2] =
+ {{"SunProC", "/opt/solarisstudio/bin/cc"},
+ {"SunProCplusplus", "/opt/solarisstudio/bin/CC"},
+ {"GnuC", "gcc"},
+ {"GnuCplusplus", "g++"}};
+ int cmajor, cminor;
+ int i;
+ int ret;
+
+ for (i = 0; i < sizeof compilers / sizeof compilers[0]; i++) {
+ const char *product = compilers[i][0];
+ char *fspec = get_full_path (compilers[i][1]);
+
+ ret = get_sun_compiler_version (fspec, product, &cmajor, &cminor);
+ free (fspec);
+
+ if (ret == 0) {
+ fprintf (inFile,
+ "#define Default%sCompilerMajorVersion %d\n",
+ product,
+ cmajor);
+ fprintf (inFile,
+ "#define Default%sCompilerMinorVersion %d\n",
+ product,
+ cminor);
+ } else if (ret == EINVAL) {
+ printf ("Failed to detect version of compiler: %s\n", product);
+ exit (EINVAL);
}
}
+
+ (void) ret;
}
+
#endif
static void
static char* gcc_path[] = {
#ifdef linux
"/usr/bin/cc", /* for Linux PostIncDir */
+#endif
+#ifdef sun
+ "gcc",
#endif
"/usr/local/bin/gcc",
"/opt/gnu/bin/gcc"
char cmd[PATH_MAX];
char* ptr;
- buf[0] = '\0';
+ memset(buf, 0, PATH_MAX);
for (i = 0; i < sizeof gcc_path / sizeof gcc_path[0]; i++) {
+#ifdef sun
+ gcc_path[i] = get_full_path (gcc_path[i]);
+#endif
if (lstat (gcc_path[i], &sb) == 0) {
- strcpy (cmd, gcc_path[i]);
- strcat (cmd, " --print-libgcc-file-name");
+#ifdef sun
+ free (gcc_path[i]);
+#endif
+ strncpy (cmd, gcc_path[i], PATH_MAX - 1 );
+ strncat (cmd, " --print-libgcc-file-name", PATH_MAX - 1);
if ((gccproc = popen (cmd, "r")) != NULL) {
- if (fgets (buf, PATH_MAX, gccproc) != NULL) {
+ if (fgets (buf, PATH_MAX - 1, gccproc) != NULL) {
ptr = strstr (buf, "libgcc.a");
- if (ptr) strcpy (ptr, "include");
+ if (ptr) strncpy (ptr, "include", 8);
}
(void) pclose (gccproc);
break;
fprintf(inFile, IncludeFmt, ImakeTmplSym) < 0 ||
optional_include(inFile, "IMAKE_ADMIN_MACROS", "adminmacros") ||
optional_include(inFile, "IMAKE_LOCAL_MACROS", "localmacros") ||
- fflush(inFile) ||
+ fflush(inFile) ||
fclose(inFile))
LogFatal("Cannot write to %s.", masterc);
/*
strcmp(ptoken, "undef")) {
if (outFile == NULL) {
tmpImakefile = Strdup(tmpImakefile);
- mkstemp(tmpImakefile);
+ int ret = mkstemp(tmpImakefile);
+ (void) ret;
outFile = fopen(tmpImakefile, "w");
if (outFile == NULL)
LogFatal("Cannot open %s for write.",
if (*pend == 'l' && pend[1] == 'i' && pend[2] == 'n' &&
pend[3] == 'e' && pend[4] == ' ')
pend += 5;
- if (isdigit(*pend)) {
+ if (isdigit((int)*pend)) {
do {
pend++;
- } while (isdigit(*pend));
+ } while (isdigit((int)*pend));
if (*pend == '\n' || *pend == '\0')
return(TRUE);
if (*pend++ == ' ' && *pend == '"')
(pend[5] == ' ' || pend[5] == '\t' || pend[5] == '\0'))
{
*pend = '#';
- strcpy(pend+1, pend+5);
+ strncpy(pend+1, pend+5, 1);
}
#ifdef MAGIC_MAKE_VARS
if (*pend == 'X' && pend[1] == 'V' && pend[2] == 'A' &&
pend[7] >= '0' && pend[7] <= '9')
{
i = pend[7] - '0';
- sprintf(varbuf, "%0.4d", xvariable);
+ snprintf(varbuf, 5, "%0.4d", xvariable);
strncpy(pend+4, varbuf, 4);
xvariables[i] = xvariable;
xvariable = (xvariable + 1) % 10000;
pend[7] <= '9')
{
i = pend[7] - '0';
- sprintf(varbuf, "%0.4d", xvariables[i]);
+ snprintf(varbuf, 5, "%0.4d", xvariables[i]);
strncpy(pend+4, varbuf, 4);
}
}
if (! tmpfd)
LogFatal("cannot reopen %s.", tmpfname);
#else /* !SYSV */
- ftruncate(fileno(tmpfd), (off_t) 0);
+ int ret = ftruncate(fileno(tmpfd), (off_t) 0);
+ (void) ret;
#endif /* !SYSV */
initialized = TRUE;
fprintf (tmpfd, "# Makefile generated by imake - do not edit!\n");
for (p1 = pline; p1 < end; p1++) {
if (*p1 == '@' && *(p1+1) == '@'
/* ignore ClearCase version-extended pathnames */
- && !(p1 != pline && !isspace(*(p1-1)) && *(p1+2) == '/'))
+ && !(p1 != pline && !isspace((int)*(p1-1))
+ && *(p1+2) == '/'))
{ /* soft EOL */
*p1++ = '\0';
p1++; /* skip over second @ */
{
char *new = Emalloc(strlen(cp) + 1);
- strcpy(new, cp);
+ memcpy(new, cp, strlen(cp) + 1);
return new;
}