Path: adhoc-tokyonet!kohi From: kohi@TokyoNet.AD.JP (Koh-ichi Ito) Newsgroups: fj.sources Subject: eject --- eject CD-ROM on FreeBSD --- Date: 21 Sep 1997 05:01:56 GMT Organization: Tokyo Internet Corp. Tokyo, Japan Lines: 338 Distribution: world Message-ID: NNTP-Posting-Host: marusho.prv.shinjuku.tokyonet.ad.jp X-Trace: adhoc.shinjuku.TokyoNet.AD.JP 874818117 379 (None) 192.168.133.8 X-Complaints-To: news@adhoc.shinjuku.tokyonet.ad.jp Xref: adhoc-tokyonet fj.sources:1894 いとう@東京インターネットです。 FreeBSD で CD-ROM を eject するコマンドを作ってみましたのでポストします。 ----- 8< ------------------------------------------------------------ # This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # eject # eject/README # eject/eject.c # eject/Makefile # eject/eject.1 # echo c - eject mkdir -p eject > /dev/null 2>&1 echo x - eject/README sed 's/^X//' >eject/README << 'END-of-eject/README' Xeject Ver.1.1 内部バージョン Xeject Ver.1.2 1997年 9月18日 X X 文責 伊藤 高一 X kohi@TokyoNet.AD.JP X X1) 概要 X X 本プログラムは CD-ROM 媒体を eject するコマンドです。 X X2) 使用方法 X X eject [ device ... ] X X 特に引数を与えずに起動すると、コンパイル時に識別子 DEFAULT X に与えたデバイス名(配布物では /dev/cd0a)が対象となります。 X X3) 開発目的 X X 本プログラムは amd(8) を用いて CD-ROM を自動マウントした際 X に UNIX コマンドにより CD-ROM 媒体を eject する事を目的と X して作成しました。開発対象 OS は FreeBSD 2.2.2-RELEASE で X す。 X X4) amd(8) を用いた CD-ROM 上のファイルシステムのマウントについて X X amd(8) を用いて CD-ROM 上のファイルシステムをマウントする X 手法を以下に示します。 X X まず、以下のマップを作成します。ここでは仮に /etc/amd.cd X というファイル名とします。 X X cdrom type:=program;\ X mount:="/sbin/mount mount -t cd9660 -o nosuid \ X /dev/cd0a /${autodir}/${rhost}/am/${key}";\ X unmount:="/sbin/umount umount /${autodir}/${rhost}/am/${key}" X X また、既に /cdrom というディレクトリがある場合は、これを削 X 除します。続いて以下のディレクトリを作成します。 X X /am X /a/`hostname`/am/cdrom X X 以下のシンボリックリンクを作成します。 X X ln -s /am/cdrom /cdrom X X その後、以下のようにして amd を起動します。 X X amd /am /etc/amd.cd X X FreeBSD 2.2.2-RELEASE において、OS 起動時に amd を自動的に X 起動するためには、/etc/rc.conf の amd_enable と amd_flags X の行を以下の内容に変更します。 X X amd_enable="YES" X amd_flags="-l syslog /am /etc/amd.cd" X X 4-1) この方法を用いる場合の既知の問題 X X CD-ROM 媒体が挿入されていないとき、あるいは挿入直後の媒体 X の認識が終了するまでの間に /cdrom をアクセスすると以下のエ X ラーが生じます。 X X /am/cdrom: Too many levels of remote in path X X このエラーが生じた場合には以下のコマンドを実行してください。 X X /usr/sbin/amq -u /am/cdrom X X5) 本プログラムのインストール X X コンパイルして /usr/local/bin など適当なディレクトリにコピー X して下さい。FreeBSD 2.2.2-RELEASE では、/dev/cd0a の属性は X 以下のようになっているため、本プログラムは owner root とし X て setuid(chmod u+s)してインストールして下さい。 X X brw-r----- 1 root operator 6, 0 Jun 28 04:43 /dev/cd0a X X また、4) で紹介した手法を用いずに手動で CD-ROM 上のファイ X ルシステムをマウントしている場合には、コンパイル時に X NO_AMD という識別子を定義してコンパイルすれば、本プログラ X ムは amq(8) を用いずに unmount(2) を用いて unmount します。 X X CD-ROM のデバイス名が /dev/cd0a とは異なる場合(/cdv/wcd0a X 等)は、DEFAULT という識別子にこれを定義してコンパイルして X 下さい。 X X6) 本プログラムの使用にあたって X X 本プログラムを用いた事に起因する不利益に対して、作者は一切 X の責任を負いません。 X X 本プログラムに複数の引数を与えて起動した場合について動作確 X 認していません。 X X7) 再配布について X X 本プログラムは自由に再配布していただいて構いません。その際 X に実費の範疇を著しく逸脱する対価を請求してはいけません。 X X 本プログラムに改変を加えた物を配布する場合には X X 改変箇所 X 改変内容、目的 X かかる改変の責任の所在 X X を明らかにして下さい。 X X8) 作者の開発環境 X X 作者は以下の環境で本プログラムを開発しました。 X X ホスト: PC/AT 互換機 X SCSI I/F: ASUS SC-200 X CD-ROM ドライブ:東芝 XM-4101B X OS: FreeBSD-2.2.2-RELEASE X X 本項の記述は同じ環境での動作を保証する事は意味していません。 X X9) 謝辞 X X 4) で紹介した amd を用いて CD-ROM 上のファイルシステムをマ X ウントする手法について、NetNews fj.questions.unix に不具合 X に関して投稿したところ、以下の方からアドバイスをいただきま X した。ここにお礼を申し上げます。 X X yoshiaki@kt.rim.or.jp (Yoshiaki Uchikawa) X taichu@ihas.nagoya-u.ac.jp (Taichu Tanaka) X Naofumi INODA END-of-eject/README echo x - eject/eject.c sed 's/^X//' >eject/eject.c << 'END-of-eject/eject.c' X/* X * eject.c --- Eject CD-ROM --- X * X * Copyright(c) 1997, Koh-ichi Ito X */ X X#include X#include X#include X#include X#include X#include X#include X#include X#ifndef DEFAULT X#define DEFAULT "/dev/cd0a" X#endif X#ifndef _PATH_AMQ X#define _PATH_AMQ "/usr/sbin/amq" X#endif X Xchar *MyName; Xstatic char Id[] = "$Id: eject-uu.txt,v 1.1.1.1 2005-12-27 08:36:17 kohi Exp $"; X Xmain(argc, argv) X X int argc; X char **argv; X{ X int fail = 0; X X MyName = argv[0]; X if (argc < 2) { X if (do_it(DEFAULT) ) { X exit(0); X } X exit(1); X } X while (--argc) { X if (!do_it(*++argv) ) { X fail++; X } X } X exit(fail); X} X Xint do_it(dev) X X char *dev; X{ X int fd; X char cmd[MAXPATHLEN], X rawdev[MAXPATHLEN], X mnt[MAXPATHLEN]; X X if (devtomnt(dev, mnt) ) { X#ifdef NO_AMD X if (unmount(mnt, 0) < 0) { X sprintf(cmd, "%s: %s", MyName, dev); X perror(cmd); X return 0; X } X#else X sprintf(cmd, "%s -u %s", _PATH_AMQ, mnt); X system(cmd); X sleep(1); X if (devtomnt(dev, mnt) ) { X fprintf(stderr, "%s: Can't umount %s\n", X MyName, dev); X return 0; X } X#endif X } X if (!devtorawdev(dev, rawdev) ) { X fprintf(stderr, X "%s: %s...absolute path is required.\n", X MyName, dev); X return 0; X } X if ( (fd = open(rawdev, O_RDWR) ) < 0) { X sprintf(cmd, "%s: %s", MyName, dev); X perror(cmd); X return 0; X } X if (ioctl(fd, CDIOCALLOW) < 0) { X sprintf(cmd, "%s: %s", MyName, dev); X perror(cmd); X close(fd); X return 0; X } X if (ioctl(fd, CDIOCEJECT) < 0) { X sprintf(cmd, "%s: %s", MyName, dev); X perror(cmd); X close(fd); X return 0; X } X close(fd); X return 1; X} X Xint devtomnt(dev, mnt) X X char *dev, X *mnt; X{ X struct statfs *mntbuf; X int i, n; X X n = getmntinfo(&mntbuf, MNT_NOWAIT); X for (i = 0; i < n; i++) { X if (strcmp(mntbuf[i].f_mntfromname, dev) == 0) { X strncpy(mnt, mntbuf[i].f_mntonname, MAXPATHLEN); X return 1; X } X } X return 0; X} X Xint devtorawdev(dev, rawdev) X X char *dev, X *rawdev; X{ X char *slash; X X if ( (slash = rindex(dev, '/') ) == NULL) { X return 0; X } X while (dev <= slash) { X *rawdev++ = *dev++; X } X *rawdev++ = 'r'; X while (*dev) { X *rawdev++ = *dev++; X } X return 1; X} END-of-eject/eject.c echo x - eject/Makefile sed 's/^X//' >eject/Makefile << 'END-of-eject/Makefile' XCFLAGS = -O2 #-DNO_AMD -DDEFAULT=/dev/wcd0a X Xeject : eject.c X $(CC) -o eject $(CFLAGS) eject.c END-of-eject/Makefile echo x - eject/eject.1 sed 's/^X//' >eject/eject.1 << 'END-of-eject/eject.1' X.TH EJECT 1 LOCAL X.SH NAME Xeject \- Eject CD-ROM medium X.SH SYNPOSIS X.B eject X[ X.I device... X] X.SH DESCRIPTION X.I eject Xejects CD-ROM medium from CD-ROM drive. XWith no arguments, X.I eject Xtreats /dev/cd0a as default device. X.sp XIf the file system on the CD-ROM is mounted, X.I eject Xtries to unmount the file system with amq(8) or unmount(2), Xdepend on the configuration on compile time, Xand then eject the medium only when it gots successfully unmounted. XOtherwise, the case of the file system isn't mounted, X.I eject Ximmediately ejects the medium. X.SH "SEE ALSO" Xamd(8), amq(8) X.sp X.SH COPYRIGHT XCopyright (c) 1997, Koh-ichi Ito. END-of-eject/eject.1 exit ----- 8< ------------------------------------------------------------ -- 東京インターネット株式会社 オペレーショングループ 伊藤 高一 http://www.TokyoNet.AD.JP/~kohi/