X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=cde%2Fconfig%2Fimake%2Fimake.c;h=3444c045fadc92536c86e285b82a7f919ded604c;hb=904a48b8229911fd59f4dbc98b010ed2380c319f;hp=5e26133a42088605b457428327b0735e569043e2;hpb=8d32067a4a242276250c1c9dcf309979590189b7;p=oweals%2Fcde.git diff --git a/cde/config/imake/imake.c b/cde/config/imake/imake.c index 5e26133a..3444c045 100644 --- a/cde/config/imake/imake.c +++ b/cde/config/imake/imake.c @@ -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 @@ -950,6 +953,9 @@ 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) { @@ -973,13 +979,13 @@ get_libc_version(FILE *inFile) if (!strcmp(u.sysname, "Linux") && (!strcmp(u.machine, "x86_64"))) { - if (!lstat ("/usr/lib64/libc.so", &sb) && S_ISREG(sb.st_mode)) { - libcso = strdup("/usr/lib64/libc.so"); + if (!lstat (libc64path, &sb) && S_ISREG(sb.st_mode)) { + libcso = libc64path; } } if (libcso == NULL) { - libcso = strdup("/usr/lib/libc.so"); + libcso = libc32path; } if (lstat (libcso, &sb) == 0) { @@ -990,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"; @@ -1026,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); @@ -1034,8 +1063,6 @@ get_libc_version(FILE *inFile) abort (); } } - - free(libcso); } static void @@ -1050,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); @@ -1063,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 @@ -1122,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" @@ -1133,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; @@ -1239,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); /* @@ -1311,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.", @@ -1390,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 == '"') @@ -1409,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' && @@ -1422,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; @@ -1432,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); } } @@ -1481,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"); @@ -1492,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 @ */ @@ -1629,6 +1717,6 @@ Strdup(const char *cp) { char *new = Emalloc(strlen(cp) + 1); - strcpy(new, cp); + memcpy(new, cp, strlen(cp) + 1); return new; }