Exemple #1
0
/*
 * 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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;	
}
Exemple #4
0
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);
}
Exemple #5
0
void setRules1Word(int a, int w) {
	return set16(a * 2, w);
}
Exemple #6
0
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);
    }
}
Exemple #7
0
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;
}
Exemple #8
0
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;
}