Remove macII support
[oweals/cde.git] / cde / config / imake / imake.c
index 77df8007cbd76ad1429e5485cb2d28a1340e64a2..3444c045fadc92536c86e285b82a7f919ded604c 100644 (file)
@@ -16,7 +16,7 @@
  * 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
  */
@@ -226,9 +226,6 @@ typedef union wait  waitType;
 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
@@ -263,7 +260,7 @@ extern int  errno;
  * 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;
@@ -378,6 +375,9 @@ static void get_libc_version(FILE *);
 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 *);
@@ -405,13 +405,14 @@ main(int argc, char *argv[])
                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)
@@ -709,7 +710,8 @@ optional_include(FILE *inFile, const char *defsym, const char *fname)
 {
        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);
        }
@@ -780,35 +782,35 @@ parse_utsname(struct utsname *name, const char *fmt, char *result, const char *m
        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;
 
@@ -823,7 +825,8 @@ parse_utsname(struct utsname *name, const char *fmt, char *result, const char *m
 
   /* 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
 
@@ -885,7 +888,7 @@ get_distrib(FILE *inFile)
   /* 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"
@@ -950,14 +953,40 @@ static const char *libc_c=
 "}\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)) {
@@ -967,23 +996,46 @@ get_libc_version(FILE *inFile)
         */
       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";
@@ -1003,7 +1055,7 @@ get_libc_version(FILE *inFile)
        abort ();
 
       while (fgets (command, len, fp))
-       fprintf (inFile, command);
+       fprintf (inFile, "%s", command);
   
       len = pclose (fp);
       remove (aout);
@@ -1025,7 +1077,8 @@ get_ld_version(FILE *inFile)
       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);
@@ -1038,57 +1091,105 @@ get_ld_version(FILE *inFile)
 #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
@@ -1097,6 +1198,9 @@ get_gcc_incdir(FILE *inFile)
   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"
@@ -1108,15 +1212,21 @@ get_gcc_incdir(FILE *inFile)
   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;
@@ -1214,7 +1324,7 @@ cppit(const char *imakefile, const char *template, const char *masterc, FILE *ou
            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);
        /*
@@ -1286,7 +1396,8 @@ CleanCppInput(char *imakefile)
                    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.",
@@ -1365,10 +1476,10 @@ isempty(char *line)
                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 == '"')
@@ -1384,7 +1495,7 @@ isempty(char *line)
                    (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' &&
@@ -1397,7 +1508,7 @@ isempty(char *line)
                        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;
@@ -1407,7 +1518,7 @@ isempty(char *line)
                             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);
                    }
                }
@@ -1456,7 +1567,8 @@ ReadLine(FILE *tmpfd, const char *tmpfname)
                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");
@@ -1467,7 +1579,8 @@ ReadLine(FILE *tmpfd, const char *tmpfname)
        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 @ */
@@ -1604,6 +1717,6 @@ Strdup(const char *cp)
 {
        char *new = Emalloc(strlen(cp) + 1);
 
-       strcpy(new, cp);
+       memcpy(new, cp, strlen(cp) + 1);
        return new;
 }