static long fli_open(flidev_t *dev, char *name, long domain) { int retval; debug(FLIDEBUG_INFO, "Trying to open file <%s> in domain %d.", name, domain); if ((retval = devalloc(dev)) != 0) { debug(FLIDEBUG_WARN, "error devalloc() %d [%s]", retval, strerror(-retval)); return retval; } debug(FLIDEBUG_INFO, "Got device index %d", *dev); if ((retval = fli_connect(*dev, name, domain)) != 0) { debug(FLIDEBUG_WARN, "fli_connect() error %d [%s]", retval, strerror(-retval)); devfree(*dev); return retval; } if ((retval = devices[*dev]->fli_open(*dev)) != 0) { debug(FLIDEBUG_WARN, "fli_open() error %d [%s]", retval, strerror(-retval)); fli_disconnect(*dev); devfree(*dev); return retval; } return retval; }
static long fli_close(flidev_t dev) { CHKDEVICE(dev); CHKFUNCTION(DEVICE->fli_close); DEVICE->fli_close(dev); fli_disconnect(dev); devfree(dev); return 0; }
static long fli_close(flidev_t dev) { CHKDEVICE(dev); CHKFUNCTION(DEVICE->fli_close); debug(FLIDEBUG_INFO, "Closing device index: %d ", dev); DEVICE->fli_close(dev); fli_disconnect(dev); devfree(dev); return 0; }
int main(int argc, char *argv[]) { /* Automatics */ char **argp; /* Ptr to current argument */ struct reservdev **rsvd; /* Ptr to list of locks */ struct reservdev **plk; /* Running ptr to locks */ char *devtab; /* Ptr to device table name */ char *rsvtab; /* Ptr to dev-rsv-tbl name */ char *p; /* Temp char pointer */ int argcount; /* Number of args on cmd */ long lkey; /* Key for locking (long) */ int key; /* Key for locking */ int halt; /* TRUE if we need to stop */ int sev; /* Message severity */ int exitcode; /* Value of command */ int syntaxerr; /* Flag, TRUE if syntax error */ int exitcd; /* Value for exit() */ int c; /* Option character */ /* * Initializations */ /* Build a message label */ if (p = strrchr(argv[0], '/')) p++; else p = argv[0]; (void) strlcat(strcpy(lbl, "UX:"), p, sizeof(lbl)); /* Make only the text component of messages appear (remove this in SVR4.1) */ (void) putenv("MSGVERB=text"); /* * Parse the options from the command line */ opterr = 0; syntaxerr = FALSE; while ((c = getopt(argc, argv, "")) != EOF) switch(c) { default: syntaxerr = FALSE; break; } /* Argument initializations */ argp = &argv[optind]; if ((argcount = argc-optind) < 1) syntaxerr = TRUE; /* If there's (an obvious) syntax error, write a message and quit */ if (syntaxerr) { stdmsg(MM_NRECOV, lbl, MM_ERROR, M_USAGE); exit(EX_ERROR); } /* * devfree key * * Free all devices that have been reserved using the key "key". */ if (argcount == 1) { /* Extract the key from the command */ lkey = strtol(*argp, &p, 10); if (*p || (lkey <= 0) || (lkey > MAXINT)) { (void) snprintf(msg, sizeof (msg), M_INVKEY, *argp); stdmsg(MM_NRECOV, lbl, MM_ERROR, msg); exit(EX_ERROR); } key = (int) lkey; /* Get the list of devices currently reserved */ if (rsvd = reservdev()) { exitcd = EX_OK; for (plk = rsvd ; *plk ; plk++) { if ((*plk)->key == key) if (devfree(key, (*plk)->devname) != 0) exitcd = EX_NOFREE; } } else { if (((errno == ENOENT) || (errno == EACCES)) && (rsvtab = _rsvtabpath())) { (void) snprintf(msg, sizeof(msg), M_RSVTAB, rsvtab); exitcd = EX_TBLERR; sev = MM_ERROR; } else { (void) snprintf(msg, sizeof (msg), M_ERROR, errno); exitcd = EX_ERROR; sev = MM_HALT; } stdmsg(MM_NRECOV, lbl, sev, msg); } /* Done */ exit(exitcd); } /* * devfree key device [...] * * Free specific devices */ /* Open the device file (if there's one to be opened) */ if (!_opendevtab("r")) { if (devtab = _devtabpath()) { (void) snprintf(msg, sizeof(msg), M_DEVTAB, devtab); exitcd = EX_TBLERR; sev = MM_ERROR; } else { (void) snprintf(msg, sizeof (msg), M_ERROR, errno); exitcd = EX_ERROR; sev = MM_HALT; } stdmsg(MM_NRECOV, lbl, sev, msg); exit(exitcd); } /* Extract the key from the command */ lkey = strtol(*argp, &p, 10); if (*p || (lkey <= 0) || (lkey > MAXINT)) { (void) snprintf(msg, sizeof(msg), M_INVKEY, *argp); stdmsg(MM_NRECOV, lbl, MM_ERROR, msg); exit(EX_ERROR); } key = (int) lkey; argp++; /* Loop through the list of devices to free */ exitcode = EX_OK; halt = FALSE; while (!halt && *argp) { /* Try to free the device */ if (devfree(key, *argp) != 0) { if ((errno == EACCES) || (errno == ENOENT)) { /* Can't get at reservation file */ if (rsvtab = _rsvtabpath()) { exitcode = EX_TBLERR; (void) snprintf(msg, sizeof(msg), M_RSVTAB, rsvtab); sev = MM_ERROR; } else { exitcode = EX_ERROR; (void) snprintf(msg, sizeof (msg), M_ERROR, errno); sev = MM_HALT; } stdmsg(MM_NRECOV, lbl, sev, msg); halt = TRUE; } else if (errno == EPERM) { /* Wrong key */ (void) snprintf(msg, sizeof(msg), M_NOTONKEY, *argp); stdmsg(MM_NRECOV, lbl, MM_ERROR, msg); exitcode = EX_NOFREE; } else if (errno == EINVAL) { /* Device not reserved */ (void) snprintf(msg, sizeof(msg), M_NOTRSVD, *argp); stdmsg(MM_NRECOV, lbl, MM_ERROR, msg); exitcode = EX_NOFREE; } else { /* Some other strange error occurred */ (void) snprintf(msg, sizeof (msg), M_ERROR, errno); stdmsg(MM_NRECOV, lbl, MM_HALT, msg); exitcode = EX_ERROR; halt = TRUE; } } argp++; } /* Exit with the appropriate code */ return(exitcode); }
void netrule :: SetFreeZoneTransformation (const Vector & devp, int tolclass) { double lam1 = 1.0/tolclass; double lam2 = 1.-lam1; double mem1[100], mem2[100], mem3[100]; int vs = oldutofreearea.Height(); FlatVector devfree(vs, mem1); int fzs = freezone.Size(); transfreezone.SetSize (fzs); if (tolclass <= oldutofreearea_i.Size()) { oldutofreearea_i[tolclass-1] -> Mult (devp, devfree); Array<Point2d> & fzi = *freezone_i[tolclass-1]; for (int i = 0; i < fzs; i++) { transfreezone[i].X() = fzi[i].X() + devfree[2*i]; transfreezone[i].Y() = fzi[i].Y() + devfree[2*i+1]; } } else { FlatVector devfree1(vs, mem2); FlatVector devfree2(vs, mem3); oldutofreearea.Mult (devp, devfree1); oldutofreearealimit.Mult (devp, devfree2); devfree.Set2 (lam1, devfree1, lam2, devfree2); for (int i = 0; i < fzs; i++) { transfreezone[i].X() = lam1 * freezone[i].X() + lam2 * freezonelimit[i].X() + devfree[2*i]; transfreezone[i].Y() = lam1 * freezone[i].Y() + lam2 * freezonelimit[i].Y() + devfree[2*i+1]; } } if (fzs > 0) { fzmaxx = fzminx = transfreezone[0].X(); fzmaxy = fzminy = transfreezone[0].Y(); } for (int i = 1; i < fzs; i++) { if (transfreezone[i].X() > fzmaxx) fzmaxx = transfreezone[i].X(); if (transfreezone[i].X() < fzminx) fzminx = transfreezone[i].X(); if (transfreezone[i].Y() > fzmaxy) fzmaxy = transfreezone[i].Y(); if (transfreezone[i].Y() < fzminy) fzminy = transfreezone[i].Y(); } for (int i = 0; i < fzs; i++) { Point2d p1 = transfreezone[i]; Point2d p2 = transfreezone[(i+1) % fzs]; Vec2d vn (p2.Y() - p1.Y(), p1.X() - p2.X()); double len2 = vn.Length2(); if (len2 < 1e-10) { freesetinequ(i, 0) = 0; freesetinequ(i, 1) = 0; freesetinequ(i, 2) = -1; } else { vn /= sqrt (len2); // scaling necessary ? freesetinequ(i,0) = vn.X(); freesetinequ(i,1) = vn.Y(); freesetinequ(i,2) = -(p1.X() * vn.X() + p1.Y() * vn.Y()); } } }