sasc re-write

看板DFBSD_kernel作者時間21年前 (2005/01/17 02:32), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/10 (看更多)
The following patch is a total re-write of the sasc(1) program. If no one has any complaints, I will commit it time soon. - Complete re-write. Much better, cleaner code. Index: sasc.c =================================================================== RCS file: /home/dcvs/src/usr.bin/sasc/sasc.c,v retrieving revision 1.4 diff -u -r1.4 sasc.c --- sasc.c 5 Jan 2005 00:34:36 -0000 1.4 +++ sasc.c 15 Jan 2005 21:20:24 -0000 @@ -1,7 +1,8 @@ -/* sasc(1) - utility for the `asc' scanner device driver - * - * +/* + * sasc(1) - utility for the `asc' scanner device driver + * * Copyright (c) 1995 Gunther Schadow. All rights reserved. + * Copyright (c) 2004 Liam J. Foy. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,137 +28,165 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * $FreeBSD: src/usr.bin/sasc/sasc.c,v 1.7.2.1 2000/06/30 09:47:52 ps Exp $ * $DragonFly: src/usr.bin/sasc/sasc.c,v 1.4 2005/01/05 00:34:36 cpressey Exp $ + * */ +#include <sys/file.h> +#include <sys/ioctl.h> +#include <sys/types.h> + #include <err.h> -#include <stdlib.h> +#include <errno.h> #include <stdio.h> +#include <stdlib.h> #include <unistd.h> -#include <sys/file.h> -#include <sys/ioctl.h> + #include <machine/asc_ioctl.h> -#ifndef DEFAULT_FILE #define DEFAULT_FILE "/dev/asc0" -#endif -#ifdef FAIL -#undef FAIL -#endif -#define FAIL -1 -static void usage(void); +static int getnum(const char *); +static int asc_get(int, u_long); +static void asc_set(int, u_long, int); +static void usage(void); static void usage(void) { fprintf(stderr, -"usage: sasc [-sq] [-f file] [-r dpi] [-w width] [-h height] \ -[-b len] [-t time]\n"); + "usage: sasc [-sq] [-f file] [-r dpi] [-w width] [-h height]\n" + "[-b len] [-t time]\n"); exit(1); } -int -main(int argc, char **argv) +/* Check given numerical arguments */ +static int +getnum(const char *str) +{ + long val; + char *ep; + + val = strtol(str, &ep, 10); + if (errno) + err(1, "strtol failed: %s", str); + + if (str == ep || *ep != '\0') + errx(1, "invalid value: %s", str); + + return((int)val); +} + +static void +asc_set(int fd, u_long asc_setting, int asc_value) { - char c; - int fd; + if (ioctl(fd, asc_setting, &asc_value) < 0) + err(1, "ioctl failed setting %d", asc_value); + + printf("Successfully set\n"); - const char *file = DEFAULT_FILE; - - int show_dpi = 0; - int show_width = 0; - int show_height = 0; - int show_blen = 0; - int show_btime = 0; - int show_all = 1; - - int set_blen = 0; - int set_dpi = 0; - int set_width = 0; - int set_height = 0; - int set_btime = 0; - int set_switch = 0; - - if (argc == 0) usage(); - - while( (c = getopt(argc, argv, "sqf:b:r:w:h:t:")) != -1) - { - switch(c) { - case 'f': file = optarg; break; - case 'r': set_dpi = atoi(optarg); break; - case 'w': set_width = atoi(optarg); break; - case 'h': set_height = atoi(optarg); break; - case 'b': set_blen = atoi(optarg); break; - case 't': set_btime = atoi(optarg); break; - case 's': set_switch = 1; break; - case 'q': show_all = 0; break; - default: usage(); - } - } - - fd = open(file, O_RDONLY); - if ( fd == FAIL ) - err(1, "%s", file); - - if (set_switch != 0) - { - if(ioctl(fd, ASC_SRESSW) == FAIL) - err(1, "ASC_SRESSW"); - } - - if (set_dpi != 0) - { - if(ioctl(fd, ASC_SRES, &set_dpi) == FAIL) - err(1, "ASC_SRES"); - } - - if (set_width != 0) - { - if(ioctl(fd, ASC_SWIDTH, &set_width) == FAIL) - err(1, "ASC_SWIDTH"); - } - - if (set_height != 0) - { - if(ioctl(fd, ASC_SHEIGHT, &set_height) == FAIL) - err(1, "ASC_SHEIGHT"); - } - - if (set_blen != 0) - { - if(ioctl(fd, ASC_SBLEN, &set_blen) == FAIL) - err(1, "ASC_SBLEN"); - } - - if (set_btime != 0) - { - if(ioctl(fd, ASC_SBTIME, &set_btime) == FAIL) - err(1, "ASC_SBTIME"); - } - - if (show_all != 0) - { - if(ioctl(fd, ASC_GRES, &show_dpi) == FAIL) - err(1, "ASC_GRES"); - if(ioctl(fd, ASC_GWIDTH, &show_width) == FAIL) - err(1, "ASC_GWIDTH"); - if(ioctl(fd, ASC_GHEIGHT, &show_height) == FAIL) - err(1, "ASC_GHEIGHT"); - if(ioctl(fd, ASC_GBLEN, &show_blen) == FAIL) - err(1, "ASC_GBLEN"); - if(ioctl(fd, ASC_GBTIME, &show_btime) == FAIL) - err(1, "ASC_GBTIME"); - - printf("%s:\n", file); - printf("resolution\t %d dpi\n", show_dpi); - printf("width\t\t %d\n", show_width); - printf("height\t\t %d\n",show_height); - printf("buffer length\t %d\n", show_blen); - printf("buffer timeout\t %d\n", show_btime); - } + return; +} - return 0; +static int +asc_get(int fd, u_long asc_setting) +{ + int asc_value; + + if (ioctl(fd, asc_setting, &asc_value) < 0) + err(1, "ioctl failed", asc_value); + + return(asc_value); +} + +int +main(int argc, char **argv) +{ + const char *file = DEFAULT_FILE; + int c, fd; + int show_dpi, show_width, show_height; + int show_blen, show_btime, show_all; + int set_blen, set_dpi, set_width; + int set_height, set_btime, set_switch; + + show_dpi = show_width = show_height = 0; + show_blen = show_btime = show_all = 0; + + set_blen = set_dpi = set_width = 0; + set_height = set_btime = set_switch = 0; + + while ((c = getopt(argc, argv, "sqf:b:r:w:h:t:")) != -1) { + switch (c) { + case 'f': + file = optarg; + break; + case 'r': + set_dpi = getnum(optarg); + break; + case 'w': + set_width = getnum(optarg); + break; + case 'h': + set_height = getnum(optarg); + break; + case 'b': + set_blen = getnum(optarg); + break; + case 't': + set_btime = getnum(optarg); + break; + case 's': + set_switch = 1; + break; + case 'q': + show_all = 1; + break; + default: + usage(); + } + } + + if (argc == 1) + show_all = 1; + + if ((fd = open(file, O_RDWR)) == -1) + err(1, "Unable to open: %s", file); + + if (set_switch) { + if (ioctl(fd, ASC_SRESSW) < 0) + err(1, "ioctl: ASC_SRESSW failed"); + } + + if (set_dpi) + asc_set(fd, ASC_SRES, set_dpi); + + if (set_width) + asc_set(fd, ASC_SWIDTH, set_width); + + if (set_height) + asc_set(fd, ASC_SHEIGHT, set_height); + + if (set_blen) + asc_set(fd, ASC_SBLEN, set_blen); + + if (set_btime) + asc_set(fd, ASC_SBTIME, set_btime); + + if (show_all) { + show_dpi = asc_get(fd, ASC_GRES); + show_width = asc_get(fd, ASC_GWIDTH); + show_height = asc_get(fd, ASC_GHEIGHT); + show_blen = asc_get(fd, ASC_GBLEN); + show_btime = asc_get(fd, ASC_GBTIME); + + printf("Device: %s\n", file); + printf("Resolution: %d dpi\n", show_dpi); + printf("Width: %d\n", show_width); + printf("Height: %d\n", show_height); + printf("Buffer length: %d\n", show_blen); + printf("Buffer timeout: %d\n", show_btime); + } + return 0; } -- - Liam J. Foy <liamfoy@sepulcrum.org>
文章代碼(AID): #11whCb00 (DFBSD_kernel)
文章代碼(AID): #11whCb00 (DFBSD_kernel)