home *** CD-ROM | disk | FTP | other *** search
/ ftp.cdrom.com/pub/cdrom/ / cdrom.tar / cdrom / source / mount.c < prev    next >
C/C++ Source or Header  |  1992-06-02  |  24KB  |  538 lines

  1. /*
  2.  *     Mount.c  (Program to perform 'safe' file system mount/umount
  3.  *               operations without requiring super user permissions.)
  4.  *     Copyright (C) 1992  Don Trimmer, Delta Microsystems, Inc.
  5.  * 
  6.  *     This program is free software; you can redistribute it and/or modify
  7.  *     it under the terms of the GNU General Public License as published by
  8.  *     the Free Software Foundation; either version 1, or (at your option)
  9.  *     any later version.
  10.  * 
  11.  *     This program is distributed in the hope that it will be useful,
  12.  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *     GNU General Public License for more details.
  15.  * 
  16.  *     This notice was shamelessly copied from the GNU General Public
  17.  *     License.  That license is included in it's entirety at the end
  18.  *     of this listing.  Please note that GNU grants permission to copy
  19.  *     their license statement as long as it is complete and unmodified.
  20.  * 
  21.  */
  22.  
  23. /*
  24. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  25.  
  26.  *** Program:   Mount (Umount)
  27.  
  28.  *** Purpose:   Allow anybody to mount/umount file systems from
  29.                 specified devices, while preventing anybody but 'root'
  30.                 from performing other mount/umount operations.
  31.  
  32.  *** Usage:     Mount  args
  33.                 Umount args
  34.                        args:   The arguments normally given to mount
  35.                                or umount.
  36.  
  37.  *** Notes:     Use the following shell script to build executable:
  38.  
  39.                 #!/bin/csh
  40.                 #
  41.                 #  The following two lines build a test version.  To
  42.                 #    build the real version, comment out the next two
  43.                 #    lines and remove the leading '# ' from the
  44.                 #    following two commands:
  45.                 #
  46.                 echo "Compiling test version (echo mount arguments)"
  47.                 cc -DTEST -o Mount Mount.c
  48.                 # echo "Compiling and loading Mount"
  49.                 # cc -o Mount Mount.c
  50.  
  51.                 echo "Changing Mount ownership and permissions"
  52.                 chown root Mount
  53.                 chmod 4555 Mount
  54.  
  55.                 echo "Linking Umount to Mount"
  56.                 /bin/rm Umount | echo -n ""
  57.                 ln Mount Umount
  58.                 /bin/ls -l Mount Umount
  59.  
  60.                 echo "Done!"
  61.  
  62.  *** History:   04/08/91:  Under development--D. Trimmer
  63.                 04/08/91:  Tested--D. Trimmer
  64.                 10/19/91:  cdrom and pcfs added by W. Kennedy
  65.                 03/03/92:  Removed references to 'smo', added
  66.                            'uflop' and improved security --D. Trimmer
  67.  
  68. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  69. */
  70.  
  71. #include <stdio.h>
  72. #include <sys/types.h>
  73. #include <sys/stat.h>
  74. #include <sys/param.h>
  75. #include <errno.h>
  76.  
  77. #define CLEAR           0
  78. #define SET             1
  79. #define REEXPLEN        80
  80. #define NEWMOUNTCOM     "Mount"
  81. #define NEWUMOUNTCOM    "Umount"
  82.  
  83. #ifdef  TEST
  84. #       define MOUNTCOM         "echo"
  85. #       define UMOUNTCOM        "echo"
  86. #       define MOUNTPATH        "/bin/"
  87. #       define UMOUNTPATH       "/bin/"
  88. #else   TEST
  89. #       define MOUNTCOM         "mount"
  90. #       define UMOUNTCOM        "umount"
  91. #       define MOUNTPATH        "/usr/etc/"
  92. #       define UMOUNTPATH       "/usr/etc/"
  93. #endif  TEST
  94.  
  95. /*
  96.  *  "devices" is an array of strings.  Each string is a regular
  97.  *    expression which matches a device or directory.  If a device
  98.  *    is specified, then the directory on which the device should
  99.  *    be mounted should also be specified:
  100.  *
  101.  *      Mount /dev/sd3c /tmp
  102.  *
  103.  *    If only the directory is specified, then the file /etc/fstab
  104.  *    is referenced to determine what file system is normally
  105.  *    mounted on that directory:
  106.  *
  107.  *      Line in /etc/fstab:  /dev/sd3c /tmp 4.2 rw,noauto 0 0
  108.  *      Mount /tmp
  109.  */
  110.  
  111. char  devices[][REEXPLEN] = {
  112.         /*
  113.          *  Make entries in /etc/fstab for each of the following
  114.          *    entries and create directories /cdrom, /pcfs and
  115.          *    /uflop.
  116.          */
  117.         "/cdrom",
  118.         "/pcfs",
  119.         "/uflop",
  120.         ""
  121. };
  122.  
  123. main(argc,argv)
  124. int     argc;
  125. char    *argv[];
  126. {
  127.         int     i,j,k;                  /* Index */
  128.         int     ValidatedFlag=CLEAR;    /* OK to proceed flag */
  129.         char    Path[MAXPATHLEN];       /* Path of mount/umount */
  130.         char    Name[MAXPATHLEN];       /* mount or umount */
  131.         struct  stat stbuf;             /* File status structure */
  132.  
  133.         if(getuid() && argc>1) {
  134.                 /* UID not root, so validate permission */
  135.                 for(i=0;devices[i][0] && !ValidatedFlag;i++) {
  136.                         if(re_comp(devices[i])) {
  137.                                 fprintf(stderr,
  138.                                   "%s %s (errno=%d)\n",
  139.                                   "Can't compile regular expression",
  140.                                   devices[i],errno);
  141.                                 exit(1);
  142.                         }
  143.                         for(j=1;j<argc;j++) {
  144.                                 if(re_exec(argv[j]) == 1) {
  145.                                         /* Match found */
  146.                                         ValidatedFlag = SET;
  147.                                         break;
  148.                                 }
  149.                         }
  150.                 }
  151.  
  152.                 if(ValidatedFlag) {
  153.                         /*
  154.                          *  Check to make sure no other arguments are block
  155.                          *    special files, 'NFS' file systems or dangerous
  156.                          *    options in case someone is trying to fake us out.
  157.                          */
  158.                         for(k=1;k<argc;k++) {
  159.                                 if(k == j)
  160.                                         continue;
  161.                                 if(!stat(argv[k],&stbuf)) {
  162. #ifdef S_ISBLK
  163.                                         if(S_ISBLK(stbuf.st_mode)) {
  164. #else
  165.                                         if(S_IFBLK & stbuf.st_mode) {
  166. #endif
  167.                                                 /*
  168.                                                  *  A block special device.
  169.                                                  *    Probably a HACKER!!
  170.                                                  */
  171.                                                 ValidatedFlag = CLEAR;
  172.                                                 break;
  173.                                         } /* } */
  174.                                 } else if(index(argv[k],':')) {
  175.                                         /*
  176.                                          *  Probably NFS mount
  177.                                          */
  178.                                         ValidatedFlag = CLEAR;
  179.                                         break;
  180.                                 } else if(!strcmp(argv[k],"-a") ||
  181.                                    !strcmp(argv[k],"-h")) {
  182.                                         /*
  183.                                          *  -a and -h are dangerous options
  184.                                          */
  185.                                         ValidatedFlag = CLEAR;
  186.                                         break;
  187.                                 }
  188.                         }
  189.                 }
  190.  
  191.                 if(!ValidatedFlag) {
  192.                         fprintf(stderr,"Permission denied.\n");
  193.                         exit(1);
  194.                 }
  195.         }
  196.  
  197.         /*
  198.          *  If we got here, OK to perform [u]mount.  Build mount/umount
  199.          *    command and reset argv[0] to point at new command name
  200.          */
  201.         if(!strcmp(argv[0],NEWMOUNTCOM)) {
  202.                 strcpy(Name,MOUNTCOM);
  203.                 sprintf(Path,"%s%s",MOUNTPATH,MOUNTCOM);
  204.         } else {
  205.                 strcpy(Name,UMOUNTCOM);
  206.                 sprintf(Path,"%s%s",UMOUNTPATH,UMOUNTCOM);
  207.         }
  208.         argv[0] = Name;
  209.  
  210.         execv(Path,argv);
  211.  
  212.         /*  Should never get here  */
  213.         fprintf(stderr,"Error exec'ing command (errno=%d)\n",errno);
  214.         exit(1);
  215. }
  216.  
  217. /*
  218.  *  ================================
  219.  *  Compiling and installing 'Mount'
  220.  *  ================================
  221.  *  
  222.  *  It is necessary to log in as 'root' to install 'Mount'.  After
  223.  *  loging in as root, compile and load 'Mount.c', turn on the SUID
  224.  *  bit and link 'Mount' with 'Umount':
  225.  *  
  226.  *      % cc -DTEST -o Mount Mount.c
  227.  *      % chmod 4555 Mount
  228.  *      % /bin/rm Umount   # Don't worry if this gives an error
  229.  *      % ln Mount Umount
  230.  *  
  231.  *  The SUID bit allows the code to execute with the access priviledges
  232.  *  of the owner of the program (root in this case).  The '-DTEST"
  233.  *  flag on the compile line generates a program which will echo
  234.  *  the actions it would normally take without actually performing
  235.  *  them.  The user can use this mode to verify that the code is
  236.  *  behaving as desired.  To generate a copy of 'Mount' which actually
  237.  *  works, repeat the above steps but leave the '-DTEST' option out
  238.  *  of the command line.
  239.  *  
  240.  *  ================================
  241.  *  Additions to /etc/fstab:
  242.  *  ================================
  243.  *  
  244.  *  # CD-ROM entry
  245.  *  /dev/rd0        /cdrom        hsfs ro,noauto 0 0
  246.  *  
  247.  *  # Floppy entry for DOS disk
  248.  *  /dev/fd0        /pcfs        pcfs rw,noauto 0 0
  249.  *
  250.  *  # Floppy entry for SunOS file system
  251.  *  /dev/fd0        /uflop        4.2  rw,noauto 0 0
  252.  *  
  253.  *  
  254.  *  hsfs:  Indicates that a CD-ROM file system is present.
  255.  *         High Sierra and ISO 9660 file systems are supported.
  256.  *  pcfs:  Indicates a DOS file system is present.
  257.  *  4.2:   Indicates a standard SunOS file system is present.
  258.  *  ro:    Read-only file system
  259.  *  rw:    Read-write file system
  260.  *  noauto:  Don't mount file system when 'mount -a' is executed.
  261.  *  0:     First '0' indicates interval between 'dumps'
  262.  *         Second '0' indicates file system check (fsck) won't be run
  263.  *  
  264.  *  If a floppy disk containing a DOS file system is to be mounted,
  265.  *  then use:
  266.  *  
  267.  *      % Mount /pcfs
  268.  *  
  269.  *  If a floppy disk contains a standard SunOS file system, then the
  270.  *  appropriate 'Mount' command is:
  271.  *  
  272.  *      % Mount /uflop
  273.  *  
  274.  *  ================================
  275.  *  Creating directories:
  276.  *  ================================
  277.  *  
  278.  *  Log in as root:
  279.  *  % mkdir /cdrom /pcfs /uflop
  280.  *  % chmod 777 /cdrom /pcfs /uflop
  281.  * 
  282.  * 
  283.  *
  284.  *
  285.  * ================================================
  286.  * GNU Copyright statement:
  287.  * ================================================
  288.  * 
  289.  *                  GNU GENERAL PUBLIC LICENSE
  290.  *                   Version 1, February 1989
  291.  * 
  292.  *  Copyright (C) 1989 Free Software Foundation, Inc.
  293.  *                     675 Mass Ave, Cambridge, MA 02139, USA
  294.  *  Everyone is permitted to copy and distribute verbatim copies
  295.  *  of this license document, but changing it is not allowed.
  296.  * 
  297.  *                          Preamble
  298.  * 
  299.  *   The license agreements of most software companies try to keep users
  300.  * at the mercy of those companies.  By contrast, our General Public
  301.  * License is intended to guarantee your freedom to share and change free
  302.  * software--to make sure the software is free for all its users.  The
  303.  * General Public License applies to the Free Software Foundation's
  304.  * software and to any other program whose authors commit to using it.
  305.  * You can use it for your programs, too.
  306.  * 
  307.  *   When we speak of free software, we are referring to freedom, not
  308.  * price.  Specifically, the General Public License is designed to make
  309.  * sure that you have the freedom to give away or sell copies of free
  310.  * software, that you receive source code or can get it if you want it,
  311.  * that you can change the software or use pieces of it in new free
  312.  * programs; and that you know you can do these things.
  313.  * 
  314.  *   To protect your rights, we need to make restrictions that forbid
  315.  * anyone to deny you these rights or to ask you to surrender the rights.
  316.  * These restrictions translate to certain responsibilities for you if you
  317.  * distribute copies of the software, or if you modify it.
  318.  * 
  319.  *   For example, if you distribute copies of a such a program, whether
  320.  * gratis or for a fee, you must give the recipients all the rights that
  321.  * you have.  You must make sure that they, too, receive or can get the
  322.  * source code.  And you must tell them their rights.
  323.  * 
  324.  *   We protect your rights with two steps: (1) copyright the software, and
  325.  * (2) offer you this license which gives you legal permission to copy,
  326.  * distribute and/or modify the software.
  327.  * 
  328.  *   Also, for each author's protection and ours, we want to make certain
  329.  * that everyone understands that there is no warranty for this free
  330.  * software.  If the software is modified by someone else and passed on, we
  331.  * want its recipients to know that what they have is not the original, so
  332.  * that any problems introduced by others will not reflect on the original
  333.  * authors' reputations.
  334.  * 
  335.  *   The precise terms and conditions for copying, distribution and
  336.  * modification follow.
  337.  * 
  338.  *                  GNU GENERAL PUBLIC LICENSE
  339.  *    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  340.  * 
  341.  *   0. This License Agreement applies to any program or other work which
  342.  * contains a notice placed by the copyright holder saying it may be
  343.  * distributed under the terms of this General Public License.  The
  344.  * "Program", below, refers to any such program or work, and a "work based
  345.  * on the Program" means either the Program or any work containing the
  346.  * Program or a portion of it, either verbatim or with modifications.  Each
  347.  * licensee is addressed as "you".
  348.  * 
  349.  *   1. You may copy and distribute verbatim copies of the Program's source
  350.  * code as you receive it, in any medium, provided that you conspicuously and
  351.  * appropriately publish on each copy an appropriate copyright notice and
  352.  * disclaimer of warranty; keep intact all the notices that refer to this
  353.  * General Public License and to the absence of any warranty; and give any
  354.  * other recipients of the Program a copy of this General Public License
  355.  * along with the Program.  You may charge a fee for the physical act of
  356.  * transferring a copy.
  357.  * 
  358.  *   2. You may modify your copy or copies of the Program or any portion of
  359.  * it, and copy and distribute such modifications under the terms of Paragraph
  360.  * 1 above, provided that you also do the following:
  361.  * 
  362.  *     a) cause the modified files to carry prominent notices stating that
  363.  *     you changed the files and the date of any change; and
  364.  * 
  365.  *     b) cause the whole of any work that you distribute or publish, that
  366.  *     in whole or in part contains the Program or any part thereof, either
  367.  *     with or without modifications, to be licensed at no charge to all
  368.  *     third parties under the terms of this General Public License (except
  369.  *     that you may choose to grant warranty protection to some or all
  370.  *     third parties, at your option).
  371.  * 
  372.  *     c) If the modified program normally reads commands interactively when
  373.  *     run, you must cause it, when started running for such interactive use
  374.  *     in the simplest and most usual way, to print or display an
  375.  *     announcement including an appropriate copyright notice and a notice
  376.  *     that there is no warranty (or else, saying that you provide a
  377.  *     warranty) and that users may redistribute the program under these
  378.  *     conditions, and telling the user how to view a copy of this General
  379.  *     Public License.
  380.  * 
  381.  *     d) You may charge a fee for the physical act of transferring a
  382.  *     copy, and you may at your option offer warranty protection in
  383.  *     exchange for a fee.
  384.  * 
  385.  * Mere aggregation of another independent work with the Program (or its
  386.  * derivative) on a volume of a storage or distribution medium does not bring
  387.  * the other work under the scope of these terms.
  388.  * 
  389.  *   3. You may copy and distribute the Program (or a portion or derivative of
  390.  * it, under Paragraph 2) in object code or executable form under the terms of
  391.  * Paragraphs 1 and 2 above provided that you also do one of the following:
  392.  * 
  393.  *     a) accompany it with the complete corresponding machine-readable
  394.  *     source code, which must be distributed under the terms of
  395.  *     Paragraphs 1 and 2 above; or,
  396.  * 
  397.  *     b) accompany it with a written offer, valid for at least three
  398.  *     years, to give any third party free (except for a nominal charge
  399.  *     for the cost of distribution) a complete machine-readable copy of the
  400.  *     corresponding source code, to be distributed under the terms of
  401.  *     Paragraphs 1 and 2 above; or,
  402.  * 
  403.  *     c) accompany it with the information you received as to where the
  404.  *     corresponding source code may be obtained.  (This alternative is
  405.  *     allowed only for noncommercial distribution and only if you
  406.  *     received the program in object code or executable form alone.)
  407.  * 
  408.  * Source code for a work means the preferred form of the work for making
  409.  * modifications to it.  For an executable file, complete source code means
  410.  * all the source code for all modules it contains; but, as a special
  411.  * exception, it need not include source code for modules which are standard
  412.  * libraries that accompany the operating system on which the executable
  413.  * file runs, or for standard header files or definitions files that
  414.  * accompany that operating system.
  415.  * 
  416.  *   4. You may not copy, modify, sublicense, distribute or transfer the
  417.  * Program except as expressly provided under this General Public License.
  418.  * Any attempt otherwise to copy, modify, sublicense, distribute or transfer
  419.  * the Program is void, and will automatically terminate your rights to use
  420.  * the Program under this License.  However, parties who have received
  421.  * copies, or rights to use copies, from you under this General Public
  422.  * License will not have their licenses terminated so long as such parties
  423.  * remain in full compliance.
  424.  * 
  425.  *   5. By copying, distributing or modifying the Program (or any work based
  426.  * on the Program) you indicate your acceptance of this license to do so,
  427.  * and all its terms and conditions.
  428.  * 
  429.  *   6. Each time you redistribute the Program (or any work based on the
  430.  * Program), the recipient automatically receives a license from the original
  431.  * licensor to copy, distribute or modify the Program subject to these
  432.  * terms and conditions.  You may not impose any further restrictions on the
  433.  * recipients' exercise of the rights granted herein.
  434.  *  
  435.  *   7. The Free Software Foundation may publish revised and/or new versions
  436.  * of the General Public License from time to time.  Such new versions will
  437.  * be similar in spirit to the present version, but may differ in detail to
  438.  * address new problems or concerns.
  439.  * 
  440.  * Each version is given a distinguishing version number.  If the Program
  441.  * specifies a version number of the license which applies to it and "any
  442.  * later version", you have the option of following the terms and conditions
  443.  * either of that version or of any later version published by the Free
  444.  * Software Foundation.  If the Program does not specify a version number of
  445.  * the license, you may choose any version ever published by the Free Software
  446.  * Foundation.
  447.  * 
  448.  *   8. If you wish to incorporate parts of the Program into other free
  449.  * programs whose distribution conditions are different, write to the author
  450.  * to ask for permission.  For software which is copyrighted by the Free
  451.  * Software Foundation, write to the Free Software Foundation; we sometimes
  452.  * make exceptions for this.  Our decision will be guided by the two goals
  453.  * of preserving the free status of all derivatives of our free software and
  454.  * of promoting the sharing and reuse of software generally.
  455.  * 
  456.  *                          NO WARRANTY
  457.  * 
  458.  *   9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
  459.  * FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
  460.  * OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
  461.  * PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
  462.  * OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  463.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
  464.  * TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
  465.  * PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
  466.  * REPAIR OR CORRECTION.
  467.  * 
  468.  *   10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
  469.  * WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
  470.  * REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
  471.  * INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
  472.  * OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
  473.  * TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
  474.  * YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
  475.  * PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
  476.  * POSSIBILITY OF SUCH DAMAGES.
  477.  * 
  478.  *                   END OF TERMS AND CONDITIONS
  479.  * 
  480.  *      Appendix: How to Apply These Terms to Your New Programs
  481.  * 
  482.  *   If you develop a new program, and you want it to be of the greatest
  483.  * possible use to humanity, the best way to achieve this is to make it
  484.  * free software which everyone can redistribute and change under these
  485.  * terms.
  486.  * 
  487.  *   To do so, attach the following notices to the program.  It is safest to
  488.  * attach them to the start of each source file to most effectively convey
  489.  * the exclusion of warranty; and each file should have at least the
  490.  * "copyright" line and a pointer to where the full notice is found.
  491.  * 
  492.  *     <one line to give the program's name and a brief idea of what it does.>
  493.  *     Copyright (C) 19yy  <name of author>
  494.  * 
  495.  *     This program is free software; you can redistribute it and/or modify
  496.  *     it under the terms of the GNU General Public License as published by
  497.  *     the Free Software Foundation; either version 1, or (at your option)
  498.  *     any later version.
  499.  * 
  500.  *     This program is distributed in the hope that it will be useful,
  501.  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  502.  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  503.  *     GNU General Public License for more details.
  504.  * 
  505.  *     You should have received a copy of the GNU General Public License
  506.  *     along with this program; if not, write to the Free Software
  507.  *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  508.  * 
  509.  * Also add information on how to contact you by electronic and paper mail.
  510.  * 
  511.  * If the program is interactive, make it output a short notice like this
  512.  * when it starts in an interactive mode:
  513.  * 
  514.  *     Gnomovision version 69, Copyright (C) 19xx name of author
  515.  *     Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
  516.  *     This is free software, and you are welcome to redistribute it
  517.  *     under certain conditions; type `show c' for details.
  518.  * 
  519.  * The hypothetical commands `show w' and `show c' should show the
  520.  * appropriate parts of the General Public License.  Of course, the
  521.  * commands you use may be called something other than `show w' and `show
  522.  * c'; they could even be mouse-clicks or menu items--whatever suits your
  523.  * program.
  524.  * 
  525.  * You should also get your employer (if you work as a programmer) or your
  526.  * school, if any, to sign a "copyright disclaimer" for the program, if
  527.  * necessary.  Here a sample; alter the names:
  528.  * 
  529.  *   Yoyodyne, Inc., hereby disclaims all copyright interest in the
  530.  *   program `Gnomovision' (a program to direct compilers to make passes
  531.  *   at assemblers) written by James Hacker.
  532.  * 
  533.  *   <signature of Ty Coon>, 1 April 1989
  534.  *   Ty Coon, President of Vice
  535.  * 
  536.  * That's all there is to it!
  537.  */
  538.