home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 February / CHIP_2_98.iso / misc / src / install / commands.c < prev    next >
C/C++ Source or Header  |  1997-09-17  |  5KB  |  284 lines

  1. #include <errno.h>
  2. #include <fcntl.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <sys/mount.h>
  7. #include <sys/stat.h>
  8. #include <sys/swap.h>
  9. #include <sys/sysmacros.h>
  10. #include <unistd.h>
  11.  
  12. #include "commands.h"
  13. #include "fs.h"
  14. #include "mkswap.h"
  15.  
  16. static int copyfd(int to, int from);
  17.  
  18. static int copyfd(int to, int from) {
  19.     char buf[1024];
  20.     int size;
  21.  
  22.     while ((size = read(from, buf, sizeof(buf))) > 0) {
  23.     if (write(to, buf, size) != size) {
  24.         fprintf(stderr, "error writing output: %s\n", strerror(errno));
  25.         return 1;
  26.     }
  27.     }
  28.  
  29.     if (size < 0) {
  30.     fprintf(stderr, "error reading input: %s\n", strerror(errno));
  31.     return 1;
  32.     }
  33.  
  34.     return 0;
  35. }
  36.  
  37. static int catFile(char * filename) {
  38.     int fd;
  39.     int rc;
  40.  
  41.     fd = open(filename, O_RDONLY);
  42.     if (fd < 0) {
  43.     fprintf(stderr, "cannot open %s: %s\n", filename, strerror(errno));
  44.     return 1;
  45.     }
  46.  
  47.     rc = copyfd(1, fd);
  48.     close(fd);
  49.  
  50.     return rc;
  51. }
  52.  
  53. int catCommand(int argc, char ** argv) {
  54.     char ** argptr = argv + 1;
  55.     int rc;
  56.  
  57.     if (!*argptr) {
  58.     return copyfd(1, 0);
  59.     } else {
  60.     while (*argptr) {
  61.         rc = catFile(*argptr);
  62.         if (rc) return rc;
  63.         argptr++;
  64.     }
  65.     }
  66.  
  67.     return 0;
  68. }
  69.  
  70. int lsmodCommand(int argc, char ** argv) {
  71.     puts("Module:        #pages:  Used by:");
  72.     catFile("/proc/modules");
  73.  
  74.     return 0;
  75. }
  76.  
  77. #define MOUNT_USAGE fprintf(stderr, "usage: mount -t <fs> <device> <dir>\n" \
  78.             "       (if /dev/ is left off the device name, a " \
  79.             "temporary node will be created)\n")
  80.  
  81. int mountCommand(int argc, char ** argv) {
  82.     char * dev, * dir;
  83.     char * fs;
  84.  
  85.     if (argc < 2) {
  86.     return catFile("/proc/mounts");
  87.     } else if (argc == 3) {
  88.     if (strchr(argv[1], ':'))
  89.         fs = "nfs";
  90.     else
  91.         fs = "ext2";
  92.     dev = argv[1];
  93.     dir = argv[2];
  94.     } else if (argc != 5) {
  95.     MOUNT_USAGE;
  96.     return 1;
  97.     } else {
  98.     if (strcmp(argv[1], "-t")) {
  99.         MOUNT_USAGE;
  100.         return 1;
  101.     }
  102.     
  103.     fs = argv[2];
  104.     dev = argv[3];
  105.     dir = argv[4];
  106.  
  107.     }
  108.  
  109.     if (!strncmp(dev, "/dev/", 5) && access(dev, X_OK)) 
  110.     dev += 5;
  111.  
  112.     if (doMount(dev, dir, fs, 0, 1))
  113.     return 1;
  114.  
  115.     return 0;
  116. }
  117.  
  118. int umountCommand(int argc, char ** argv) {
  119.     if (argc != 2) {
  120.     fprintf(stderr, "umount expects a single argument\n");
  121.     return 1;
  122.     }
  123.  
  124.     if (umount(argv[1])) {
  125.     fprintf(stderr, "error unmounting %s: %s\n", argv[1], strerror(errno));
  126.     return 1;
  127.     }
  128.  
  129.     return 0;
  130. }
  131.  
  132. int mkdirCommand(int argc, char ** argv) {
  133.     char ** argptr = argv + 1;
  134.  
  135.     if (argc < 2) {
  136.     fprintf(stderr, "umount expects one or more arguments\n");
  137.     return 1;
  138.     }
  139.  
  140.     while (*argptr) {
  141.     if (mkdir(*argptr, 0755)) {
  142.         fprintf(stderr, "error creating directory %s: %s\n", *argptr,
  143.             strerror(errno));
  144.         return 1;
  145.     }
  146.  
  147.     argptr++;
  148.     }
  149.  
  150.     return 0;
  151. }
  152.  
  153. int mknodCommand(int argc, char ** argv) {
  154.     int major, minor;
  155.     char * path;
  156.     int mode = 0600;
  157.     char *end;
  158.  
  159.     if (argc != 5 && argc != 2) {
  160.     fprintf(stderr, "usage: mknod <path> [b|c] <major> <minor> or mknod <path>\n");
  161.     return 1;
  162.     }
  163.  
  164.     path = argv[1];
  165.  
  166.     if (argc == 2) {
  167.     end = path + strlen(path) - 1;
  168.     while (end > path && *end != '/') end--;
  169.  
  170.     if (devMakeInode(end, path)) {
  171.         return 1;
  172.     }
  173.  
  174.     return 0;
  175.     }
  176.  
  177.     if (!strcmp(argv[2], "b")) 
  178.     mode |= S_IFBLK;
  179.     else if (!strcmp(argv[2], "c"))
  180.     mode |= S_IFCHR;
  181.     else {
  182.     fprintf(stderr, "unknown node type %s\n", argv[2]);
  183.     return 1;
  184.     } 
  185.  
  186.     major = strtol(argv[3], &end, 0);
  187.     if (*end) {
  188.     fprintf(stderr, "bad major number %s\n", argv[3]);
  189.     return 1;
  190.     }
  191.  
  192.     minor = strtol(argv[4], &end, 0);
  193.     if (*end) {
  194.     fprintf(stderr, "bad minor number %s\n", argv[4]);
  195.     return 1;
  196.     }
  197.  
  198.     if (mknod(path, mode, makedev(major, minor))) {
  199.     fprintf(stderr, "mknod failed: %s\n", strerror(errno));
  200.     return 1;
  201.     }
  202.  
  203.     return 0;
  204. }
  205.  
  206. int rmCommand(int argc, char ** argv) {
  207.     char ** argptr = argv + 1;
  208.  
  209.     if (argc < 2) {
  210.     fprintf(stderr, "rm expects one or more arguments "
  211.         "(no flags are supported");
  212.     return 1;
  213.     }
  214.  
  215.     while (*argptr) {
  216.     if (unlink(*argptr)) {
  217.         fprintf(stderr, "unlink of %s failed: %s\n", *argptr, 
  218.             strerror(errno));
  219.         return 1;
  220.     }
  221.  
  222.     argptr++;
  223.     }
  224.  
  225.     return 0;
  226. }
  227.  
  228. int chmodCommand(int argc, char ** argv) {
  229.     char ** argptr = argv + 2;
  230.     int mode;
  231.     char * end;
  232.  
  233.     if (argc < 3) {
  234.     fprintf(stderr, "usage: chmod <mode> <one or files>\n");
  235.     return 1;
  236.     }
  237.  
  238.     mode = strtol(argv[1], &end, 8);
  239.     if (*end) {
  240.     fprintf(stderr, "illegal mode %s\n", argv[1]);
  241.     return 1;
  242.     }
  243.  
  244.     while (*argptr) {
  245.     if (chmod(*argptr, mode)) {
  246.         fprintf(stderr, "error in chmod of %s to 0%o: %s\n", *argptr,
  247.             mode, strerror(errno));
  248.         return 1;
  249.     }
  250.  
  251.     argptr++;
  252.     }
  253.  
  254.     return 0;
  255. }
  256.  
  257. int mkswapCommand(int argc, char ** argv) {
  258.     if (argc != 2) {
  259.     fprintf(stderr, "mkswap <device>");
  260.     return 1;
  261.     }
  262.  
  263.     if (!strncmp(argv[0], "/dev/", 5) && access(argv[0], X_OK)) 
  264.     argv[1] += 5;
  265.  
  266.     enableswap(argv[1], 0, 0);
  267.  
  268.     return 0;
  269. }
  270.  
  271. int swaponCommand(int argc, char ** argv) {
  272.     if (argc != 2) {
  273.     fprintf(stderr, "swapon <file>");
  274.     return 1;
  275.     }
  276.  
  277.     if (swapon(argv[1], 0)) {
  278.     perror("swapon:");
  279.     return 1;
  280.     }
  281.  
  282.     return 0;
  283. }
  284.