"Fossies" - the Fresh Open Source Software Archive

Member "schily-2021-09-18/sunpro/Make/lib/vroot/src/report.cc" (14 Aug 2021, 9836 Bytes) of package /linux/privat/schily-2021-09-18.tar.bz2:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 /*
    2  * CDDL HEADER START
    3  *
    4  * This file and its contents are supplied under the terms of the
    5  * Common Development and Distribution License ("CDDL"), version 1.0.
    6  * You may use this file only in accordance with the terms of version
    7  * 1.0 of the CDDL.
    8  *
    9  * A full copy of the text of the CDDL should have accompanied this
   10  * source.  A copy of the CDDL is also available via the Internet at
   11  * http://www.opensource.org/licenses/cddl1.txt
   12  * See the License for the specific language governing permissions
   13  * and limitations under the License.
   14  *
   15  * When distributing Covered Code, include this CDDL HEADER in each
   16  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
   17  * If applicable, add the following below this CDDL HEADER, with the
   18  * fields enclosed by brackets "[]" replaced with your own identifying
   19  * information: Portions Copyright [yyyy] [name of copyright owner]
   20  *
   21  * CDDL HEADER END
   22  */
   23 /*
   24  * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
   25  * Use is subject to license terms.
   26  */
   27 /*
   28  * @(#)report.cc 1.17 06/12/12
   29  */
   30 
   31 #pragma ident   "@(#)report.cc  1.17    06/12/12"
   32 
   33 /*
   34  * Copyright 2017-2021 J. Schilling
   35  *
   36  * @(#)report.cc    1.13 21/08/15 2017-2021 J. Schilling
   37  */
   38 #include <schily/mconfig.h>
   39 #ifndef lint
   40 static  UConst char sccsid[] =
   41     "@(#)report.cc  1.13 21/08/15 2017-2021 J. Schilling";
   42 #endif
   43 
   44 #if defined(SCHILY_BUILD) || defined(SCHILY_INCLUDES)
   45 #include <schily/stdio.h>
   46 #include <schily/stdlib.h>
   47 #include <schily/string.h>
   48 #include <schily/param.h>
   49 #include <schily/wait.h>
   50 #include <schily/unistd.h>
   51 #else
   52 #include <stdio.h>
   53 #include <stdlib.h>
   54 #include <string.h>
   55 #include <sys/param.h>
   56 #include <sys/wait.h>
   57 #include <unistd.h>
   58 #define WAIT_T  int
   59 #endif
   60 
   61 #include <vroot/report.h>
   62 #include <vroot/vroot.h>
   63 #include <avo/intl.h>   /* for NOCATGETS */
   64 #include <mk/defs.h>    /* for tmpdir */
   65 
   66 static  FILE    *report_file;
   67 static  FILE    *command_output_fp;
   68 static  char    *target_being_reported_for;
   69 static  char    *search_dir;
   70 static  char    command_output_tmpfile[30];
   71 static  int is_path = 0;
   72 static  char    sfile[MAXPATHLEN];
   73 extern "C" {
   74 static  void    (*warning_ptr) (char *, ...) = (void (*) (char *, ...)) NULL;
   75 }
   76 
   77 FILE *
   78 get_report_file(void)
   79 {
   80     return(report_file);
   81 }
   82 
   83 char *
   84 get_target_being_reported_for(void)
   85 {
   86     return(target_being_reported_for);
   87 }
   88 
   89 #ifdef  HAVE_ATEXIT
   90 extern "C" {
   91 static void
   92 close_report_file(void)
   93 {
   94     (void)fputs("\n", report_file);
   95     (void)fclose(report_file);
   96 }
   97 } // extern "C"
   98 #else
   99 static void
  100 close_report_file(int, ...)
  101 {
  102     (void)fputs("\n", report_file);
  103     (void)fclose(report_file);
  104 }
  105 #endif
  106 
  107 static void
  108 clean_up(FILE *nse_depinfo_fp, FILE *merge_fp, char *nse_depinfo_file, char *merge_file, int unlinkf)
  109 {
  110     fclose(nse_depinfo_fp);
  111     fclose(merge_fp);
  112     fclose(command_output_fp);
  113     unlink(command_output_tmpfile);
  114     if (unlinkf)
  115         unlink(merge_file);
  116     else
  117         rename(merge_file, nse_depinfo_file);
  118 }
  119 
  120 
  121 /*
  122  *  Update the file, if necessary.  We don't want to rewrite
  123  *  the file if we don't have to because we don't want the time of the file
  124  *  to change in that case.
  125  */
  126 extern "C" {
  127 #ifdef  HAVE_ATEXIT
  128 static void
  129 close_file(void)
  130 #else
  131 static void
  132 close_file(int, ...)
  133 #endif
  134 {
  135     char        line[MAXPATHLEN+2];
  136     char        buf[MAXPATHLEN+2];
  137     FILE        *nse_depinfo_fp;
  138     FILE        *merge_fp;
  139     char        nse_depinfo_file[MAXPATHLEN];
  140     char        merge_file[MAXPATHLEN];
  141     char        lock_file[MAXPATHLEN];
  142     int     err;
  143     int     len;
  144     int     changed = 0;
  145     int     file_locked;
  146 
  147     fprintf(command_output_fp, "\n");
  148     fclose(command_output_fp);
  149     if ((command_output_fp = fopen(command_output_tmpfile, "r")) == NULL) {
  150         return;
  151     }
  152     sprintf(nse_depinfo_file, "%s/%s", search_dir, NSE_DEPINFO);
  153     sprintf(merge_file, NOCATGETS("%s/.tmp%s.%d"), search_dir, NSE_DEPINFO, getpid());
  154     sprintf(lock_file, "%s/%s", search_dir, NSE_DEPINFO_LOCK);
  155     err = file_lock(nse_depinfo_file, lock_file, &file_locked, 0);
  156     if (err) {
  157         if (warning_ptr != (void (*) (char *, ...)) NULL) {
  158             (*warning_ptr)(gettext("Couldn't write to %s"), nse_depinfo_file);
  159                       }
  160         unlink(command_output_tmpfile);
  161         return;
  162     }
  163     /* If .nse_depinfo file doesn't exist */
  164     if ((nse_depinfo_fp = fopen(nse_depinfo_file, "r+")) == NULL) {
  165         if (is_path) {
  166             if ((nse_depinfo_fp = 
  167                  fopen(nse_depinfo_file, "w")) == NULL) {
  168                 fprintf(stderr, gettext("Cannot open `%s' for writing\n"),
  169                     nse_depinfo_file);
  170                 unlink(command_output_tmpfile);
  171 
  172                 unlink(lock_file);
  173                 return;
  174             }
  175             while (fgets(line, MAXPATHLEN+2, command_output_fp) 
  176                    != NULL) {
  177                 fprintf(nse_depinfo_fp, "%s", line);
  178             }
  179             fclose(command_output_fp);
  180         }
  181         fclose(nse_depinfo_fp);
  182         if (file_locked) {
  183             unlink(lock_file);
  184         }
  185         unlink(command_output_tmpfile);
  186         return;
  187     }
  188     if ((merge_fp = fopen(merge_file, "w")) == NULL) {
  189         fprintf(stderr, gettext("Cannot open %s for writing\n"), merge_file);
  190         if (file_locked) {
  191             unlink(lock_file);
  192         }
  193         unlink(command_output_tmpfile);
  194         return;
  195     }
  196     len = strlen(sfile);
  197     while (fgets(line, MAXPATHLEN+2, nse_depinfo_fp) != NULL) {
  198         if (strncmp(line, sfile, len) == 0 && line[len] == ':') {
  199             while (fgets(buf, MAXPATHLEN+2, command_output_fp) 
  200                    != NULL) {
  201                 if (is_path) {
  202                     fprintf(merge_fp, "%s", buf);
  203                     if (strcmp(line, buf)) {
  204                         /* changed */
  205                         changed = 1;
  206                     }
  207                 }
  208                 if (buf[strlen(buf)-1] == '\n') {
  209                     break;
  210                 }
  211             }
  212             if (changed || !is_path) {
  213                 while (fgets(line, MAXPATHLEN, nse_depinfo_fp)
  214                        != NULL) {
  215                     fputs(line, merge_fp);
  216                 }
  217                 clean_up(nse_depinfo_fp, merge_fp, 
  218                      nse_depinfo_file, merge_file, 0);
  219             } else {
  220                 clean_up(nse_depinfo_fp, merge_fp, 
  221                      nse_depinfo_file, merge_file, 1);
  222             }
  223             if (file_locked) {
  224                 unlink(lock_file);
  225             }
  226             unlink(command_output_tmpfile);
  227             return;
  228         } /* entry found */
  229         fputs(line, merge_fp);
  230     } 
  231     /* Entry never found.  Add it if there is a search path */
  232     if (is_path) {
  233         while (fgets(line, MAXPATHLEN+2, command_output_fp) != NULL) {
  234             fprintf(nse_depinfo_fp, "%s", line);
  235         }
  236     }
  237     clean_up(nse_depinfo_fp, merge_fp, nse_depinfo_file, merge_file, 1);
  238     if (file_locked) {
  239         unlink(lock_file);
  240     }
  241 }
  242 
  243 } // extern "C"
  244 
  245 static void
  246 report_dep(char *iflag, char *filename)
  247 {
  248 
  249     if (command_output_fp == NULL) {
  250         sprintf(command_output_tmpfile, 
  251             NOCATGETS("%s/%s.%d.XXXXXX"), tmpdir, NSE_DEPINFO, getpid());
  252         int fd = mkstemp(command_output_tmpfile);
  253         if ((fd < 0) || (command_output_fp = fdopen(fd, "w")) == NULL) {
  254             return;
  255         }
  256         if ((search_dir = getenv(NOCATGETS("NSE_DEP"))) == NULL) {
  257             return;
  258         }
  259 #ifdef  HAVE_ATEXIT
  260         atexit(close_file);
  261 #else
  262         on_exit(close_file, 0);
  263 #endif
  264         strcpy(sfile, filename);
  265         if (iflag == NULL || *iflag == '\0') {
  266             return;
  267         }
  268         fprintf(command_output_fp, "%s:", sfile);
  269     }
  270     fprintf(command_output_fp, " ");
  271     fprintf(command_output_fp, "%s", iflag);
  272     if (iflag != NULL) {
  273         is_path = 1;
  274     }
  275 }
  276 
  277 void
  278 report_libdep(char *lib, char *flag)
  279 {
  280     char        *ptr;
  281     char        filename[MAXPATHLEN];
  282     char        *p;
  283 
  284     if ((p= getenv(SUNPRO_DEPENDENCIES)) == NULL) {
  285         return;
  286     }
  287     ptr = strchr(p, ' ');
  288     if(ptr) {
  289         sprintf(filename, "%s-%s", ptr+1, flag);
  290         is_path = 1;
  291         report_dep(lib, filename);
  292     }
  293 }
  294 
  295 void
  296 report_search_path(char *iflag)
  297 {
  298     char        curdir[MAXPATHLEN];
  299     char        *sdir;
  300     char        *newiflag;
  301     char        filename[MAXPATHLEN];
  302     char        *p, *ptr;
  303 
  304     if ((sdir = getenv(NOCATGETS("NSE_DEP"))) == NULL) {
  305         return;
  306     }
  307     if ((p= getenv(SUNPRO_DEPENDENCIES)) == NULL) {
  308         return;
  309     }
  310     ptr = strchr(p, ' ');
  311     if( ! ptr ) {
  312         return;
  313     }
  314     sprintf(filename, NOCATGETS("%s-CPP"), ptr+1);
  315     if (getcwd(curdir, sizeof(curdir)) == NULL)
  316         curdir[0] = nul_char;
  317     if (strcmp(curdir, sdir) != 0 && strlen(iflag) > 2 && 
  318         iflag[2] != '/') {
  319         /* Makefile must have had an "cd xx; cc ..." */
  320         /* Modify the -I path to be relative to the cd */
  321         newiflag = (char *)malloc(strlen(iflag) + strlen(curdir) + 2);
  322         sprintf(newiflag, "-%c%s/%s", iflag[1], curdir, &iflag[2]);
  323         report_dep(newiflag, filename);
  324         free(newiflag);
  325     } else {
  326         report_dep(iflag, filename);
  327     }
  328 }
  329 
  330 void
  331 report_dependency(register const char *name)
  332 {
  333     register char   *filename;
  334     char        buffer[MAXPATHLEN+1];
  335     register char   *p;
  336     register char   *p2;
  337     char        nse_depinfo_file[MAXPATHLEN];
  338 
  339     if (report_file == NULL) {
  340         if ((filename= getenv(SUNPRO_DEPENDENCIES)) == NULL) {
  341             report_file = (FILE *)-1;
  342             return;
  343         }
  344         if (strlen(filename) == 0) {
  345             report_file = (FILE *)-1;
  346             return;
  347         }
  348         (void)strcpy(buffer, name);
  349         name = buffer;
  350         p = strchr(filename, ' ');
  351         if(p) {
  352             *p= 0;
  353         } else {
  354             report_file = (FILE *)-1;
  355             return;
  356         }
  357         if ((report_file= fopen(filename, "a")) == NULL) {
  358             if ((report_file= fopen(filename, "w")) == NULL) {
  359                 report_file= (FILE *)-1;
  360                 return;
  361             }
  362         }
  363 #ifdef  HAVE_ATEXIT
  364         atexit(close_report_file);
  365 #else
  366         (void)on_exit(close_report_file, (char *)report_file);
  367 #endif
  368         if ((p2= strchr(p+1, ' ')) != NULL)
  369             *p2= 0;
  370         target_being_reported_for= (char *)malloc((unsigned)(strlen(p+1)+1));
  371         (void)strcpy(target_being_reported_for, p+1);
  372         (void)fputs(p+1, report_file);
  373         (void)fputs(":", report_file);
  374         *p= ' ';
  375         if (p2 != NULL)
  376             *p2= ' ';
  377     }
  378     if (report_file == (FILE *)-1)
  379         return;
  380     (void)fputs(name, report_file);
  381     (void)fputs(" ", report_file);
  382 }
  383 
  384 #ifdef MAKE_IT
  385 void
  386 make_it(filename)
  387     register char   *filename;
  388 {
  389     register char   *command;
  390     register char   *argv[6];
  391     register int    pid;
  392     WAIT_T      foo;
  393 
  394     if (getenv(SUNPRO_DEPENDENCIES) == NULL) return;
  395     command= alloca(strlen(filename)+32);
  396     (void)sprintf(command, NOCATGETS("make %s\n"), filename);
  397     switch (pid= fork()) {
  398         case 0: /* child */
  399             argv[0]= NOCATGETS("csh");
  400             argv[1]= NOCATGETS("-c");
  401             argv[2]= command;
  402             argv[3]= 0;         
  403             (void)dup2(2, 1);
  404             execve(NOCATGETS("/bin/sh"), argv, environ);
  405             perror(NOCATGETS("execve error"));
  406             exit(1);
  407         case -1: /* error */
  408             perror(NOCATGETS("fork error"));
  409         default: /* parent */
  410             while (wait(&foo) != pid);};
  411 }
  412 #endif
  413