home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / sysinfo-1.0 / part01 / run.c < prev    next >
C/C++ Source or Header  |  1993-04-10  |  4KB  |  180 lines

  1. /*
  2.  * Copyright (c) 1992 Michael A. Cooper.
  3.  * This software may be freely distributed provided it is not sold for 
  4.  * profit and the author is credited appropriately.
  5.  */
  6.  
  7. #ifndef lint
  8. static char *RCSid = "$Header: /src/common/usc/bin/sysinfo/RCS/run.c,v 1.4 1992/04/26 23:32:06 mcooper Exp $";
  9. #endif
  10.  
  11. /*
  12.  * $Log: run.c,v $
  13.  * Revision 1.4  1992/04/26  23:32:06  mcooper
  14.  * Add Copyright notice
  15.  *
  16.  * Revision 1.3  1992/04/17  01:07:59  mcooper
  17.  * More de-linting
  18.  *
  19.  * Revision 1.2  1992/04/16  02:25:39  mcooper
  20.  * Bug fixes, de-linting, and other changes found with CodeCenter.
  21.  *
  22.  * Revision 1.1  1992/03/22  00:20:10  mcooper
  23.  * Initial revision
  24.  *
  25.  */
  26.  
  27.  
  28. /*
  29.  * Things related to running system commands.
  30.  */
  31. #include <stdio.h>
  32. #include "system.h"
  33. #include "defs.h"
  34.  
  35. /*
  36.  * Specific command to determine our model name.
  37.  */
  38. #if    defined(MODEL_COMMAND)
  39. char *ModelCommand[] = { MODEL_COMMAND, NULL };
  40. #endif    /* MODEL_COMMAND */
  41.  
  42. /*
  43.  * Application architecture commands.  
  44.  * These commands should print the system's application architecture.
  45.  */
  46. char *AppArchCmds[] = { 
  47.     "/bin/arch", 
  48.     "/bin/mach", 
  49.     "/bin/machine", 
  50.     NULL };
  51.  
  52. /*
  53.  * Kernel architecture commands.  
  54.  * These commands should print the system's kernel architecture.
  55.  */
  56. char *KernArchCmds[] = { 
  57.     "/bin/arch -k", 
  58.     "/bin/mach",
  59.     "/bin/machine", 
  60.     NULL };
  61.  
  62. /*
  63.  * Architecture test files.
  64.  * Each test file is run and if the exit status is 0, 
  65.  * the basename of the command is the name of the system architecture. 
  66.  */
  67. char *ArchFiles[] = { 
  68.     "/bin/alliant", 
  69.     "/bin/vax", 
  70.     "/bin/sun", 
  71.     NULL };
  72.  
  73. /*
  74.  * CPU type test files.
  75.  * Each test file is run and if the exit status is 0, 
  76.  * the basename of the command is the name of the system CPU type. 
  77.  */
  78. char *CPUFiles[] = { 
  79.     "/bin/sparc",
  80.     "/bin/mc68010",
  81.     "/bin/mc68020",
  82.     "/bin/mc68030",
  83.     "/bin/mc68040",
  84.     "/bin/m68k",
  85.     "/bin/vax",
  86.     "/bin/alliant",
  87.     "/bin/i386", 
  88.     "/bin/i860", 
  89.     "/bin/iAPX286",
  90.     "/bin/pdp11",
  91.     "/bin/u370",
  92.     "/bin/u3b15",
  93.     "/bin/u3b2",
  94.     "/bin/u3b5",
  95.     "/bin/u3b",
  96.     NULL };
  97.  
  98. /*
  99.  * Run a list of commands (found in cmds) and return command output.
  100.  */
  101. extern char *RunCmds(Cmds)
  102.     char               **Cmds;
  103. {
  104.     static char            Buf[BUFSIZ];
  105.     int             l;
  106.     FILE                *pf;
  107.     register char            *p;
  108.     char               **Cmd;
  109.  
  110.     for (Cmd = Cmds; Cmd != NULL && *Cmd != NULL; ++Cmd) {
  111.     /*
  112.      * If this command has any args, nuke them for the access() test.
  113.      */
  114.     strcpy(Buf, *Cmd);
  115.     p = index(Buf, ' ');
  116.     if (p != NULL)
  117.         *p = C_NULL;
  118.  
  119.     if (access(Buf, X_OK) != 0)
  120.         continue;
  121.  
  122.     if ((pf = popen(*Cmd, "r")) == NULL)
  123.         continue;
  124.     if (fgets(Buf, sizeof(Buf), pf) == NULL) {
  125.         pclose(pf);
  126.         continue;
  127.     }
  128.     pclose(pf);
  129.  
  130.     l = strlen(Buf);
  131.     if (Buf[l-1] == '\n') 
  132.         Buf[l-1] = C_NULL;
  133.  
  134.     return(Buf);
  135.     }
  136.  
  137.     return((char *) NULL);
  138. }
  139.  
  140. /*
  141.  * Run a list of test files.  Each test file is run and if the
  142.  * exit status is 0, we return the basename of the command.
  143.  * e.g. If "/bin/vax" exists and returns status 0, return string "vax".
  144.  */
  145. extern char *RunTestFiles(Cmds)
  146.     char               **Cmds;
  147. {
  148.     char               **Cmd;
  149.     register char           *p;
  150.     static char            Buf[BUFSIZ];
  151.  
  152.     for (Cmd = Cmds; Cmd != NULL && *Cmd != NULL; ++Cmd) {
  153.     /*
  154.      * If this command has any args, nuke them for the access() test.
  155.      */
  156.     strcpy(Buf, *Cmd);
  157.     p = index(Buf, ' ');
  158.     if (p != NULL)
  159.         *p = C_NULL;
  160.  
  161.     if (access(Buf, X_OK) != 0)
  162.         continue;
  163.  
  164.     if (system(*Cmd) != 0)
  165.         continue;
  166.  
  167.     /*
  168.      * The name of this architecture is the last part of the Cmd name.
  169.      */
  170.     strcpy(Buf, *Cmd);
  171.     p = rindex(Buf, '/');
  172.     if (p != NULL)
  173.         ++p;
  174.     return(p);
  175.     }
  176.  
  177.     return(NULL);
  178. }
  179.  
  180.