home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume22 / cdmount / part01 / cdmount.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-08-17  |  5.1 KB  |  169 lines

  1. /*
  2. **  Subsystem:   User Level mount for CD-ROM
  3. **  File Name:   cdmount.c
  4. **                                                        
  5. ** This software is Copyright (c) 1991 by Kent Landfield.
  6. **
  7. ** Permission is hereby granted to copy, distribute or otherwise 
  8. ** use any part of this package as long as you do not try to make 
  9. ** money from it or pretend that you wrote it.  This copyright 
  10. ** notice must be maintained in any copy made.
  11. **
  12. ** Use of this software constitutes acceptance for use in an AS IS 
  13. ** condition. There are NO warranties with regard to this software.  
  14. ** In no event shall the author be liable for any damages whatsoever 
  15. ** arising out of or in connection with the use or performance of this 
  16. ** software.  Any use of this software is at the user's own risk.
  17. **
  18. **  If you make modifications to this software that you feel 
  19. **  increases it usefulness for the rest of the community, please 
  20. **  email the changes, enhancements, bug fixes as well as any and 
  21. **  all ideas to me. This software is going to be maintained and 
  22. **  enhanced as deemed necessary by the community.
  23. **              
  24. **              Kent Landfield
  25. **              sparky!kent
  26. **              kent@sparky.imd.sterling.com
  27. */
  28. #if !defined(lint) && !defined(SABER)
  29. static char SID[] = "@(#)cdmount.c    1.1 8/17/91";
  30. #endif
  31.  
  32. #include <stdio.h>
  33. #include <sys/types.h>
  34. #include <sys/stat.h>
  35.  
  36. void usage(progname)
  37. char *progname;
  38. {
  39.     (void) fprintf(stderr, "\nusage: %s [ -dhnv ] [ -m mountpoint ]\
  40. \n\noptions:\n\
  41.       -d   show the mount command without executing it\n\
  42.       -h   mount an ISO 9660 or High Sierra CD_ROM Filesystem\n\
  43.       -n   no setuid execution allowed\n\
  44.       -v   show the mount command and execute it\n\
  45. \n\
  46.       -m mountpoint\n\
  47.            mount the cd at another location than the default\n\
  48.            location of /cdrom\n\
  49. \n", progname);
  50. }
  51.  
  52. int main(argc, argv)
  53. int argc;
  54. char **argv;
  55. {
  56.     int getopt();
  57.     char *strrchr();
  58.  
  59.     extern char *optarg;
  60.     extern int optind;
  61.     extern int opterr;
  62.  
  63.     char *cp;
  64.     char *mntpoint;
  65.     char cmd[256];
  66.     int rc;
  67.     int debug;
  68.     int nosuid;
  69.     int iso9660;
  70.     struct stat stb;
  71.  
  72.     if ((cp = strrchr(argv[0],'/')) != NULL)
  73.         ++cp;
  74.     else 
  75.         cp = argv[0];
  76.  
  77.     /*
  78.     ** Setup IFS for system() protection...
  79.     */
  80.     if (putenv("IFS= \t\n") != 0) {
  81.          (void) fprintf(stderr,"%s: putenv failed...\n", cp);
  82.          return(1);
  83.     }
  84.  
  85.     /*
  86.     ** If the user is requesting to mount a CD..
  87.     */
  88.     if (strcmp(cp, "cdmount") == 0) {
  89.         mntpoint = "/cdrom";
  90.         nosuid = 0;
  91.         iso9660 = 0;
  92.         opterr = 0;
  93.         debug = 0;
  94.  
  95.         if (argc > 1) {
  96.            while ((rc = getopt(argc, argv, "dnhvm:")) != EOF) {
  97.               switch (rc) {
  98.                   case 'd':     /* debugging - does not run command. */
  99.                       debug = 1;
  100.                       break;
  101.                   case 'v':     /* verbose - runs command. */
  102.                       debug = 2;
  103.                       break;
  104.                   case 'n':     
  105.                       /*
  106.                       ** No setuid executables 
  107.                       */
  108.                       nosuid++;
  109.                       break;
  110.                   case 'h':
  111.                       /*
  112.                       ** mount an ISO 9660 Standard or High
  113.                       ** Sierra Standard CD-ROM filesystem.
  114.                       */
  115.                       iso9660++;
  116.                       break;
  117.                   case 'm':
  118.                       /*
  119.                       ** get the optional mount point with
  120.                       ** minimual checking for sanity..
  121.                       */
  122.                       mntpoint = optarg;
  123.                       if (stat(mntpoint, &stb) != 0) {
  124.                           (void) fprintf(stderr, "%s: mount point missing\n",
  125.                                                   mntpoint);
  126.                           return(1);
  127.                       }
  128.                       if ((stb.st_mode & S_IFMT) != S_IFDIR) {
  129.                           (void) fprintf(stderr, "%s: invalid mount point\n",
  130.                                                   mntpoint);
  131.                           return(1);
  132.                       }
  133.                       break;
  134.                   default:
  135.                       usage(cp);
  136.                       return(1);
  137.               }
  138.            }   
  139.         }   
  140.  
  141.         /* build the command line.. */
  142.         
  143.         (void) sprintf(cmd, "/etc/mount -r %s %s /dev/sr0 %s",
  144.                        iso9660 ? "-t hsfs" : "",
  145.                         nosuid ? "-o nosuid" : "",
  146.                         mntpoint);
  147.         if (debug) 
  148.             (void) fprintf(stderr, "%s\n", cmd);
  149.         if (debug != 1)
  150.             rc = system(cmd);
  151.     }
  152.  
  153.     /*
  154.     ** The user is requesting to dismount a CD...
  155.     */
  156.     else if (strcmp(cp, "cdumount") == 0) {
  157.         rc = system("/etc/umount /dev/sr0 && /usr/bin/eject /dev/sr0 2>/dev/null");
  158.     }
  159.  
  160.     /*
  161.     ** Improperly named/linked executables, I'm confused...
  162.     */
  163.     else {
  164.         (void) fprintf(stderr, "%s: I don't know who I am... ? \n", cp);
  165.         rc = 1;
  166.     }
  167.     return(rc >> 8);
  168. }
  169.