/* * mpt_issue_ioc_init - issue an IOCInit command to the IOC. */ int mpt_issue_ioc_init(mpt_adap_t *adap) { IOCInit_t *request = (IOCInit_t *)adap->shared->message; IOCInitReply_t *reply = (IOCInitReply_t *)adap->shared->data; time_t limit = time(NULL) + 30; int t; // printf("%s: sending IOCInit\n", adap->name); bzero(request, sizeof(*request)); request->Function = MPI_FUNCTION_IOC_INIT; request->WhoInit = MPI_WHOINIT_HOST_DRIVER; request->MaxDevices = adap->max_targets; request->MaxBuses = 1; request->MsgContext = set32(COMMAND_CONTEXT); request->ReplyFrameSize = set16(128); #if DOS request->HostMfaHighAddr = 0; request->SenseBufferHighAddr = 0; #else request->HostMfaHighAddr = set32((U32)(adap->shared_ba >> 32)); request->SenseBufferHighAddr = set32((U32)(adap->shared_ba >> 32)); #endif request->MsgVersion = set16(MPI_VERSION); request->HeaderVersion = set16(MPI_HEADER_VERSION); if (adap->hrsm_capable == TRUE) { adap->hrsm_value = 0; request->Flags |= MPI_IOCINIT_FLAGS_REPLY_FIFO_HOST_SIGNAL; request->ReplyFifoHostSignalingAddr = (U32)adap->shared_ba + (U32)offsetof(mpt_shared_t, hrsm_value); } logMptCommandReq(adap->port, request, sizeof(*request)); if (!mpt_send_message(adap, sizeof(*request), limit)) { printf("%s: mpt_send_message / IOCInit failed\n", adap->name); return 0; } t = mpt_receive_data(adap, sizeof(*reply), limit); logMptCommandRep(adap->port, request, sizeof(*request), reply, sizeof(*reply), t); if (!t) { printf("%s: mpt_receive_data / IOCInit failed\n", adap->name); return 0; } reply = reply; return 1; }
static SANE_Status st400_set_window( ST400_Device *dev ) { unsigned short xoff, yoff; SANE_Byte th; struct { /* 10byte command */ SANE_Byte cmd, lun, reserved1[4], tr_len[3], ctrl; /* 40byte window struct */ SANE_Byte reserved2[6], wd_len[2], winnr, reserved3; SANE_Byte x_res[2], y_res[2]; /* resolution: 200, 300, 400 */ SANE_Byte x_ul[2], y_ul[2]; /* upper left corner */ SANE_Byte width[2], height[2]; SANE_Byte reserved4, threshold; SANE_Byte reserved5, halftone; /* ht: 0 or 2 */ SANE_Byte bitsperpixel, reserved6[13]; /* bpp: 1 or 8 */ } scsi_cmd; /* The PC/Amiga source uses reserved5 to indicate A4/A5 paper size * (values 4 and 5), but a comment implies that this is only for the * scanning program and the value is ignored by the scanner. */ SANE_Status status; memset(&scsi_cmd, 0, sizeof(scsi_cmd)); scsi_cmd.cmd = CMD_SET_WINDOW; set24(scsi_cmd.tr_len, 40); set16(scsi_cmd.wd_len, 32); /* These offsets seem to be required to avoid damaging the scanner: * If a scan with 0/0 as the top left corner is started, the scanner * seems to try to move the carriage over the bottom end (not a * pretty sound). */ xoff = (11L * dev->val[OPT_RESOLUTION]) / 100; yoff = 6; th = (double)maxval(dev->model->bits) * SANE_UNFIX(dev->val[OPT_THRESHOLD]) / 100.0; scsi_cmd.winnr = 1; set16(scsi_cmd.x_res, (unsigned short)dev->val[OPT_RESOLUTION]); set16(scsi_cmd.y_res, (unsigned short)dev->val[OPT_RESOLUTION]); set16(scsi_cmd.x_ul, dev->x + xoff); set16(scsi_cmd.y_ul, dev->wy + yoff); set16(scsi_cmd.width, dev->w); set16(scsi_cmd.height, dev->wh); scsi_cmd.threshold = th; scsi_cmd.halftone = (dev->val[OPT_DEPTH] == 1) ? 0 : 2; scsi_cmd.bitsperpixel = dev->val[OPT_DEPTH]; DBG(DSCSI, "SCSI: sending SET_WINDOW (x=%hu y=%hu w=%hu h=%hu wy=%hu wh=%hu th=%d\n", dev->x, dev->y, dev->w, dev->h, dev->wy, dev->wh, (int)th); status = sanei_scsi_cmd(dev->fd, &scsi_cmd, sizeof(scsi_cmd), 0, 0); DBG(DSCSI, "SCSI: result=%s\n", sane_strstatus(status)); return status; }
static double* setMatPerspective(double *mat, double fov) { // http://stackoverflow.com/questions/6060169/is-this-a-correct-perspective-fov-matrix double ys = 1. / tand(fov/2.); double xs = ys*aspect; set16(mat, xs,0,0,0, 0,ys,0,0, 0,0,(far+near)/(near-far),2*far*near/(near-far), 0,0,-1,0); return mat; }
static double* setMatLook(double *mat, double x,double y,double z, double atX,double atY,double atZ, double upx,double upy,double upz) { // Calculate front vector double nx = x-atX, ny = y-atY, nz = z-atZ, l = sqrt(nx*nx + ny*ny + nz*nz); nx /= l; ny /= l; nz /= l; // Calculate side vector, then normalize double sx = upy*nz - ny*upz, sy = -upx*nz + nx*upz, sz = upx*ny - nx*upy; l = sqrt(sx*sx + sy*sy + sz*sz); sx /= l; sy /= l; sz /= l; // Calculate new up vector (doesn't need to be normalized b/c product of 2 normal vectors) upx = ny*sz - sy*nz; upy = -nx*sz + sx*nz; upz = nx*sy - sx*ny; // Calculate Translation double sd = -(sx*x + sy*y + sz*z), upd = -(upx*x + upy*y + upz*z), nd = -(nx*x + ny*y + nz*z); return set16(mat, sx, sy, sz, sd, upx,upy,upz,upd, nx, ny, nz, nd, 0, 0, 0, 1); }
void setRules1Word(int a, int w) { return set16(a * 2, w); }
void demofile_write_frame(demofile_t* d, int timediff) { int i, j, zc, writesize; Uint8 *ldata, *delta, *rle, *rle_end; Uint8 hdr[2]; vartrack_t* ct; ldata = d->cur_data; delta = d->delta_buf; for (j = 0, ct = d->vars; j < d->nvars; j++, ct++) { i = ct->cnt; switch(ct->elemsize) { ENCODELOOP(1, Uint8, NOSWAP); ENCODELOOP(2, Uint16, SDL_SwapLE16); ENCODELOOP(4, Uint32, SDL_SwapLE32); ENCODELOOP(8, Uint64, SDL_SwapLE64); } } delta = d->delta_buf; rle = d->rle_buf; rle_end = rle + d->buffer_size - 3; i = d->buffer_size; zc = 0; do { Uint8 bv = *delta++; if (bv == 0) { zc++; } else { if (zc) { *rle++ = 0; do { *rle++ = 0x80 | (zc & 0x7f); zc >>= 7; } while (zc && rle < rle_end); rle[-1] &= 0x7F; } if (rle >= rle_end) break; *rle++ = bv; } } while(--i); if (rle >= rle_end) { delta = d->delta_buf; writesize = d->buffer_size; } else { delta = d->rle_buf; writesize = rle - delta; } if (timediff >= 0xFFFF) timediff = 0xFFFF; demofile_write_hdr(d, writesize + 2, timediff); demofile_write(d, delta, writesize); if (d->format == 1) { set16(hdr, writesize + 2); demofile_write(d, hdr, 2); } if (d->rawfil) { truncate_file(d->rawfil); } }
static int demofile_write_fileheader(demofile_t* d, demo_vardef_t* vars, const char* filename) { int i, j, pos; demo_vardef_t* cvardef; vartrack_t* cvartrack; Uint8 hdr[8]; for (i = 0, cvardef = vars; cvardef->name; cvardef++) { i++; } d->nvars = i; cvartrack = d->vars = (vartrack_t*)malloc(i * sizeof(vartrack_t)); if (!cvartrack) return 0; memset(cvartrack, 0, i * sizeof(vartrack_t)); pos = 0; for (cvardef = vars; cvardef->name; cvardef++) { cvartrack->ptr = cvardef->ptr; cvartrack->elemsize = cvardef->elemsize; cvartrack->cnt = cvardef->cnt; /* Alignment */ j = cvardef->elemsize - 1; pos = (pos + j) & ~j; cvartrack->pos = pos; pos += cvardef->elemsize * cvardef->cnt; cvartrack++; } pos = (pos + 3) & ~3; d->buffer_size = pos; d->cur_data = malloc(pos * 3); if (!d->cur_data) return 0; memset(d->cur_data, 0, pos); d->delta_buf = d->cur_data + pos; d->rle_buf = d->delta_buf + pos; if (d->format == 1) { d->compressed = 0; d->rawfil = fopen(filename, "wb+"); if (!d->rawfil) return 0; } else { d->compressed = 1; d->gzfil = gzopen(filename, "wb9"); if (!d->gzfil) return 0; } strcpy(hdr, "KENDEMO"); hdr[7] = d->format; if (demofile_write(d, hdr, 8) < 8) return 0; set16(hdr+0, d->nvars); set16(hdr+2, d->buffer_size); if (demofile_write(d, hdr, 4) < 4) return 0; for (cvardef = vars; cvardef->name; cvardef++) { hdr[0] = strlen(cvardef->name); hdr[1] = cvardef->elemsize; set16(hdr+2, cvardef->cnt); if (demofile_write(d, hdr, 4) < 4) return 0; if (demofile_write(d, cvardef->name, hdr[0]) < hdr[0]) return 0; } if (d->format == 1) { set16(hdr, 0); demofile_write(d, hdr, 2); } return 1; }
static int demofile_write_hdr(demofile_t* d, int size, int clock) { Uint8 hdr[4]; set16(hdr, size); set16(hdr+2, clock); return demofile_write(d, hdr, 4); }
void test16() { set16(vector<const vector<int> >()); }
/**Process stun messagee. * * @retval -1 error * @retval 3 stun message received, ignore */ int tport_recv_stun_dgram(tport_t const *self, msg_t **in_out_msg, su_sockaddr_t *from, socklen_t fromlen) { int retval = -1; msg_t *msg; uint8_t *request; size_t n; assert(in_out_msg); assert(*in_out_msg); msg = *in_out_msg; request = msg_buf_committed_data(msg); n = msg_buf_committed(msg); if (n < 20 || request == NULL) { su_seterrno(EBADMSG); retval = -1; } else if (request[0] == 1) { /* This is a response. */ if (self->tp_pri->pri_vtable->vtp_stun_response) { if (self->tp_pri->pri_vtable->vtp_stun_response(self, request, n, from, fromlen) < 0) retval = -1; } else SU_DEBUG_7(("tport(%p): recv_stun_dgram(): " "ignoring request with "MOD_ZU" bytes\n", (void *)self, n)); } else if (request[0] == 0 && self->tp_master->mr_stun_server) { tport_stun_server_vtable_t const *vst = tport_stun_server_vtable; vst->vst_request(self->tp_master->mr_stun_server, self->tp_socket, request, n, (void *)from, fromlen); } else if (request[0] == 0) { /* Respond to stun request with a simple error message. */ int const status = 600; char const *error = "Not Implemented"; size_t unpadded = strlen(error); uint16_t elen; uint8_t dgram[128]; if (unpadded > sizeof(dgram) - 28) unpadded = sizeof(dgram) - 28; elen = (uint16_t)unpadded; elen = (elen + 3) & -4; /* Round up to 4 */ SU_DEBUG_7(("tport(%p): recv_stun_dgram(): " "responding %u %s\n", (void *)self, status, error)); /* 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | STUN Message Type | Message Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Transaction ID +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ #define set16(b, offset, value) \ (((b)[(offset) + 0] = ((value) >> 8) & 255), \ ((b)[(offset) + 1] = (value) & 255)) /* Respond to request */ dgram[0] = 1; /* Mark as response */ dgram[1] = request[1] | 0x10; /* Mark as error response */ set16(dgram, 2, elen + 4 + 4); /* TransactionID is there at bytes 4..19 */ memcpy(dgram + 4, request + 4, 16); /* TLV At 20: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ set16(dgram, 20, 0x0009); /* ERROR-CODE */ set16(dgram, 22, elen + 4); /* ERROR-CODE at 24: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 0 |Class| Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Reason Phrase (variable) .. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ dgram[24] = 0, dgram[25] = 0; dgram[26] = status / 100, dgram[27] = status % 100; memcpy(dgram + 28, error, unpadded); memset(dgram + 28 + unpadded, 0, elen - unpadded); sendto(self->tp_socket, (void *)dgram, 28 + elen, 0, (void *)from, fromlen); #undef set16 } else { SU_DEBUG_0(("tport(%p): recv_stun_dgram(): internal error\n", (void *)self)); su_seterrno(EBADMSG); retval = -1; } *in_out_msg = NULL, msg_destroy(msg); return retval; }