ubase

suckless linux base utils
git clone git://git.2f30.org/ubase
Log | Files | Refs | README | LICENSE

eject.c (1054B)


      1 /* See LICENSE file for copyright and license details. */
      2 #include <sys/ioctl.h>
      3 #include <sys/stat.h>
      4 #include <sys/types.h>
      5 
      6 #include <fcntl.h>
      7 #include <stdio.h>
      8 #include <unistd.h>
      9 
     10 #include "util.h"
     11 
     12 enum {
     13 	OPEN_TRAY = 0x5309,
     14 	CLOSE_TRAY = 0x5319,
     15 };
     16 
     17 static int tflag = 0;
     18 static int ret = 0;
     19 
     20 static void
     21 eject(const char *devname)
     22 {
     23 	int fd, out;
     24 
     25 	if ((fd = open(devname, O_RDONLY | O_NONBLOCK)) < 0) {
     26 		weprintf("open %s:", devname);
     27 		ret = 1;
     28 	} else if (tflag && ioctl(fd, CLOSE_TRAY, &out) < 0) {
     29 		weprintf("ioctl %s:", devname);
     30 		ret = 1;
     31 	} else if (!tflag && ioctl(fd, OPEN_TRAY, &out) < 0) {
     32 		weprintf("ioctl %s:", devname);
     33 		ret = 1;
     34 	}
     35 
     36 	if (fd >= 0 && close(fd) < 0) {
     37 		weprintf("close %s:", devname);
     38 		ret = 1;
     39 	}
     40 }
     41 
     42 
     43 static void
     44 usage(void)
     45 {
     46 	eprintf("usage: %s [-t] [device ...]\n", argv0);
     47 }
     48 
     49 int
     50 main(int argc, char *argv[])
     51 {
     52 	ARGBEGIN {
     53 	case 't':
     54 		tflag = 1;
     55 		break;
     56 	default:
     57 		usage();
     58 	} ARGEND;
     59 
     60 	if (!argc) {
     61 		eject("/dev/sr0");
     62 	} else {
     63 		for (; *argv; argc--, argv++)
     64 			eject(*argv);
     65 	}
     66 
     67 	return ret;
     68 }