diff options
Diffstat (limited to 'sys/qcam/qcam-os.c')
-rw-r--r-- | sys/qcam/qcam-os.c | 277 |
1 files changed, 0 insertions, 277 deletions
diff --git a/sys/qcam/qcam-os.c b/sys/qcam/qcam-os.c deleted file mode 100644 index 5a8f12591..000000000 --- a/sys/qcam/qcam-os.c +++ /dev/null @@ -1,277 +0,0 @@ -/* qcam-Linux.c -- Linux-specific routines for accessing QuickCam */ - -/* Version 0.1, January 2, 1996 */ -/* Version 0.5, August 24, 1996 */ - -#define LOCALSTATEDIR "" -//#define LOCALSTATEDIR "/var/run" - -/****************************************************************** - -Copyright (C) 1996 by Scott Laird - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL SCOTT LAIRD BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -******************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <stdio.h> -#include <unistd.h> -#ifdef TESTING -#include <errno.h> -#endif -#include <sys/io.h> - -#include <sys/time.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> - -#include "qcam.h" -#include "qcam-Linux.h" - -int __inline__ -read_lpstatus (const struct qcam *q) -{ - return inb (q->port + 1); -} - -int -read_lpcontrol (const struct qcam *q) -{ - return inb (q->port + 2); -} - -int -read_lpdata (const struct qcam *q) -{ - return inb (q->port); -} - -void -write_lpdata (const struct qcam *q, int d) -{ - outb (d, q->port); -} - -void -write_lpcontrol (const struct qcam *q, int d) -{ - outb (d, q->port + 2); -} - -int -enable_ports (const struct qcam *q) -{ - if (q->port < 0x278) - return 1; /* Better safe than sorry */ - if (q->port > 0x3bc) - return 1; - return (ioperm (q->port, 3, 1)); -} - -int -disable_ports (const struct qcam *q) -{ - return (ioperm (q->port, 3, 0)); -} - -/* Lock port. This is currently sub-optimal, and is begging to be - fixed. It should check for dead locks. Any takers? */ - -/* qc_lock_wait - * This function uses POSIX fcntl-style locking on a file created in the - * /tmp directory. Because it uses the Unix record locking facility, locks - * are relinquished automatically on process termination, so "dead locks" - * are not a problem. (FYI, the lock file will remain after process - * termination, but this is actually desired so that the next process need - * not re-creat(2)e it... just lock it.) - * The wait argument indicates whether or not this funciton should "block" - * waiting for the previous lock to be relinquished. This is ideal so that - * multiple processes (eg. qcam) taking "snapshots" can peacefully coexist. - * - Dave Plonka (plonka@carroll1.cc.edu) - */ -int -qc_lock_wait (struct qcam *q, int wait) -{ -#if 1 - static struct flock sfl; - - if (-1 == q->fd) { /* we've yet to open the lock file */ - static char lockfile[128]; - - sprintf (lockfile, LOCALSTATEDIR "LOCK.qcam.0x%x", q->port); - if (-1 == (q->fd = open (lockfile, O_WRONLY | O_CREAT, 0666))) { - perror ("open"); - return 1; - } -#ifdef TESTING - fprintf (stderr, "%s - %d: %s open(2)ed\n", __FILE__, __LINE__, lockfile); -#endif - - /* initialize the l_type memver to lock the file exclusively */ - sfl.l_type = F_WRLCK; - } -#ifdef TESTING - if (0 != fcntl (q->fd, F_SETLK, &sfl)) /* non-blocking set lock */ -#else - if (0 != fcntl (q->fd, wait ? F_SETLKW : F_SETLK, &sfl)) -#endif - { -#ifdef TESTING - perror ("fcntl"); - if (EAGAIN != errno || !wait) - return 1; - - fprintf (stderr, "%s - %d: waiting for exclusive lock on fd %d...\n", - __FILE__, __LINE__, q->fd); - - if (0 != fcntl (q->fd, F_SETLKW, &sfl)) /* "blocking" set lock */ -#endif - { - perror ("fcntl"); - return 1; - } - } -#ifdef TESTING - fprintf (stderr, "%s - %d: fd %d locked exclusively\n", __FILE__, __LINE__, - q->fd); -#endif - -#else - char lockfile[128], tmp[128]; - struct stat statbuf; - - sprintf (lockfile, LOCALSTATEDIR "/LOCK.qcam.0x%x", q->port); - sprintf (tmp, "%s-%d", lockfile, getpid ()); - - if ((creat (tmp, 0) == -1) || - (link (tmp, lockfile) == -1) || - (stat (tmp, &statbuf) == -1) || (statbuf.st_nlink == 1)) { -#ifdef DEBUGQC - perror ("QuickCam Locked"); - if (unlink (tmp) == -1) - perror ("Error unlinking temp file."); -#else - unlink (tmp); -#endif - return 1; - } - - unlink (tmp); - if (chown (lockfile, getuid (), getgid ()) == -1) - perror ("Chown problems"); -#endif - - return 0; -} - -int -qc_lock (struct qcam *q) -{ -#if 1 - return qc_lock_wait (q, 1 /*wait */ ); -#else - return qc_lock_wait (q, 0 /*don't wait */ ); -#endif -} - -/* Unlock port */ - -int -qc_unlock (struct qcam *q) -{ - static struct flock sfl; - -#if 1 - if (-1 == q->fd) { /* port was not locked */ - return 1; - } - - /* clear the exclusive lock */ - sfl.l_type = F_UNLCK; - if (0 != fcntl (q->fd, F_SETLK, &sfl)) { - perror ("fcntl"); - return 1; - } -#ifdef TESTING - fprintf (stderr, "%s - %d: fd %d unlocked\n", __FILE__, __LINE__, q->fd); -#endif - -#else - char lockfile[128]; - - sprintf (lockfile, LOCALSTATEDIR "/LOCK.qcam.0x%x", q->port); - unlink (lockfile); /* What would I do with an error? */ -#endif - - return 0; -} - - -/* Probe for camera. Returns 0 if found, 1 if not found, sets - q->port.*/ - -int -qc_probe (struct qcam *q) -{ - int ioports[] = { 0x378, 0x278, 0x3bc, 0 }; - int i = 0; - - /* Attempt to get permission to access IO ports. Must be root */ - - while (ioports[i] != 0) { - q->port = ioports[i++]; - - if (qc_open (q)) { - perror ("Can't get I/O permission"); - exit (1); - } - - if (qc_detect (q)) { - fprintf (stderr, "QuickCam detected at 0x%x\n", q->port); - qc_close (q); - return (0); - } else - qc_close (q); - } - - return 1; -} - - -/* THIS IS UGLY. I need a short delay loop -- somthing well under a -millisecond. Unfortunately, adding 2 usleep(1)'s to qc_command slowed -it down by a factor of over 1000 over the same loop with 2 -usleep(0)'s, and that's too slow -- qc_start was taking over a second -to run. This seems to help, but if anyone has a good -speed-independent pause routine, please tell me. -- Scott */ - -void -qc_wait (int val) -{ - int i; - - while (val--) - for (i = 0; i < 50000; i++); -} |