int usbip_unbind(int argc, char *argv[]) { static const struct option opts[] = { { "busid", required_argument, NULL, 'b' }, { NULL, 0, NULL, 0 } }; int opt; int ret = -1; for (;;) { opt = getopt_long(argc, argv, "b:", opts, NULL); if (opt == -1) break; switch (opt) { case 'b': ret = unbind_device(optarg); goto out; default: goto err_out; } } err_out: usbip_unbind_usage(); out: return ret; }
bool zz_texture::reload (void) { if (res.get_dynamic()) return true; if (!res.get_updated()) return false; bool ret = false; // if (!changed()) return false; if (!unbind_device()) return false; bind_device(); return false; }
// unload() called by manager->kill bool zz_texture::unload () { return unbind_device(); }
/*-------------------------------------------------------------------*/ static int cardrdr_init_handler ( DEVBLK *dev, int argc, char *argv[] ) { int i; /* Array subscript */ int fc; /* File counter */ int sockdev = 0; if (dev->bs) { if (!unbind_device(dev)) { // (error message already issued) return -1; } } /* Initialize device dependent fields */ dev->fd = -1; dev->fh = NULL; dev->multifile = 0; dev->ebcdic = 0; dev->ascii = 0; dev->trunc = 0; dev->cardpos = 0; dev->cardrem = 0; dev->autopad = 0; if(!sscanf(dev->typname,"%hx",&(dev->devtype))) dev->devtype = 0x2501; fc = 0; if (dev->more_files) free (dev->more_files); dev->more_files = malloc(sizeof(char*) * (fc + 1)); if (!dev->more_files) { logmsg (_("HHCRD001E Out of memory\n")); return -1; } dev->more_files[fc] = NULL; /* Process the driver arguments starting with the SECOND argument. (The FIRST argument is the filename and is checked later further below.) */ for (i = 1; i < argc; i++) { /* sockdev means the device file is actually a connected socket instead of a disk file. The file name is the socket_spec (host:port) to listen for connections on. */ if (strcasecmp(argv[i], "sockdev") == 0) { sockdev = 1; continue; } /* multifile means to automatically open the next i/p file if multiple i/p files are defined. */ if (strcasecmp(argv[i], "multifile") == 0) { dev->multifile = 1; continue; } /* eof means that unit exception will be returned at end of file, instead of intervention required */ if (strcasecmp(argv[i], "eof") == 0) { dev->rdreof = 1; continue; } /* intrq means that intervention required will be returned at end of file, instead of unit exception */ if (strcasecmp(argv[i], "intrq") == 0) { dev->rdreof = 0; continue; } /* ebcdic means that the card image file consists of fixed length 80-byte EBCDIC card images with no line-end delimiters */ if (strcasecmp(argv[i], "ebcdic") == 0) { dev->ebcdic = 1; continue; } /* ascii means that the card image file consists of variable length ASCII records delimited by either line-feed or carriage-return line-feed sequences */ if (strcasecmp(argv[i], "ascii") == 0) { dev->ascii = 1; continue; } /* trunc means that records longer than 80 bytes will be silently truncated to 80 bytes when processing a variable length ASCII file. The default behaviour is to present a data check if an overlength record is encountered. The trunc option is ignored except when processing an ASCII card image file. */ if (strcasecmp(argv[i], "trunc") == 0) { dev->trunc = 1; continue; } /* autopad means that if reading fixed sized records * (ebcdic) and end of file is reached in the middle of * a record, the record is automatically padded to 80 bytes. */ if (strcasecmp(argv[i], "autopad") == 0) { dev->autopad = 1; continue; } // add additional file arguments if (strlen(argv[i]) > sizeof(dev->filename)-1) { logmsg (_("HHCRD002E File name too long (max=%ud): \"%s\"\n"), (unsigned int)sizeof(dev->filename)-1,argv[i]); return -1; } if (access(argv[i], R_OK | F_OK) != 0) { logmsg (_("HHCRD003E Unable to access file \"%s\": %s\n"), argv[i], strerror(errno)); return -1; } dev->more_files[fc++] = strdup(argv[i]); dev->more_files = realloc(dev->more_files, sizeof(char*) * (fc + 1)); if (!dev->more_files) { logmsg (_("HHCRD004E Out of memory\n")); return -1; } dev->more_files[fc] = NULL; } dev->current_file = dev->more_files; /* Check for conflicting arguments */ if (dev->ebcdic && dev->ascii) { logmsg (_("HHCRD005E Specify 'ascii' or 'ebcdic' (or neither) but" " not both\n")); return -1; } if (sockdev) { if (fc) { logmsg (_("HHCRD006E Only one filename (sock_spec) allowed for" " socket devices\n")); return -1; } // If neither ascii nor ebcdic is specified, default to ascii. // This is required for socket devices because the open logic, // if neither is specified, attempts to determine whether the data // is actually ascii or ebcdic by reading the 1st 160 bytes of // data and then rewinding to the beginning of the file afterwards. // Since you can't "rewind" a socket, we must therefore default // to one of them. if (!dev->ebcdic && !dev->ascii) { logmsg (_("HHCRD007I Defaulting to 'ascii' for socket device" " %4.4X\n"),dev->devnum); dev->ascii = 1; } } if (dev->multifile && !fc) { logmsg (_("HHCRD008W 'multifile' option ignored: only one file" " specified\n")); dev->multifile = 0; } /* The first argument is the file name */ if (argc > 0) { /* Check for valid file name */ if (strlen(argv[0]) > sizeof(dev->filename)-1) { logmsg (_("HHCRD009E File name too long (max=%ud): \"%s\"\n"), (unsigned int)sizeof(dev->filename)-1,argv[0]); return -1; } if (!sockdev) { /* Check for specification of no file mounted on reader */ if (argv[0][0] == '*') { dev->filename[0] = '\0'; } else if (access(argv[0], R_OK | F_OK) != 0) { logmsg (_("HHCRD010E Unable to access file \"%s\": %s\n"), argv[0], strerror(errno)); return -1; } } /* Save the file name in the device block */ strcpy (dev->filename, argv[0]); } else { dev->filename[0] = '\0'; } /* Set size of i/o buffer */ dev->bufsize = CARD_SIZE; /* Set number of sense bytes */ /* ISW 20030307 : Empirical knowledge : DOS/VS R34 Erep */ /* indicates 4 bytes in 3505 sense */ dev->numsense = 4; /* Initialize the device identifier bytes */ dev->devid[0] = 0xFF; dev->devid[1] = 0x28; /* Control unit type is 2821-1 */ dev->devid[2] = 0x21; dev->devid[3] = 0x01; dev->devid[4] = dev->devtype >> 8; dev->devid[5] = dev->devtype & 0xFF; dev->devid[6] = 0x01; dev->numdevid = 7; // If socket device, create a listening socket // to accept connections on. if (sockdev && !bind_device(dev,dev->filename)) { // (error message already issued) return -1; } return 0; } /* end function cardrdr_init_handler */
/*-------------------------------------------------------------------*/ static int cardrdr_init_handler ( DEVBLK *dev, int argc, char *argv[] ) { int i; /* Array subscript */ int fc; /* File counter */ char pathname[MAX_PATH]; /* file path in host format */ int sockdev = 0; int attn = 0; /* Raise attention for re-init */ if(dev->devtype) attn = 1; /* For re-initialisarion close the existing file */ if (dev->fd >= 0) (dev->hnd->close)(dev); if (dev->bs) { if (!unbind_device(dev)) { // (error message already issued) return -1; } } /* Initialize device dependent fields */ dev->fd = -1; dev->fh = NULL; dev->multifile = 0; dev->ebcdic = 0; dev->ascii = 0; dev->trunc = 0; dev->cardpos = 0; dev->cardrem = 0; dev->autopad = 0; dev->excps = 0; if(!sscanf(dev->typname,"%hx",&(dev->devtype))) dev->devtype = 0x2501; fc = 0; if (dev->more_files) free (dev->more_files); dev->more_files = malloc(sizeof(char*) * (fc + 1)); if (!dev->more_files) { char buf[40]; MSGBUF(buf, "malloc(%d)", (int)(sizeof(char) * (fc + 1)) ); WRMSG (HHC01200, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, buf, strerror(errno)); return -1; } dev->more_files[fc] = NULL; /* Process the driver arguments starting with the SECOND argument. (The FIRST argument is the filename and is checked later further below.) */ for (i = 1; i < argc; i++) { /* sockdev means the device file is actually a connected socket instead of a disk file. The file name is the socket_spec (host:port) to listen for connections on. */ if (strcasecmp(argv[i], "sockdev") == 0) { sockdev = 1; continue; } /* multifile means to automatically open the next i/p file if multiple i/p files are defined. */ if (strcasecmp(argv[i], "multifile") == 0) { dev->multifile = 1; continue; } /* eof means that unit exception will be returned at end of file, instead of intervention required */ if (strcasecmp(argv[i], "eof") == 0) { dev->rdreof = 1; continue; } /* intrq means that intervention required will be returned at end of file, instead of unit exception */ if (strcasecmp(argv[i], "intrq") == 0) { dev->rdreof = 0; continue; } /* ebcdic means that the card image file consists of fixed length 80-byte EBCDIC card images with no line-end delimiters */ if (strcasecmp(argv[i], "ebcdic") == 0) { dev->ebcdic = 1; continue; } /* ascii means that the card image file consists of variable length ASCII records delimited by either line-feed or carriage-return line-feed sequences */ if (strcasecmp(argv[i], "ascii") == 0) { dev->ascii = 1; continue; } /* trunc means that records longer than 80 bytes will be silently truncated to 80 bytes when processing a variable length ASCII file. The default behaviour is to present a data check if an overlength record is encountered. The trunc option is ignored except when processing an ASCII card image file. */ if (strcasecmp(argv[i], "trunc") == 0) { dev->trunc = 1; continue; } /* autopad means that if reading fixed sized records * (ebcdic) and end of file is reached in the middle of * a record, the record is automatically padded to 80 bytes. */ if (strcasecmp(argv[i], "autopad") == 0) { dev->autopad = 1; continue; } // add additional file arguments if (strlen(argv[i]) >= sizeof(dev->filename)) { WRMSG (HHC01201, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, argv[i], (unsigned int)sizeof(dev->filename)-1); return -1; } if (access(argv[i], R_OK | F_OK) != 0) { WRMSG (HHC01200, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, "access()", strerror(errno)); return -1; } hostpath(pathname, argv[i], sizeof(pathname)); dev->more_files[fc++] = strdup(pathname); dev->more_files = realloc(dev->more_files, sizeof(char*) * (fc + 1)); if (!dev->more_files) { WRMSG (HHC01200, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, "strdup()", strerror(errno)); return -1; } dev->more_files[fc] = NULL; } dev->current_file = dev->more_files; /* Check for conflicting arguments */ if (dev->ebcdic && dev->ascii) { WRMSG (HHC01202, "E", SSID_TO_LCSS(dev->ssid), dev->devnum); return -1; } if (sockdev) { if (fc) { WRMSG (HHC01203, "E", SSID_TO_LCSS(dev->ssid), dev->devnum); return -1; } // If neither ascii nor ebcdic is specified, default to ascii. // This is required for socket devices because the open logic, // if neither is specified, attempts to determine whether the data // is actually ascii or ebcdic by reading the 1st 160 bytes of // data and then rewinding to the beginning of the file afterwards. // Since you can't "rewind" a socket, we must therefore default // to one of them. if (!dev->ebcdic && !dev->ascii) { WRMSG (HHC01204, "I", SSID_TO_LCSS(dev->ssid), dev->devnum); dev->ascii = 1; } } if (dev->multifile && !fc) { WRMSG (HHC01205, "W", SSID_TO_LCSS(dev->ssid), dev->devnum); dev->multifile = 0; } /* The first argument is the file name */ if (argc > 0) { /* Check for valid file name */ if (strlen(argv[0]) >= sizeof(dev->filename)) { WRMSG (HHC01201, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, argv[0], (unsigned int)sizeof(dev->filename)-1); return -1; } if (!sockdev) { /* Check for specification of no file mounted on reader */ if (argv[0][0] == '*') { dev->filename[0] = '\0'; } else if (access(argv[0], R_OK | F_OK) != 0) { WRMSG (HHC01200, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, "access()", strerror(errno)); return -1; } } /* Save the file name in the device block */ hostpath(dev->filename, argv[0], sizeof(dev->filename)); } else { dev->filename[0] = '\0'; } /* Set size of i/o buffer */ dev->bufsize = CARD_SIZE; if (sockdev && dev->ascii) { /* Allocate extra room for socket i/o buffer */ dev->bufsize += (TRAY_CARDS * CARD_SIZE); dev->buflen = dev->bufsize; dev->bufoff = dev->buflen; } /* Set number of sense bytes */ /* ISW 20030307 : Empirical knowledge : DOS/VS R34 Erep */ /* indicates 4 bytes in 3505 sense */ dev->numsense = 4; /* Initialize the device identifier bytes */ dev->devid[0] = 0xFF; if (0x3505 == dev->devtype || 0x2501 == dev->devtype) { dev->devid[1] = dev->devtype >> 8; dev->devid[2] = dev->devtype; }