bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Moving `migcom' out of `[exec_prefix]/libexec/'


From: Constantine Kousoulos
Subject: Re: Moving `migcom' out of `[exec_prefix]/libexec/'
Date: Wed, 29 Nov 2006 23:15:45 +0200
User-agent: Icedove 1.5.0.7 (X11/20061013)

Thomas Schwinge wrote:
Hello!

In the GNU MIG package, I'd like to move the `migcom' program out of
`[exec_prefix]/libexec/' (which is where is currently is being installed)
and install it alongside the `mig' program into `[exec_prefix]/bin/' for
being able to use it directly, avoiding constructs like ``$(MIG) -cc cat
- /dev/null'' as a replacement for directly calling `migcom'.

This means that `migcom' should support the basics of the GNU coding
standards, i.e. some `--version' and `--help' output.  Ben, are you
interested in quickly implementig that?  Or is someone else?


Regards,
 Thomas



If that's ok, i can add/modify whatever else is needed.

diff -u mig/migcom.c migcom.c
--- mig/migcom.c        2006-07-29 02:55:25.000000000 +0300
+++ migcom.c    2006-11-29 23:08:52.000000000 +0200
@@ -26,6 +26,9 @@

 /*
  *     Switches are;
+ *             --help    Print the below switches
+ *             --version Print MIG version
+ *
  *             -[v,Q]  verbose or not quiet:  prints out type
  *                     and routine information as mig runs.
  *             -[V,q]  not verbose or quiet : don't print
@@ -91,6 +94,12 @@
        {
            switch (argv[0][1])
            {
+             case '-':
+               if (!strcmp(argv[0], "--help"))
+                       HelpMsg = TRUE;
+               else if (!strcmp(argv[0], "--version"))
+                       PrintVersion = TRUE;
+               break;
              case 'n':
                DefaultFiles = FALSE;
                break;
@@ -212,6 +221,48 @@

     set_program_name("mig");
     parseArgs(argc, argv);
+
+    if (HelpMsg)
+    {
+       printf("Mach Interface Generator (MIG) switches:\n");
+       printf("\t--version Print MIG version\n");
+       printf("\t-[v,Q]  verbose or not quiet:  prints out type\n");
+       printf("\t\tand routine information as mig runs.\n");
+       printf("\t-[V,q]  not verbose or quiet : don't print\n");
+       printf("\t\tinformation during compilation\n");
+       printf("\t\t(this is the default)\n");
+       printf("\t-[r,R]  do or don't use rpc calls instead of\n");
+       printf("\t\tsend/receive pairs. Default is -r.\n");
+       printf("\t-[s,S]  generate symbol table or not:  generate a\n");
+       printf("\t\ttable of rpc-name, number, routine triplets\n");
+       printf("\t\tas an external data structure -- main use is\n");
+       printf("\t\tfor protection system's specification of rights\n");
+       printf("\t\tand for protection dispatch code.  Default is -s.\n");
+       printf("\t-i <prefix>\n");
+       printf("\t\tPut each user routine in its own file.  The\n");
+       printf("\t\tfile is named <prefix><routine-name>.c.\n");
+       printf("\t-user <name>\n");
+       printf("\t\tName the user-side file <name>\n");
+       printf("\t-server <name>\n");
+       printf("\t\tName the server-side file <name>\n");
+       printf("\t-header <name>\n");
+       printf("\t\tName the user-side header file <name>\n");
+       printf("\t-iheader <name>");
+       printf("\t\tName the user-side internal header file <name>\n");
+       printf("\t-sheader <name>\n");
+       printf("\t\tNAme the server-side header file <name>\n");
+       printf("\nReport bugs to bug-hurd@gnu.org\n");
+       exit(0);
+    }
+
+    if (PrintVersion)
+    {
+       printf("GNU MiG 1.3\n");
+       printf("Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n");
+ printf(" Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.\n");
+       exit(0);
+    }
+
     init_global();
     init_type();


diff -u mig/global.h global.h
--- mig/global.h        2001-06-08 03:49:10.000000000 +0300
+++ global.h    2006-11-30 00:37:25.000000000 +0200
@@ -32,6 +32,8 @@
 #include "boolean.h"
 #include "mig_string.h"

+extern boolean_t HelpMsg;
+extern boolean_t PrintVersion;
extern boolean_t DefaultFiles; /* default output file names if no arguments */
 extern boolean_t BeQuiet;      /* no warning messages */
 extern boolean_t BeVerbose;    /* summarize types, routines */


diff -u mig/global.c global.c
--- mig/global.c        2001-06-08 03:49:10.000000000 +0300
+++ global.c    2006-11-30 00:37:39.000000000 +0200
@@ -27,6 +27,8 @@
 #include "error.h"
 #include "global.h"

+boolean_t PrintVersion = FALSE;
+boolean_t HelpMsg = FALSE;
 boolean_t DefaultFiles = TRUE;
 boolean_t BeQuiet = FALSE;
 boolean_t BeVerbose = FALSE;


/*
 * Mach Operating System
 * Copyright (c) 1991,1990 Carnegie Mellon University
 * All Rights Reserved.
 *
 * Permission to use, copy, modify and distribute this software and its
 * documentation is hereby granted, provided that both the copyright
 * notice and this permission notice appear in all copies of the
 * software, derivative works or modified versions, and any portions
 * thereof, and that both notices appear in supporting documentation.
 *
 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 *
 * Carnegie Mellon requests users of this software to return to
 *
 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
 *  School of Computer Science
 *  Carnegie Mellon University
 *  Pittsburgh PA 15213-3890
 *
 * any improvements or extensions that they make and grant Carnegie the
 * rights to redistribute these changes.
 */

#include "error.h"
#include "global.h"

boolean_t PrintVersion = FALSE;
boolean_t HelpMsg = FALSE;
boolean_t DefaultFiles = TRUE;
boolean_t BeQuiet = FALSE;
boolean_t BeVerbose = FALSE;
boolean_t UseMsgRPC = TRUE;
boolean_t GenSymTab = FALSE;

boolean_t IsKernelUser = FALSE;
boolean_t IsKernelServer = FALSE;

const_string_t RCSId = strNULL;

const_string_t SubsystemName = strNULL;
u_int SubsystemBase = 0;

const_string_t MsgOption = strNULL;
const_string_t WaitTime = strNULL;
const_string_t ErrorProc = "MsgError";
const_string_t ServerPrefix = "";
const_string_t UserPrefix = "";
const_string_t ServerDemux = strNULL;
const_string_t SubrPrefix = "";
const_string_t RoutinePrefix = "";

string_t yyinname;

const char LintLib[] = "defined(LINTLIBRARY)";

void
init_global(void)
{
    yyinname = strmake("<no name yet>");
}

string_t UserFilePrefix = strNULL;
string_t UserHeaderFileName = strNULL;
string_t ServerHeaderFileName = strNULL;
string_t InternalHeaderFileName = strNULL;
string_t UserFileName = strNULL;
string_t ServerFileName = strNULL;

void
more_global(void)
{
    if (SubsystemName == strNULL)
        fatal("no SubSystem declaration");

    if (DefaultFiles)
      {
        if (UserHeaderFileName == strNULL)
          UserHeaderFileName = strconcat(SubsystemName, ".h");
        else if (streql(UserHeaderFileName, "/dev/null"))
          UserHeaderFileName = strNULL;

        if (UserFileName == strNULL)
          UserFileName = strconcat(SubsystemName, "User.c");
        else if (streql(UserFileName, "/dev/null"))
          UserFileName = strNULL;

        if (ServerFileName == strNULL)
          ServerFileName = strconcat(SubsystemName, "Server.c");
        else if (streql(ServerFileName, "/dev/null"))
          ServerFileName = strNULL;
      }

    if (ServerDemux == strNULL)
      ServerDemux = strconcat(SubsystemName, "_server");
    if (RoutinePrefix != NULL)
      ServerDemux = strconcat (RoutinePrefix, ServerDemux);
}
/*
 * Mach Operating System
 * Copyright (c) 1991,1990 Carnegie Mellon University
 * All Rights Reserved.
 *
 * Permission to use, copy, modify and distribute this software and its
 * documentation is hereby granted, provided that both the copyright
 * notice and this permission notice appear in all copies of the
 * software, derivative works or modified versions, and any portions
 * thereof, and that both notices appear in supporting documentation.
 *
 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 *
 * Carnegie Mellon requests users of this software to return to
 *
 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
 *  School of Computer Science
 *  Carnegie Mellon University
 *  Pittsburgh PA 15213-3890
 *
 * any improvements or extensions that they make and grant Carnegie the
 * rights to redistribute these changes.
 */

#ifndef _GLOBAL_H
#define _GLOBAL_H

#include <sys/types.h>

#include "boolean.h"
#include "mig_string.h"

extern boolean_t HelpMsg;
extern boolean_t PrintVersion;
extern boolean_t DefaultFiles;  /* default output file names if no arguments */
extern boolean_t BeQuiet;       /* no warning messages */
extern boolean_t BeVerbose;     /* summarize types, routines */
extern boolean_t UseMsgRPC;
extern boolean_t GenSymTab;

extern boolean_t IsKernelUser;
extern boolean_t IsKernelServer;

extern const_string_t RCSId;

extern const_string_t SubsystemName;
extern u_int SubsystemBase;

extern const_string_t MsgOption;
extern const_string_t WaitTime;
extern const_string_t ErrorProc;
extern const_string_t ServerPrefix;
extern const_string_t UserPrefix;
extern const_string_t ServerDemux;
extern const_string_t SubrPrefix;
extern const_string_t RoutinePrefix;

extern int yylineno;
extern string_t yyinname;

extern void init_global(void);

extern string_t UserFilePrefix;
extern string_t UserHeaderFileName;
extern string_t ServerHeaderFileName;
extern string_t InternalHeaderFileName;
extern string_t UserFileName;
extern string_t ServerFileName;

extern void more_global(void);

extern const char LintLib[];

#ifndef NULL
#define NULL 0
#endif

#endif  /* _GLOBAL_H */
/*
 * Mach Operating System
 * Copyright (c) 1993,1991,1990 Carnegie Mellon University
 * All Rights Reserved.
 *
 * Permission to use, copy, modify and distribute this software and its
 * documentation is hereby granted, provided that both the copyright
 * notice and this permission notice appear in all copies of the
 * software, derivative works or modified versions, and any portions
 * thereof, and that both notices appear in supporting documentation.
 *
 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 *
 * Carnegie Mellon requests users of this software to return to
 *
 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
 *  School of Computer Science
 *  Carnegie Mellon University
 *  Pittsburgh PA 15213-3890
 *
 * any improvements or extensions that they make and grant Carnegie the
 * rights to redistribute these changes.
 */

/*
 *      Switches are;
 *              --help    Print the below switches
 *              --version Print MIG version
 *
 *              -[v,Q]  verbose or not quiet:  prints out type
 *                      and routine information as mig runs.
 *              -[V,q]  not verbose or quiet : don't print
 *                      information during compilation
 *                      (this is the default)
 *              -[r,R]  do or don't use rpc calls instead of
 *                      send/receive pairs. Default is -r.
 *              -[s,S]  generate symbol table or not:  generate a
 *                      table of rpc-name, number, routine triplets
 *                      as an external data structure -- main use is
 *                      for protection system's specification of rights
 *                      and for protection dispatch code.  Default is -s.
 *              -i <prefix>
 *                      Put each user routine in its own file.  The
 *                      file is named <prefix><routine-name>.c.
 *              -user <name>
 *                      Name the user-side file <name>
 *              -server <name>
 *                      Name the server-side file <name>
 *              -header <name>
 *                      Name the user-side header file <name>
 *              -iheader <name>
 *                      Name the user-side internal header file <name>
 *              -sheader <name>
 *                      NAme the server-side header file <name>
 *
 *  DESIGN:
 *      Mig uses a lexxer module created by lex from lexxer.l and
 *      a parser module created by yacc from parser.y to parse an
 *      interface definitions module for a mach server.
 *      The parser module calls routines in statement.c
 *      and routines.c to build a list of statement structures.
 *      The most interesting statements are the routine definitions
 *      which contain information about the name, type, characteristics
 *      of the routine, an argument list containing information for
 *      each argument type, and a list of special arguments. The
 *      argument type structures are build by routines in type.c
 *      Once parsing is completed, the three code generation modules:
 *      header.c user.c and server.c are called sequentially. These
 *      do some code generation directly and also call the routines
 *      in utils.c for common (parameterized) code generation.
 *
 */

#include <stdio.h>

#include "error.h"
#include "lexxer.h"
#include "global.h"
#include "write.h"

extern int yyparse();
static FILE *myfopen(const char *name, const char *mode);
static void myfclose(FILE *file, const char *name);

static string_t RoutineListFileName;

static void
parseArgs(int argc, char **argv)
{
    while (--argc > 0)
        if ((++argv)[0][0] == '-')
        {
            switch (argv[0][1])
            {
              case '-':
                if (!strcmp(argv[0], "--help"))
                        HelpMsg = TRUE;
                else if (!strcmp(argv[0], "--version")) 
                        PrintVersion = TRUE;
                break;
              case 'n':
                DefaultFiles = FALSE;
                break;
              case 'q':
                BeQuiet = TRUE;
                break;
              case 'Q':
                BeQuiet = FALSE;
                break;
              case 'v':
                BeVerbose = TRUE;
                break;
              case 'V':
                BeVerbose = FALSE;
                break;
              case 'r':
                UseMsgRPC = TRUE;
                break;
              case 'R':
                UseMsgRPC = FALSE;
                break;
              case 'l':
                if (streql(argv[0], "-list"))
                {
                    --argc; ++argv;
                    if (argc == 0)
                        fatal("missing name for -list option");
                    RoutineListFileName = strmake(argv[0]);
                }
                break;
              case 's':
                if (streql(argv[0], "-server"))
                {
                    --argc; ++argv;
                    if (argc == 0)
                        fatal("missing name for -server option");
                    ServerFileName = strmake(argv[0]);
                }
                else if (streql(argv[0], "-sheader"))
                {
                    --argc; ++argv;
                    if (argc == 0)
                      fatal ("missing name for -sheader option");
                    ServerHeaderFileName = strmake(argv[0]);
                }
                else if (streql(argv[0], "-subrprefix"))
                  {
                    --argc; ++argv;
                    if (argc == 0)
                      fatal ("missing string for -subrprefix option");
                    SubrPrefix = strmake(argv[0]);
                  }
                else
                    GenSymTab = TRUE;
                break;
              case 'S':
                GenSymTab = FALSE;
                break;
              case 'i':
                if (streql(argv[0], "-iheader"))
                {
                    --argc; ++argv;
                    if (argc == 0)
                        fatal("missing name for -iheader option");
                    InternalHeaderFileName = strmake(argv[0]);
                }
                else
                {
                    --argc; ++argv;
                    if (argc == 0)
                        fatal("missing prefix for -i option");
                    UserFilePrefix = strmake(argv[0]);
                }
                break;
              case 'u':
                if (streql(argv[0], "-user"))
                {
                    --argc; ++argv;
                    if (argc == 0)
                        fatal("missing name for -user option");
                    UserFileName = strmake(argv[0]);
                }
                else
                    fatal("unknown flag: '%s'", argv[0]);
                break;
              case 'h':
                if (streql(argv[0], "-header"))
                {
                    --argc; ++argv;
                    if (argc == 0)
                        fatal("missing name for -header option");
                    UserHeaderFileName = strmake(argv[0]);
                }
                else
                    fatal("unknown flag: '%s'", argv[0]);
                break;
              case 'p':
                if (streql(argv[0], "-prefix"))
                  {
                    if (--argc == 0)
                      fatal ("missing string for -prefix option");
                    RoutinePrefix = strmake(*++argv);
                  }
                break;
              default:
                fatal("unknown flag: '%s'", argv[0]);
                /*NOTREACHED*/
            }
        }
        else
            fatal("bad argument: '%s'", *argv);
}

int
main(int argc, char **argv)
{
    FILE *uheader, *server, *user;
    FILE *iheader, *sheader;

    set_program_name("mig");
    parseArgs(argc, argv);

    if (HelpMsg)
    {
        printf("Mach Interface Generator (MIG) switches:\n");
        printf("\t--version Print MIG version\n");
        printf("\t-[v,Q]  verbose or not quiet:  prints out type\n");
        printf("\t\tand routine information as mig runs.\n");
        printf("\t-[V,q]  not verbose or quiet : don't print\n");
        printf("\t\tinformation during compilation\n");
        printf("\t\t(this is the default)\n");
        printf("\t-[r,R]  do or don't use rpc calls instead of\n");
        printf("\t\tsend/receive pairs. Default is -r.\n");
        printf("\t-[s,S]  generate symbol table or not:  generate a\n");
        printf("\t\ttable of rpc-name, number, routine triplets\n");
        printf("\t\tas an external data structure -- main use is\n");
        printf("\t\tfor protection system's specification of rights\n");
        printf("\t\tand for protection dispatch code.  Default is -s.\n");
        printf("\t-i <prefix>\n");
        printf("\t\tPut each user routine in its own file.  The\n");
        printf("\t\tfile is named <prefix><routine-name>.c.\n");
        printf("\t-user <name>\n");
        printf("\t\tName the user-side file <name>\n");
        printf("\t-server <name>\n");
        printf("\t\tName the server-side file <name>\n");
        printf("\t-header <name>\n");
        printf("\t\tName the user-side header file <name>\n");
        printf("\t-iheader <name>");
        printf("\t\tName the user-side internal header file <name>\n");
        printf("\t-sheader <name>\n");
        printf("\t\tNAme the server-side header file <name>\n");
        printf("\nReport bugs to bug-hurd@gnu.org\n");
        exit(0);
    }

    if (PrintVersion)
    {
        printf("GNU MiG 1.3\n");
        printf("Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n");
        printf(" Everyone is permitted to copy and distribute verbatim copies 
of this license document, but changing it is not allowed.\n");
        exit(0);
    }

    init_global();
    init_type();

    LookNormal();
    (void) yyparse();

    if (errors > 0)
        exit(1);

    more_global();

    uheader = myfopen(UserHeaderFileName, "w");
    if (!UserFilePrefix)
        user = myfopen(UserFileName, "w");
    server = myfopen(ServerFileName, "w");
    if (ServerHeaderFileName)
        sheader = myfopen(ServerHeaderFileName, "w");
    if (IsKernelServer)
    {
        iheader = myfopen(InternalHeaderFileName, "w");
    }

    if (BeVerbose)
    {
        printf("Writing %s ... ", UserHeaderFileName);
        fflush(stdout);
    }
    WriteUserHeader(uheader, StatementList);
    myfclose(uheader, UserHeaderFileName);
    if (ServerHeaderFileName)
    {
        if (BeVerbose)
        {
            printf ("done.\nWriting %s ...", ServerHeaderFileName);
            fflush (stdout);
        }
        WriteServerHeader(sheader, StatementList);
        myfclose(sheader, ServerHeaderFileName);
    }
    if (IsKernelServer)
    {
        if (BeVerbose)
        {
            printf("done.\nWriting %s ... ", InternalHeaderFileName);
            fflush(stdout);
        }
        WriteInternalHeader(iheader, StatementList);
        myfclose(iheader, InternalHeaderFileName);
    }
    if (UserFilePrefix)
    {
        if (BeVerbose)
        {
            printf("done.\nWriting individual user files ... ");
            fflush(stdout);
        }
        WriteUserIndividual(StatementList);
    }
    else
    {
        if (BeVerbose)
        {
            printf("done.\nWriting %s ... ", UserFileName);
            fflush(stdout);
        }
        WriteUser(user, StatementList);
        myfclose(user, UserFileName);
    }
    if (BeVerbose)
    {
        printf("done.\nWriting %s ... ", ServerFileName);
        fflush(stdout);
    }
    WriteServer(server, StatementList);
    myfclose(server, ServerFileName);

    if (RoutineListFileName != strNULL)
      {
        FILE *listfile = myfopen (RoutineListFileName, "w");
        WriteRoutineList (listfile, StatementList);
        myfclose (listfile, RoutineListFileName);
      }

    if (BeVerbose)
        printf("done.\n");

    return 0;
}

static FILE *
myfopen(const char *name, const char *mode)
{
    const char *realname;
    FILE *file;
    extern int errno;

    if (name == strNULL)
        realname = "/dev/null";
    else
        realname = name;

    file = fopen(realname, mode);
    if (file == NULL)
        fatal("fopen(%s): %s", realname, unix_error_string(errno));

    return file;
}

static void
myfclose(FILE *file, const char *name)
{
    if (ferror(file) || fclose(file))
        fatal("fclose(): ", name, unix_error_string(errno));
}

reply via email to

[Prev in Thread] Current Thread [Next in Thread]