summaryrefslogtreecommitdiffstats
path: root/lib/libcam
diff options
context:
space:
mode:
authorken <ken@FreeBSD.org>1998-10-12 21:54:13 +0000
committerken <ken@FreeBSD.org>1998-10-12 21:54:13 +0000
commit9cc9919f6877497f1ddce140c2cf5a96c5759591 (patch)
treea78bd059751ece9bdda46f9b977c5cbd4ab3fd59 /lib/libcam
parente3811b3baef7b2a5f5d2e006655b12a7fbe4bb77 (diff)
downloadFreeBSD-src-9cc9919f6877497f1ddce140c2cf5a96c5759591.zip
FreeBSD-src-9cc9919f6877497f1ddce140c2cf5a96c5759591.tar.gz
Add a "dummy light" (actually two dummy lights) to catch people who don't
have the passthrough device configured in their kernel. This will hopefully reduce the number of people complaining that they can't get {camcontrol, xmcd, tosha, cdrecord, etc.} to work. Reviewed by: gibbs
Diffstat (limited to 'lib/libcam')
-rw-r--r--lib/libcam/camlib.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/lib/libcam/camlib.c b/lib/libcam/camlib.c
index af62266..d4ba57e 100644
--- a/lib/libcam/camlib.c
+++ b/lib/libcam/camlib.c
@@ -22,7 +22,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id$
+ * $Id: camlib.c,v 1.1 1998/09/15 06:16:46 gibbs Exp $
*/
#include <sys/types.h>
@@ -491,11 +491,29 @@ cam_lookup_pass(const char *dev_name, int unit, int flags,
/*
* Attempt to get the passthrough device. This ioctl will fail if
- * the device name is null, or if the device doesn't exist.
+ * the device name is null, if the device doesn't exist, or if the
+ * passthrough driver isn't in the kernel.
*/
if (ioctl(fd, CAMGETPASSTHRU, &ccb) == -1) {
- sprintf(cam_errbuf, "%s: CAMGETPASSTHRU ioctl failed\n"
- "%s: %s", func_name, func_name, strerror(errno));
+ char tmpstr[256];
+
+ /*
+ * If we get ENOENT from the transport layer version of
+ * the CAMGETPASSTHRU ioctl, it means one of two things:
+ * either the device name/unit number passed in doesn't
+ * exist, or the passthrough driver isn't in the kernel.
+ */
+ if (errno == ENOENT) {
+ snprintf(tmpstr, sizeof(tmpstr),
+ "\n%s: either the pass driver isn't in "
+ "your kernel\n%s: or %s%d doesn't exist",
+ func_name, func_name, dev_name, unit);
+ }
+ snprintf(cam_errbuf, sizeof(cam_errbuf),
+ "%s: CAMGETPASSTHRU ioctl failed\n"
+ "%s: %s%s", func_name, func_name, strerror(errno),
+ (errno == ENOENT) ? tmpstr : "");
+
return(NULL);
}
@@ -589,6 +607,11 @@ cam_real_open_device(const char *path, int flags, struct cam_device *device,
* parameter: the passthrough driver unit number.
*/
if (ioctl(fd, CAMGETPASSTHRU, &ccb) == -1) {
+ /*
+ * At this point we know the passthrough device must exist
+ * because we just opened it above. The only way this
+ * ioctl can fail is if the ccb size is wrong.
+ */
sprintf(cam_errbuf, "%s: CAMGETPASSTHRU ioctl failed\n"
"%s: %s", func_name, func_name, strerror(errno));
goto crod_bailout;
OpenPOWER on IntegriCloud