示例#1
0
文件: hciemu.c 项目: intgr/bluez
static void io_acl_data(void *data)
{
	struct vhci_conn *conn = data;
	unsigned char buf[HCI_MAX_FRAME_SIZE], *ptr;
	hci_acl_hdr *ah;
	uint16_t flags;
	int len;

	ptr = buf + 1;
	if (read_n(conn->fd, ptr, HCI_ACL_HDR_SIZE) <= 0) {
		close_connection(conn);
		return;
	}

	ah = (void *) ptr;
	ptr += HCI_ACL_HDR_SIZE;

	len = btohs(ah->dlen);
	if (read_n(conn->fd, ptr, len) <= 0) {
		close_connection(conn);
		return;
	}

	buf[0] = HCI_ACLDATA_PKT;

	flags = acl_flags(btohs(ah->handle));
	ah->handle = htobs(acl_handle_pack(conn->handle, flags));
	len += HCI_ACL_HDR_SIZE + 1;

	write_snoop(vdev.dd, HCI_ACLDATA_PKT, 1, buf, len);

	if (write(vdev.dev_fd, buf, len) < 0)
		syslog(LOG_ERR, "ACL data write error");
}
示例#2
0
int tcp_read(int fd, char *buf)
{
     unsigned short len, flen;
     register int rlen;     

     /* Read frame size */
     if( (rlen = read_n(fd, (char *)&len, sizeof(short)) ) <= 0)
	return rlen;

     len = ntohs(len);
     flen = len & VTUN_FSIZE_MASK;

     if( flen > VTUN_FRAME_SIZE + VTUN_FRAME_OVERHEAD ){
     	/* Oversized frame, drop it. */ 
        while( flen ){
	   len = min(flen, VTUN_FRAME_SIZE);
           if( (rlen = read_n(fd, buf, len)) <= 0 )
	      break;
           flen -= rlen;
        }                                                               
	return VTUN_BAD_FRAME;
     }	

     if( len & ~VTUN_FSIZE_MASK ){
	/* Return flags */
	return len;
     }

     /* Read frame */
     return read_n(fd, buf, flen);
}
// Read one cv::Mat from file
bool read_one(FILE * file, cv::Mat & data)
{
	bool okay = true;
	int32_t rows, cols; uint32_t type;
	okay &= read_one(file, rows);
	okay &= read_one(file, cols);
	okay &= read_one(file, type);
	if (rows <= 0 || cols <= 0 || (type & ~CV_MAT_TYPE_MASK) != 0)
		return false;
	data.create(rows, cols, type);

	// If matrix memory is continuous, we can reshape the matrix
	if (data.isContinuous()) {
		cols = rows*cols;
		rows = 1;
	}

	// Currently only supports float/double matrices!
	if (data.depth() == CV_32F)
		for (int r = 0; r < rows; ++r)
			okay &= read_n(file, data.ptr<float>(r), cols);
	else if (data.depth() == CV_64F)
		for (int r = 0; r < rows; ++r)
			okay &= read_n(file, data.ptr<double>(r), cols);
	else
		return false;

	return okay;
}
示例#4
0
ssize_t CwxSocket::read (CWX_HANDLE handle, CwxMsgHead& head, CwxMsgBlock*& msg, CwxTimeouter  *timeout) 
{
    char szHead[CwxMsgHead::MSG_HEAD_LEN];
    ssize_t  ret = read_n(handle, szHead, CwxMsgHead::MSG_HEAD_LEN, timeout, NULL);
    if (ret != CwxMsgHead::MSG_HEAD_LEN)
        return ret;
    if (!head.fromNet(szHead))
    {
        errno = EBADMSG;
        return -1;
    }
    msg = CwxMsgBlockAlloc::malloc(head.getDataLen());
    if (!msg)
    {
        errno = ENOMEM;
        return -1;
    }
    ret = read_n(handle, msg->wr_ptr(), head.getDataLen(), timeout, NULL);
    if (ret != (ssize_t)head.getDataLen())
    {
        CwxMsgBlockAlloc::free(msg);
        msg = NULL;
        return ret;
    }
    msg->wr_ptr(head.getDataLen());
    return CwxMsgHead::MSG_HEAD_LEN + head.getDataLen();
}
示例#5
0
文件: pe.c 项目: HarryR/sanos
int pe_load_res_file(TCCState *s1, int fd) {
  struct pe_rsrc_header hdr;
  Section *rsrc_section;
  int i, ret = -1;
  BYTE *ptr;

  lseek(fd, 0, SEEK_SET);
  if (!read_n(fd, &hdr, sizeof hdr)) goto quit;
  if (!pe_test_res_file(&hdr, sizeof hdr)) goto quit;

  rsrc_section = new_section(s1, ".rsrc", SHT_PROGBITS, SHF_ALLOC);
  ptr = section_ptr_add(rsrc_section, hdr.sectionhdr.SizeOfRawData);
  lseek(fd, hdr.sectionhdr.PointerToRawData, SEEK_SET);
  if (!read_n(fd, ptr, hdr.sectionhdr.SizeOfRawData)) goto quit;

  lseek(fd, hdr.sectionhdr.PointerToRelocations, SEEK_SET);
  for (i = 0; i < hdr.sectionhdr.NumberOfRelocations; ++i) {
    struct pe_rsrc_reloc rel;
    if (!read_n(fd, &rel, sizeof rel)) goto quit;
    if (rel.type != 7) goto quit; // DIR32NB
    put_elf_reloc(symtab_section, rsrc_section, rel.offset, R_386_RELATIVE, 0);
  }
  ret = 0;
quit:
  if (ret) error_noabort("unrecognized resource file format");
  return ret;
}
int read_env (int fd, char ***envp)
{
    int envc = 0;
    int i;

    if (read_n (fd, &envc, sizeof (int)) < 0) {
        fprintf (stderr, "systemsafe: read_env: %s\n", strerror (errno));
        return (-1);
    }

    if (!(*envp = malloc ((envc + 1) * sizeof (**envp)))) {
        fprintf (stderr, "systemsafe: read_env: malloc: %s\n", strerror (errno));
        return (-1);
    }

    for (i = 0; i < envc; i++) {
        char *entry;
        if (read_string (fd, &entry) < 0) {
            fprintf (stderr, "systemsafe: %s\n", strerror (errno));
            free_env (*envp);
            return (-1);
        }

        if (strncmp ("LD_PRELOAD=", entry, 10) == 0)
            entry [11] = '\0';

        (*envp)[i] = entry;
    }

    (*envp)[envc] = NULL;

    return (0);
}
  string client::recv_bulk_reply_() 
  {
    int_type length = recv_bulk_reply_(prefix_single_bulk_reply);

    if (length == -1)
      return client::missing_value;

    int_type real_length = length + 2;    // CRLF

    string data = read_n(socket_, real_length);

#ifndef NDEBUG
    output_proto_debug(data.substr(0, data.length()-2));
#endif

    if (data.empty())
    {
	cout<<"invalid bulk reply data; empty"<<endl;     
	//throw protocol_error("invalid bulk reply data; empty");
    }

    if (data.length() != static_cast<string::size_type>(real_length))
//      throw protocol_error("invalid bulk reply data; data of unexpected length");
    {
	cout<<"invalid bulk reply data; data of unexpected length"<<endl;
    }
    data.erase(data.size() - 2);

    return data;
  }
示例#8
0
bool RoboClaw::ReadM2MaxCurrent(uint8_t address,uint32_t &max){
	uint32_t tmax,dummy;
	bool valid = read_n(2,address,GETM2MAXCURRENT,&tmax,&dummy);
	if(valid)
		max = tmax;
	return valid;
}
示例#9
0
文件: pp.c 项目: Flaviowebit/openCBM
static int write_block(unsigned char tr, unsigned char se, const unsigned char *blk, int size, int read_status)
{
    int i = 0;
    unsigned char status[2];

                                                                        SETSTATEDEBUG((void)0);
    status[0] = tr; status[1] = se;
    write_n(status, 2);

                                                                        SETSTATEDEBUG((void)0);
    /* send first byte twice if length is odd */
    if(size % 2) {
        write_n(blk, 2);
        i = 1;
    }
                                                                        SETSTATEDEBUG(debugLibImgByteCount=0);
    write_n(blk+i, size-i);

                                                                        SETSTATEDEBUG(debugLibImgByteCount=-1);
#ifndef USE_CBM_IEC_WAIT    
    if(size == BLOCKSIZE) {
        arch_usleep(20000);
    }
#endif

                                                                        SETSTATEDEBUG((void)0);
    read_n(status, 2);

                                                                        SETSTATEDEBUG((void)0);
    return status[1];
}
示例#10
0
static gboolean io_acl_data(GIOChannel *chan, GIOCondition cond, gpointer data)
{
	struct vhci_conn *conn = (struct vhci_conn *) data;
	unsigned char buf[HCI_MAX_FRAME_SIZE], *ptr;
	hci_acl_hdr *ah;
	uint16_t flags;
	int fd, err, len;

	if (cond & G_IO_NVAL) {
		g_io_channel_unref(chan);
		return FALSE;
	}

	if (cond & G_IO_HUP) {
		close_connection(conn);
		return FALSE;
	}

	fd = g_io_channel_unix_get_fd(chan);

	ptr = buf + 1;
	if (read_n(fd, ptr, HCI_ACL_HDR_SIZE) <= 0) {
		close_connection(conn);
		return FALSE;
	}

	ah = (void *) ptr;
	ptr += HCI_ACL_HDR_SIZE;

	len = btohs(ah->dlen);
	if (read_n(fd, ptr, len) <= 0) {
		close_connection(conn);
		return FALSE;
	}

	buf[0] = HCI_ACLDATA_PKT;

	flags = acl_flags(btohs(ah->handle));
	ah->handle = htobs(acl_handle_pack(conn->handle, flags));
	len += HCI_ACL_HDR_SIZE + 1;

	write_snoop(vdev.dd, HCI_ACLDATA_PKT, 1, buf, len);

	err = write(vdev.fd, buf, len);

	return TRUE;
}
示例#11
0
bool RoboClaw::ReadM2PositionPID(uint8_t address,float &Kp_fp,float &Ki_fp,float &Kd_fp,uint32_t &KiMax,uint32_t &DeadZone,uint32_t &Min,uint32_t &Max){
	uint32_t Kp,Ki,Kd;
	bool valid = read_n(7,address,READM2POSPID,&Kp,&Ki,&Kd,&KiMax,&DeadZone,&Min,&Max);
	Kp_fp = ((float)Kp)/1024;
	Ki_fp = ((float)Ki)/1024;
	Kd_fp = ((float)Kd)/1024;
	return valid;
}
示例#12
0
bool RoboClaw::ReadM2VelocityPID(uint8_t address,float &Kp_fp,float &Ki_fp,float &Kd_fp,uint32_t &qpps){
	uint32_t Kp,Ki,Kd;
	bool valid = read_n(4,address,READM2PID,&Kp,&Ki,&Kd,&qpps);
	Kp_fp = ((float)Kp)/65536;
	Ki_fp = ((float)Ki)/65536;
	Kd_fp = ((float)Kd)/65536;
	return valid;
}
void store(uint32_t address, uint32_t length){
    for (uint32_t i = 0; i*4 < length; i++) {
        int8_t buffer[9];
        int8_t* ascii_instruction = read_n(buffer,8);
        volatile uint32_t* p = (volatile uint32_t*)(address+i*4);
        *p = ascii_hex_to_uint32(ascii_instruction);
    }
}
示例#14
0
void* read_from_sock(void* none){
    struct pktdata_t recvpktdata;
    unsigned int size;
    while(1){
        read_n(tcpudp_fd,(char*)&recvpktdata.len,4);
        size=ntohl(recvpktdata.len);
        if(size>MAX_PKT){
            printf("size received is %d,greater then MAX_PKT\n",size);
            pthread_cancel(pt_read_from_if);
            pthread_exit(none);
        }
        printf("read %d bytes from tcp sock\n",size);
        read_n(tcpudp_fd,recvpktdata.data,size);
        write_n(tun_fd,recvpktdata.data,size);
    }
    return none;
}
示例#15
0
void *recv_thread_entry(void *arg)
{
	int bytes;

	stream_head_t sh;
	codec_head_t ch;
	circular_queue *cq = NULL;

	while (network_on)
	{
		 LOGD("begin read");
		bytes = read_n(sockfd, &sh, sizeof (sh));
		 LOGD("read stream head");
		if (bytes != sizeof (sh))
			break;

		bytes = read_n(sockfd, &ch, sizeof (ch));
		// LOGD("read codec head");
		if (bytes != sizeof (ch))
			break;

		bytes = read_n(sockfd, recv_buffer, ch.frame_size);
		// LOGD("read data");
		if (bytes != ch.frame_size)
			break;

		if (sh.msg_type == AUDIO_TYPE)
			cq = audio_cq;
		else
			cq = video_cq;

		cq_write(cq, recv_buffer, ch.frame_size - 4);

		// if (cq == video_cq)
		// {
		// 	LOGD("video frame %lu after recieving: %lu", ch.serial_num, clock());
		// }
		// else
		// {
		// 	LOGD("audio frame %lu after recieving: %lu", ch.serial_num, clock());
		// }
	}

	return NULL;
}
示例#16
0
文件: pp.c 项目: Flaviowebit/openCBM
static int read_gcr_block(unsigned char *se, unsigned char *gcrbuf)
{
    unsigned char s[2];
                                                                        SETSTATEDEBUG((void)0);
    read_n(s, 2);
    *se = s[1];
                                                                        SETSTATEDEBUG((void)0);
    read_n(s, 2);

    if(s[1]) {
        return s[1];
    }
                                                                        SETSTATEDEBUG(debugLibImgByteCount=0);
    read_n(gcrbuf, GCRBUFSIZE);
                                                                        SETSTATEDEBUG(debugLibImgByteCount=-1);

                                                                        SETSTATEDEBUG((void)0);
    return 0;
}
示例#17
0
文件: pp.c 项目: Flaviowebit/openCBM
static int read_block(unsigned char tr, unsigned char se, unsigned char *block)
{
    unsigned char status[2];
                                                                        SETSTATEDEBUG((void)0);

    status[0] = tr; status[1] = se;
    write_n(status, 2);

#ifndef USE_CBM_IEC_WAIT    
    arch_usleep(20000);
#endif
                                                                        SETSTATEDEBUG((void)0);
    read_n(status, 2);

                                                                        SETSTATEDEBUG(debugLibImgByteCount=0);
    read_n(block, BLOCKSIZE);
                                                                        SETSTATEDEBUG(debugLibImgByteCount=-1);

                                                                        SETSTATEDEBUG((void)0);
    return status[1];
}
示例#18
0
/* Read N bytes with timeout */
int readn_t(int fd, void *buf, size_t count, time_t timeout) 
{
	fd_set fdset;
	struct timeval tv;

	tv.tv_usec=0; tv.tv_sec=timeout;

	FD_ZERO(&fdset);
	FD_SET(fd,&fdset);
	if( select(fd+1,&fdset,NULL,NULL,&tv) <= 0)
	   return -1;

	return read_n(fd, buf, count);
}
static int read_string (int fd, char **bufp)
{
    int len = 0;
    int rc;

    *bufp = NULL;
    
    /*
     *  Read string length
     */
    if ((rc = read_n (fd, &len, sizeof (int))) < 0) {
        fprintf (stderr, "systemsafe: read_string: %s\n", strerror (errno));
        return (-1);
    }
    
    if (rc == 0) 
        return (0);

    if ((*bufp = malloc (len + 1)) == NULL) {
        fprintf (stderr, "systemsafe: read_string: malloc (%d): %s\n", 
                len, strerror (errno));
        return (-1);
    }

    if ((rc = read_n (fd, *bufp, len)) < 0) {
        fprintf (stderr, "systemsafe: read_string: %s\n", strerror (errno));
        return (-1);
    }

    if (rc == 0)
        return (0);

    (*bufp) [len] = '\0';

    return (len);
}
示例#20
0
		inline void read(FILE* fp) {
			// assumes the stream is already positioned to the beginning

			{
				uint8_t* buf1 = new uint8_t[eHeaderSize];
				size_t numRead = read_n(buf1, fp, eHeaderSize);
				if (numRead != eHeaderSize)
				{
					std::ostringstream oss;
					oss << " read size was invalid, not " << eHeaderSize << std::endl;
				}
				uint8_t* p1 = buf1;

				reserved = read_field<uint16_t>(p1);

				uint8_t userId_data[eUserIdSize];
				read_array_field(p1, userId_data, eUserIdSize);
				userId = std::string((const char*)&userId_data);

				recordId = read_field<uint16_t>(p1);
				size = read_field<uint16_t>(p1);

				uint8_t description_data[eDescriptionSize];
				read_array_field(p1, description_data, eDescriptionSize);
				description = std::string(  (const char*)&description_data);

				delete[] buf1;
			}

			data = new uint8_t[size];
			{
				read_n(data, fp, size);
			}

			return;
		}
示例#21
0
static gboolean io_conn_ind(GIOChannel *chan, GIOCondition cond, gpointer data)
{
	struct vhci_link_info info;
	struct vhci_conn *conn;
	struct sockaddr_in sa;
	socklen_t len;
	int sk, nsk, h;

	if (cond & G_IO_NVAL)
		return FALSE;

	sk = g_io_channel_unix_get_fd(chan);

	len = sizeof(sa);
	if ((nsk = accept(sk, (struct sockaddr *) &sa, &len)) < 0)
		return TRUE;

	if (read_n(nsk, &info, sizeof(info)) < 0) {
		syslog(LOG_ERR, "Can't read link info");
		return TRUE;
	}

	if (!(conn = malloc(sizeof(*conn)))) {
		syslog(LOG_ERR, "Can't alloc new connection");
		close(nsk);
		return TRUE;
	}

	bacpy(&conn->dest, &info.bdaddr);

	for (h = 0; h < VHCI_MAX_CONN; h++)
		if (!vconn[h])
			goto accepted;

	syslog(LOG_ERR, "Too many connections");
	free(conn);
	close(nsk);
	return TRUE;

accepted:
	vconn[h] = conn;
	conn->handle = h + 1;
	conn->chan = g_io_channel_unix_new(nsk);
	connect_request(conn);

	return TRUE;
}
示例#22
0
void getack(){
    unsigned char integ[6];
    if(read_n(tcpudp_fd,(char*)integ,6)==-1){
        perror("read");
        exit(-1);
    }
    if(!(integ[0]==65 &&
         integ[1]==66 &&
         integ[2]==67 &&
         integ[3]==68 &&
         integ[4]==69 &&
         integ[5]==70)){
        printf("ack failed\n");
        exit(-1);
    }else{
        printf("got ack\n");
    }
}
示例#23
0
/* This function is not reentrable */
static struct link_key *__get_link_key(int f, bdaddr_t *sba, bdaddr_t *dba)
{
	static struct link_key k;
	struct link_key *key = NULL;
	int r;

	while ((r = read_n(f, &k, sizeof(k)))) {
		if (r < 0) {
			syslog(LOG_ERR, "Link key database read failed: %s (%d)",
							strerror(errno), errno);
			break;
		}

		if (!bacmp(&k.sba, sba) && !bacmp(&k.dba, dba)) {
			key = &k;
			break;
		}
	}

	return key;
}
示例#24
0
文件: hciemu.c 项目: intgr/bluez
static void io_conn_ind(void)
{
	struct vhci_link_info info;
	struct vhci_conn *conn;
	struct sockaddr_in sa;
	socklen_t len;
	int nsk, h;

	len = sizeof(sa);
	if ((nsk = accept(vdev.scan_fd, (struct sockaddr *) &sa, &len)) < 0)
		return;

	if (read_n(nsk, &info, sizeof(info)) < 0) {
		syslog(LOG_ERR, "Can't read link info");
		return;
	}

	if (!(conn = malloc(sizeof(*conn)))) {
		syslog(LOG_ERR, "Can't alloc new connection");
		close(nsk);
		return;
	}

	bacpy(&conn->dest, &info.bdaddr);

	for (h = 0; h < VHCI_MAX_CONN; h++)
		if (!vconn[h])
			goto accepted;

	syslog(LOG_ERR, "Too many connections");
	free(conn);
	close(nsk);
	return;

accepted:
	vconn[h] = conn;
	conn->handle = h + 1;
	conn->fd = nsk;
	connect_request(conn);
}
示例#25
0
int main(int argc, char ** argv) {
	(void)argc;
	long n = atol(argv[1]);
	int low,high;
	long i;
	double t;
	if (!pow2check(n)) {
		fprintf(stderr, "error : n (%ld) not a power of two\n", n);
		exit(1);
	}
	sample_t * buf = calloc(sizeof(sample_t), n);
	complex double * X = calloc(sizeof(complex double), n);
	complex double * Y = calloc(sizeof(complex double), n);
	low = atoi(argv[2]);
	high = atoi(argv[3]);

	while (1) {
		/* 標準入力からn個標本を読む */
		ssize_t m = read_n(0, n * sizeof(sample_t), buf);
		if (m == 0) break;
		/* 複素数の配列に変換 */
		sample_to_complex(buf, X, n);
		/* FFT -> Y */
		fft(X, Y, n);
		// Yのバンド外を0にする
		// t = (double) n / SAMPLING_FREQEUENCY;
		// for (i = 0; i < n; ++i){
		// 	if(i/t<low || i/t>high){
		// 		Y[i] = 0;
		// 	}
		// }
		/* IFFT -> Z */
		ifft(Y, X, n);
		/* 標本の配列に変換 */
		complex_to_sample(Y, buf, n);
		/* 標準出力へ出力 */
		write_n(1, m, buf);
	}
	return 0;
}
示例#26
0
文件: s2_pkt.c 项目: rskinner/oossl
/* SSL 2.0 imlementation for SSL_read/SSL_peek -
 * This routine will return 0 to len bytes, decrypted etc if required.
 */
static int ssl2_read_internal(SSL *s, void *buf, int len, int peek)
	{
	int n;
	unsigned char mac[MAX_MAC_SIZE];
	unsigned char *p;
	int i;
	int mac_size;

 ssl2_read_again:
	if (SSL_in_init(s) && !s->in_handshake)
		{
		n=s->handshake_func(s);
		if (n < 0) return(n);
		if (n == 0)
			{
			SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_SSL_HANDSHAKE_FAILURE);
			return(-1);
			}
		}

	clear_sys_error();
	s->rwstate=SSL_NOTHING;
	if (len <= 0) return(len);

	if (s->s2->ract_data_length != 0) /* read from buffer */
		{
		if (len > s->s2->ract_data_length)
			n=s->s2->ract_data_length;
		else
			n=len;

		memcpy(buf,s->s2->ract_data,(unsigned int)n);
		if (!peek)
			{
			s->s2->ract_data_length-=n;
			s->s2->ract_data+=n;
			if (s->s2->ract_data_length == 0)
				s->rstate=SSL_ST_READ_HEADER;
			}

		return(n);
		}

	/* s->s2->ract_data_length == 0
	 * 
	 * Fill the buffer, then goto ssl2_read_again.
	 */

	if (s->rstate == SSL_ST_READ_HEADER)
		{
		if (s->first_packet)
			{
			n=read_n(s,5,SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER+2,0);
			if (n <= 0) return(n); /* error or non-blocking */
			s->first_packet=0;
			p=s->packet;
			if (!((p[0] & 0x80) && (
				(p[2] == SSL2_MT_CLIENT_HELLO) ||
				(p[2] == SSL2_MT_SERVER_HELLO))))
				{
				SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_NON_SSLV2_INITIAL_PACKET);
				return(-1);
				}
			}
		else
			{
			n=read_n(s,2,SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER+2,0);
			if (n <= 0) return(n); /* error or non-blocking */
			}
		/* part read stuff */

		s->rstate=SSL_ST_READ_BODY;
		p=s->packet;
		/* Do header */
		/*s->s2->padding=0;*/
		s->s2->escape=0;
		s->s2->rlength=(((unsigned int)p[0])<<8)|((unsigned int)p[1]);
		if ((p[0] & TWO_BYTE_BIT))		/* Two byte header? */
			{
			s->s2->three_byte_header=0;
			s->s2->rlength&=TWO_BYTE_MASK;	
			}
		else
			{
			s->s2->three_byte_header=1;
			s->s2->rlength&=THREE_BYTE_MASK;

			/* security >s2->escape */
			s->s2->escape=((p[0] & SEC_ESC_BIT))?1:0;
			}
		}

	if (s->rstate == SSL_ST_READ_BODY)
		{
		n=s->s2->rlength+2+s->s2->three_byte_header;
		if (n > (int)s->packet_length)
			{
			n-=s->packet_length;
			i=read_n(s,(unsigned int)n,(unsigned int)n,1);
			if (i <= 0) return(i); /* ERROR */
			}

		p= &(s->packet[2]);
		s->rstate=SSL_ST_READ_HEADER;
		if (s->s2->three_byte_header)
			s->s2->padding= *(p++);
		else	s->s2->padding=0;

		/* Data portion */
		if (s->s2->clear_text)
			{
			mac_size = 0;
			s->s2->mac_data=p;
			s->s2->ract_data=p;
			if (s->s2->padding)
				{
				SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_ILLEGAL_PADDING);
				return(-1);
				}
			}
		else
			{
			mac_size=EVP_MD_CTX_size(s->read_hash);
			if (mac_size < 0)
				return -1;
			OPENSSL_assert(mac_size <= MAX_MAC_SIZE);
			s->s2->mac_data=p;
			s->s2->ract_data= &p[mac_size];
			if (s->s2->padding + mac_size > s->s2->rlength)
				{
				SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_ILLEGAL_PADDING);
				return(-1);
				}
			}

		s->s2->ract_data_length=s->s2->rlength;
		/* added a check for length > max_size in case
		 * encryption was not turned on yet due to an error */
		if ((!s->s2->clear_text) &&
			(s->s2->rlength >= (unsigned int)mac_size))
			{
			ssl2_enc(s,0);
			s->s2->ract_data_length-=mac_size;
			ssl2_mac(s,mac,0);
			s->s2->ract_data_length-=s->s2->padding;
			if (	(CRYPTO_memcmp(mac,s->s2->mac_data,mac_size) != 0) ||
				(s->s2->rlength%EVP_CIPHER_CTX_block_size(s->enc_read_ctx) != 0))
				{
				SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_BAD_MAC_DECODE);
				return(-1);
				}
			}
		INC32(s->s2->read_sequence); /* expect next number */
		/* s->s2->ract_data is now available for processing */

		/* Possibly the packet that we just read had 0 actual data bytes.
		 * (SSLeay/OpenSSL itself never sends such packets; see ssl2_write.)
		 * In this case, returning 0 would be interpreted by the caller
		 * as indicating EOF, so it's not a good idea.  Instead, we just
		 * continue reading; thus ssl2_read_internal may have to process
		 * multiple packets before it can return.
		 *
		 * [Note that using select() for blocking sockets *never* guarantees
		 * that the next SSL_read will not block -- the available
		 * data may contain incomplete packets, and except for SSL 2,
		 * renegotiation can confuse things even more.] */

		goto ssl2_read_again; /* This should really be
		                       * "return ssl2_read(s,buf,len)",
		                       * but that would allow for
		                       * denial-of-service attacks if a
		                       * C compiler is used that does not
		                       * recognize end-recursion. */
		}
	else
		{
		SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_BAD_STATE);
			return(-1);
		}
	}
示例#27
0
gint main (gint argc, gchar **argv)
{
	struct _CamelLockHelperMsg msg;
	gint len;
	gint res;
	gchar *path;
	fd_set rset;
	struct timeval tv;
	struct _lock_info *info;

	setup_process ();

	do {
		/* do a poll/etc, so we can refresh the .locks as required ... */
		FD_ZERO (&rset);
		FD_SET (STDIN_FILENO, &rset);

		/* check the minimum timeout we need to refresh the next oldest lock */
		if (lock_info_list) {
			time_t now = time (NULL);
			time_t left;
			time_t delay = CAMEL_DOT_LOCK_REFRESH;

			info = lock_info_list;
			while (info) {
				left = CAMEL_DOT_LOCK_REFRESH - (now - info->stamp);
				left = MAX (left, 0);
				delay = MIN (left, delay);
				info = info->next;
			}

			tv.tv_sec = delay;
			tv.tv_usec = 0;
		}

		d (fprintf (stderr, "lock helper waiting for input\n"));
		if (select (STDIN_FILENO + 1, &rset, NULL, NULL, lock_info_list ? &tv : NULL) == -1) {
			if (errno == EINTR)
				break;

			continue;
		}

		/* did we get a timeout?  scan for any locks that need updating */
		if (!FD_ISSET (STDIN_FILENO, &rset)) {
			time_t now = time (NULL);
			time_t left;

			d (fprintf (stderr, "Got a timeout, checking locks\n"));

			info = lock_info_list;
			while (info) {
				left = (now - info->stamp);
				if (left >= CAMEL_DOT_LOCK_REFRESH) {
					lock_touch (info->path);
					info->stamp = now;
				}
				info = info->next;
			}

			continue;
		}

		len = read_n (STDIN_FILENO, &msg, sizeof (msg));
		if (len == 0)
			break;

		res = CAMEL_LOCK_HELPER_STATUS_PROTOCOL;
		if (len == sizeof (msg) && msg.magic == CAMEL_LOCK_HELPER_MAGIC) {
			switch (msg.id) {
			case CAMEL_LOCK_HELPER_LOCK:
				res = CAMEL_LOCK_HELPER_STATUS_NOMEM;
				if (msg.data > 0xffff) {
					res = CAMEL_LOCK_HELPER_STATUS_PROTOCOL;
				} else if ((path = malloc (msg.data + 1)) != NULL) {
					res = CAMEL_LOCK_HELPER_STATUS_PROTOCOL;
					len = read_n (STDIN_FILENO, path, msg.data);
					if (len == msg.data) {
						path[len] = 0;
						res = lock_path (path, &msg.data);
					}
					free (path);
				}
				break;
			case CAMEL_LOCK_HELPER_UNLOCK:
				res = unlock_id (msg.data);
				break;
			}
		}
		d (fprintf (stderr, "returning result %d\n", res));
		msg.id = res;
		msg.magic = CAMEL_LOCK_HELPER_RETURN_MAGIC;
		write_n (STDOUT_FILENO, &msg, sizeof (msg));
	} while (1);

	d (fprintf (stderr, "parent exited, clsoing down remaining id's\n"));
	while (lock_info_list)
		unlock_id (lock_info_list->id);

	return 0;
}
示例#28
0
static void read_dump(int fd)
{
	struct hcidump_hdr dh;
	struct btsnoop_pkt dp;
	struct pktlog_hdr ph;
	struct frame frm;
	int err;

	frm.data = malloc(HCI_MAX_FRAME_SIZE);
	if (!frm.data) {
		perror("Can't allocate data buffer");
		exit(1);
	}

	while (1) {
		if (parser.flags & DUMP_PKTLOG)
			err = read_n(fd, (void *) &ph, PKTLOG_HDR_SIZE);
		else if (parser.flags & DUMP_BTSNOOP)
			err = read_n(fd, (void *) &dp, BTSNOOP_PKT_SIZE);
		else
			err = read_n(fd, (void *) &dh, HCIDUMP_HDR_SIZE);

		if (err < 0)
			goto failed;
		if (!err)
			goto done;

		if (parser.flags & DUMP_PKTLOG) {
			switch (ph.type) {
			case 0x00:
				((uint8_t *) frm.data)[0] = HCI_COMMAND_PKT;
				frm.in = 0;
				break;
			case 0x01:
				((uint8_t *) frm.data)[0] = HCI_EVENT_PKT;
				frm.in = 1;
				break;
			case 0x02:
				((uint8_t *) frm.data)[0] = HCI_ACLDATA_PKT;
				frm.in = 0;
				break;
			case 0x03:
				((uint8_t *) frm.data)[0] = HCI_ACLDATA_PKT;
				frm.in = 1;
				break;
			default:
				lseek(fd, be32toh(ph.len) - 9, SEEK_CUR);
				continue;
			}

			frm.data_len = be32toh(ph.len) - 8;
			err = read_n(fd, frm.data + 1, frm.data_len - 1);
		} else if (parser.flags & DUMP_BTSNOOP) {
			uint32_t opcode;
			uint8_t pkt_type;

			switch (btsnoop_type) {
			case 1001:
				if (be32toh(dp.flags) & 0x02) {
					if (be32toh(dp.flags) & 0x01)
						pkt_type = HCI_EVENT_PKT;
					else
						pkt_type = HCI_COMMAND_PKT;
				} else
					pkt_type = HCI_ACLDATA_PKT;

				((uint8_t *) frm.data)[0] = pkt_type;

				frm.data_len = be32toh(dp.len) + 1;
				err = read_n(fd, frm.data + 1, frm.data_len - 1);
				break;

			case 1002:
				frm.data_len = be32toh(dp.len);
				err = read_n(fd, frm.data, frm.data_len);
				break;

			case 2001:
				opcode = be32toh(dp.flags) & 0xffff;

				switch (opcode) {
				case 2:
					pkt_type = HCI_COMMAND_PKT;
					frm.in = 0;
					break;
				case 3:
					pkt_type = HCI_EVENT_PKT;
					frm.in = 1;
					break;
				case 4:
					pkt_type = HCI_ACLDATA_PKT;
					frm.in = 0;
					break;
				case 5:
					pkt_type = HCI_ACLDATA_PKT;
					frm.in = 1;
					break;
				case 6:
					pkt_type = HCI_SCODATA_PKT;
					frm.in = 0;
					break;
				case 7:
					pkt_type = HCI_SCODATA_PKT;
					frm.in = 1;
					break;
				default:
					pkt_type = 0xff;
					break;
				}

				((uint8_t *) frm.data)[0] = pkt_type;

				frm.data_len = be32toh(dp.len) + 1;
				err = read_n(fd, frm.data + 1, frm.data_len - 1);
			}
		} else {
			frm.data_len = btohs(dh.len);
			err = read_n(fd, frm.data, frm.data_len);
		}

		if (err < 0)
			goto failed;
		if (!err)
			goto done;

		frm.ptr = frm.data;
		frm.len = frm.data_len;

		if (parser.flags & DUMP_PKTLOG) {
			uint64_t ts;
			ts = be64toh(ph.ts);
			frm.ts.tv_sec = ts >> 32;
			frm.ts.tv_usec = ts & 0xffffffff;
		} else if (parser.flags & DUMP_BTSNOOP) {
示例#29
0
static int ldap_deactivate_utmp(char *devnam)
{

	int rc;
	int fd;
	off_t offset;
	struct ppp_utmp entry;
	char *device;
	char *p;

	if ((device = malloc(MAXPATHLEN)) == NULL) {
		error("Not enough memory\n");
		return -1;
	}

	memset(device, 0, MAXPATHLEN);
	memset(&entry, 0, sizeof(struct ppp_utmp));

	p = device;

	strncpy(device, devnam, MAXLINELEN-1);
	if(strncmp(device,"/dev/",5) == 0) p += 5;

#ifdef DEBUG
	info("LDAP: deactivating %s\n",devnam);
#endif

	if ((fd = open(UTMP, O_RDWR, 0600)) == -1){
		error("LDAP: can't open utmp file: %s\n",
		strerror(errno));
		return -1;
	}

	if ((rc = lockf(fd, F_LOCK, 0)) == -1){
		error("LDAP: can't lock utmp file: %s\n",
		strerror(errno));
		return -1;
	}

	while(read_n(fd, &entry, sizeof(struct ppp_utmp))) {
		if (strncmp(entry.line, p, MAXLINELEN-1) == 0) {
			entry.state = IDLE;
			lseek(fd, -sizeof(struct ppp_utmp), SEEK_CUR);
			if ((rc = write_n(fd, &entry, sizeof(struct ppp_utmp))) == -1) {
				error("LDAP: can't change utmp record status: %s\n",
						strerror(errno));
				return -1;
			}
		}
	}

	free(device);

	lseek(fd, 0, SEEK_SET);
	if ((rc = lockf(fd, F_ULOCK, 0)) == -1){
		error("LDAP: can't unlock utmp file: %s\n",
		strerror(errno));
		return -1;
	}

	close(fd);
	return 1;
}
示例#30
0
static int ldap_activate_utmp(struct ldap_data *ldap_data,
		char *devnam, char *ppp_devname, char* user)
{
	int rc;
	int fd;
	off_t offset;
	struct ppp_utmp entry;
	char *device;
	char *p;

	memset(&entry, 0, sizeof(struct ppp_utmp));

	if ((device = malloc(MAXPATHLEN)) == NULL) {
		error("Not enough memory\n");
		return -1;
	}

	memset(device, '\0', MAXPATHLEN);

	if ((fd = open(UTMP , O_RDWR | O_CREAT, 0644)) == -1)
	{
		error("LDAP: can't open utmp file\n");
		return -1;
	}

	strncpy(device, devnam, MAXLINELEN-1);

	p = device;
	if(strncmp(device,"/dev/",5) == 0) p +=  5;

	if ((rc = lockf(fd, F_LOCK, 0)) == -1)
	{
		error("LDAP: can't lock utmp file: %s\n",
		strerror(errno));
		return -1;
	}

	switch ((offset = utmp_seek(fd, devnam))) {

	case -1:

		strncpy(entry.line, p, MAXLINELEN-1);
		strncpy(entry.login, user, MAXNAMELEN-1);
		strncpy(entry.ifname, ppp_devname, MAXIFLEN-1);

		if (!ldap_data->address_set)
		entry.ip_address = ipcp_wantoptions[0].hisaddr;
		else entry.ip_address = ldap_data->addr;

		entry.time = time(NULL);
		entry.state = ACTIVE;

		lseek(fd, 0, SEEK_END);
		if ((write_n(fd, &entry, sizeof(struct ppp_utmp))) == -1){
			error("LDAP: failed to write utmp entry\n");
			return -1;
		}

		break;

	default:

		lseek(fd, offset, SEEK_SET);
		read_n(fd,&entry,sizeof(struct ppp_utmp));

		strncpy(entry.line, p, MAXLINELEN-1);
		strncpy(entry.login, user, MAXNAMELEN-1);
		strncpy(entry.ifname, ppp_devname, MAXIFLEN-1);

		if (!ldap_data->address_set)
		entry.ip_address = ipcp_wantoptions[0].hisaddr;
		else entry.ip_address = ldap_data->addr;

		entry.time = time(NULL);
		entry.state = ACTIVE;

		lseek(fd, offset, SEEK_SET);
		if ((write_n(fd, &entry, sizeof(struct ppp_utmp))) == -1){
			error("LDAP: failed to write utmp entry\n");
			return -1;
		}

		break;
	}

	free(device);

	lseek(fd, 0, SEEK_SET);
	if ((rc = lockf(fd, F_ULOCK, 0)) == -1)
	{
		error("LDAP: can't unlock utmp file: %s\n",
		strerror(errno));
		return -1;
	}

	if ((rc = close(fd)) == -1)
	{
		error("LDAP: can't close utmp file: %s\n",
		strerror(errno));
		return -1;
	}

return 1;

}