Пример #1
0
// reciever uses the function
int receive_file(int sock, struct sockaddr_in *send_adr, socklen_t *send_adr_sz, char *filename, uint32_t seg_size)
{
    off_t current_filesize = get_file_size(filename);
    uint32_t curr_segment_num = (current_filesize % seg_size != 0) ? 1 + current_filesize / seg_size : current_filesize / seg_size;

    char response[MAX_BUFFER_SIZE];
    ssize_t response_len;
    buffer *b;
	create_buffer(&b, 1024);

    do {
        response_len = timer_recvfrom(sock, response, MAX_BUFFER_SIZE, 0, (struct sockaddr *)send_adr, send_adr_sz, TIMEOUT, NUM_TRY);
        akh_pdu_header *pheader = (akh_pdu_header *)response;

        // time-out
        if(response_len == -1)
            return -1;
        else if(pheader->msg_type == SS) {
            printf("SS seq_num => %d\n", pheader->seq_num);
            if(pheader->seq_num == curr_segment_num) {
                write_segment(response + sizeof(akh_pdu_header), response_len - sizeof(akh_pdu_header), filename);
                curr_segment_num++;
            }
            else {
		        push(b, response, response_len);
            }
            uint32_t temp;
            do {
                temp = curr_segment_num;
                pop(b, response, &response_len);
                pheader = (akh_pdu_header *)response;
                if(pheader->seq_num == curr_segment_num) {
                    write_segment(response + sizeof(akh_pdu_header), response_len - sizeof(akh_pdu_header), filename);
                    curr_segment_num++;
                }
                push(b, response, response_len);
            } while(pheader->seq_num == temp);

        }

        puts("< receive file segment >");
        printf("msg_type = %x\tseq_num = %d\n", pheader->msg_type, pheader->seq_num);
    } while(((akh_pdu_header *)response)->msg_type == SS);

    return ((akh_pdu_header *)response)->msg_type;
}
Пример #2
0
/**
 * Writes a number to the LED display
 * Can handle up to 3-digit decimal numbers (<=250)
**/
void display(unsigned int value) {

	unsigned char i;
	
	// Separate value to digits and print each one
	for (i = 0; i < NUMBER_OF_DIGITS; i++) {
		write_segment(i, get_digit(value, i));
	}
}
Пример #3
0
/*  Write as much as fits from buffer to the given segment on tape
 *  and handle retries.
 *  Return the number of bytes written (>= 0), or:
 *      -EIO          write failed
 *      -EINTR        interrupted by signal
 *      -ENOSPC       device full
 */
int _write_segment(unsigned int segment_id, byte * buffer, int flush)
{
    TRACE_FUN(5, "_write_segment");
    int retry = 0;
    int result;

    history.used |= 2;
    for (;;) {
        if (segment_id > ftape_last_segment.id && !flush) {
            result = -ENOSPC;	/* tape full */
            break;
        }
        result = write_segment(segment_id, buffer, flush);
        if (result < 0) {
            if (result == -EAGAIN) {
                if (++retry > 100) {
                    TRACE(1, "write failed, >100 retries in segment");
                    result = -EIO;	/* give up */
                    break;
                } else {
                    TRACEx1(2, "write error, retry %d", retry);
                }
            } else {
                TRACEi(1, "write_segment failed, error:", -result);
                break;
            }
        } else {	/* success */
            if (result == 0) {	/* empty segment */
                TRACE(4, "empty segment, nothing written");
            }
            break;
        }
        /* Allow escape from loop when signaled !
         */
        if (current->signal & _DONT_BLOCK) {
            TRACE(2, "interrupted by signal");
            TRACE_EXIT;
            result = -EINTR;	/* is this the right return value ? */
            break;
        }
    }
    TRACE_EXIT;
    return result;
}
Пример #4
0
static PyObject *
curve_write_to_file(SKCurveObject * self, PyObject * args)
{
    PyObject * pyfile = NULL;
    FILE * file = NULL;
    CurveSegment * segment;
    int i;

    if (!PyArg_ParseTuple(args, "O!", &PyFile_Type, &pyfile))
	return NULL;

    file = PyFile_AsFile(pyfile);

    segment = self->segments;
    for (i = 0; i < self->len; i++, segment++)
    {
	if (!write_segment(file, segment))
	    return NULL;
    }
    Py_INCREF(Py_None);
    return Py_None;
}
Пример #5
0
static void create_image(int nfiles, char *files[])
{
    int ph, nbytes = 0, first = 1;
    FILE *fp, *img;
    Elf32_Ehdr ehdr;
    Elf32_Phdr phdr;

    /* open the image file */
    img = fopen(IMAGE_FILE, "w");
    assert(img != NULL);

    /* for each input file */
    while (nfiles-- > 0) {

        /* open input file */
printf("%s\n", *files);
        fp = fopen(*files, "r");
        assert(fp != NULL);

        /* read ELF header */
        read_ehdr(&ehdr, fp);
        printf("0x%04x: %s\n", ehdr.e_entry, *files);

        /* for each program header */
        for (ph = 0; ph < ehdr.e_phnum; ph++) {

            /* read program header */
            read_phdr(&phdr, fp, ph, ehdr);

            /* write segment to the image */
            write_segment(ehdr, phdr, fp, img, &nbytes, &first);
        }
        fclose(fp);
        files++;
    }
    write_os_size(nbytes, img);
    fclose(img);
}