Esempio n. 1
0
static void shift_down(void *elems, size_t elem_count, size_t i, size_t elem_size, int (*cmp)(const void *, const void *))
{
  while(1) {
    size_t l = ((i + 1) << 1) - 1;
    size_t r = l + 1;
    size_t greatest = i;
    void *left_elem, *right_elem;
    void *parent_elem = array_elem(elems, i, elem_size);
    void *greatest_elem = parent_elem;
    if(l < elem_count) {
      left_elem = array_elem(elems, l, elem_size);
      if(cmp(left_elem, parent_elem) > 0) {
        greatest_elem = left_elem;
        greatest = l;
      }
    }
    if(r < elem_count) {
      right_elem = array_elem(elems, r, elem_size);
      if(cmp(right_elem, greatest_elem) > 0) {
        greatest_elem = right_elem;
        greatest = r;
      }
    }
    if(i == greatest) return;
    swap(parent_elem, greatest_elem, elem_size);
    i = greatest;
  }
}
Esempio n. 2
0
/**
 * set_input_format
 *      Sets input format ( PAL, NTSC, SECAM, etc ... )
 */
static int set_input_format(struct video_dev *viddev, unsigned newformat)
{
    int input_format[] = { NORM_PAL_NEW, NORM_NTSC_NEW, NORM_SECAM_NEW, NORM_DEFAULT_NEW};
    int format;

    if (newformat >= array_elem(input_format)) {
        MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO, "%s: Input format %d out of range (0-2)",
                   newformat);
        return -1;
    }

    format = input_format[newformat];

    if (ioctl(viddev->fd_bktr, BT848SFMT, &format) < 0) {
        MOTION_LOG(WRN, TYPE_VIDEO, SHOW_ERRNO, "%s: BT848SFMT, Couldn't set the input format, "
                   "try again with default");
        format = NORM_DEFAULT_NEW;
        newformat = 3;

        if (ioctl(viddev->fd_bktr, BT848SFMT, &format) < 0) {
            MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "%s: BT848SFMT, Couldn't set the input format "
                       "either default");
            return -1;
        }
    }

    MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "%s: to %d", newformat);

    return newformat;
}
Esempio n. 3
0
static int bktr_set_input_device(struct video_dev *viddev, unsigned input)
{
    int actport;
    int portdata[] = { METEOR_INPUT_DEV0, METEOR_INPUT_DEV1,
                       METEOR_INPUT_DEV2, METEOR_INPUT_DEV3,
                       METEOR_INPUT_DEV_SVIDEO  };

    if (input >= array_elem(portdata)) {
        MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO, "%s: Device Input %d out of range (0-4)",
                   input);
        return -1;
    }

    actport = portdata[ input ];
    if (ioctl(viddev->fd_device, METEORSINPUT, &actport) < 0) {
        if (input != BKTR_IN_COMPOSITE) {
            MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "%s: METEORSINPUT %d invalid -"
                       "Trying composite %d", input, BKTR_IN_COMPOSITE);
            input = BKTR_IN_COMPOSITE;
            actport = portdata[ input ];
            if (ioctl(viddev->fd_device, METEORSINPUT, &actport) < 0) {
                MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "%s: METEORSINPUT %d init", input);
                return -1;
            }
        } else {
            MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "%s: METEORSINPUT %d init",
                       input);
            return -1;
        }
    }

    MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "%s: to [%d]", input);

    return input;
}
Esempio n. 4
0
static int set_input(struct video_dev *viddev, unsigned short input)
{
    int actport;
    int portdata[] = { METEOR_INPUT_DEV0, METEOR_INPUT_DEV1,
                       METEOR_INPUT_DEV2, METEOR_INPUT_DEV3,
                       METEOR_INPUT_DEV_SVIDEO};

    if (input >= array_elem(portdata)) {
        motion_log(LOG_INFO, 0, "%s: Channel Port %d out of range (0-4)", __FUNCTION__, input);
        return -1;
    }

    actport = portdata[input];
    if (ioctl(viddev->fd_bktr, METEORSINPUT, &actport) < 0) {
        if (input != IN_DEFAULT) {
            motion_log(LOG_INFO, 1, "%s: METEORSINPUT %d invalid - Trying default %d", 
                       __FUNCTION__, input, IN_DEFAULT);
            input = IN_DEFAULT;
            actport = portdata[input];
            if (ioctl(viddev->fd_bktr, METEORSINPUT, &actport) < 0) {
                motion_log(LOG_ERR, 1, "%s: METEORSINPUT %d init", __FUNCTION__, input);
                return -1;
            }
        } else {
            motion_log(LOG_ERR, 1, "%s: METEORSINPUT %d init", __FUNCTION__, input);
            return -1;
        }
    }

    if (debug_level >= CAMERA_VIDEO)
        motion_log(-1, 0, "%s: to [%d]", __FUNCTION__, input);
    
    return input;
}
Esempio n. 5
0
static int set_input_format(struct video_dev *viddev, unsigned short newformat) 
{
    int input_format[] = { NORM_PAL_NEW, NORM_NTSC_NEW, NORM_SECAM_NEW, NORM_DEFAULT_NEW};
    int format;
 
    if (newformat >= array_elem( input_format )) {
        motion_log(LOG_WARNING, 0, "%s: Input format %d out of range (0-2)", __FUNCTION__, newformat);
        return -1;
    } 

    format = input_format[newformat]; 

    if (ioctl( viddev->fd_bktr, BT848SFMT, &format) < 0) {
        motion_log(LOG_ERR, 1, "%s: BT848SFMT, Couldn't set the input format , try again with default",
                   __FUNCTION__);
        format = NORM_DEFAULT_NEW;
        newformat = 3;
        
        if (ioctl(viddev->fd_bktr, BT848SFMT, &format) < 0) {
            motion_log(LOG_ERR, 1, "%s: BT848SFMT, Couldn't set the input format either default", 
                       __FUNCTION__);
            return -1;
        }
    }

    if (debug_level >= CAMERA_VIDEO)
        motion_log(-1, 0, "%s: to %d", __FUNCTION__, newformat);
        
    return newformat;
}
Esempio n. 6
0
void opt_destroy(void) {
	size_t i;

	for (i = 0 ; i < array_elem(global_pref) ; i++) {
		if (global_pref[i].dynamic)
			free(global_pref[i].val.s);
	}
}
Esempio n. 7
0
static int event_find(const char *name) {
    struct event_info *info;
    u_int32_t offset;

    info = bsearch(name, events_info, array_elem(events_info),
                   sizeof(struct event_info), event_compare);

    if (info == NULL)
        return (-1);

    offset = (long) info - (long) &events_info[0];
    return (offset / sizeof(struct event_info));
}
Esempio n. 8
0
int wopt_find(const char *name) {
	struct window_var *wvar;
	uint32_t offset;

	wvar = bsearch(name, window_var, array_elem(window_var),
				sizeof(struct window_var), wopt_compare);

	if (wvar == NULL)
		return (-1);

	offset = (long) wvar - (long) &window_var[0];
	return (offset / sizeof(struct window_var));
}
Esempio n. 9
0
int opt_find(const char *name) {
	struct global_pref *gvar;
	uint32_t offset;

	gvar = bsearch(name, global_pref, array_elem(global_pref),
				sizeof(struct global_pref), opt_compare);

	if (gvar == NULL)
		return (-1);

	offset = (long) gvar - (long) &global_pref[0];
	return (offset / sizeof(struct global_pref));
}
Esempio n. 10
0
static int
SPF_i_match_ip6(SPF_server_t *spf_server,
			SPF_request_t *spf_request,
			SPF_mech_t *mech,
			struct in6_addr ipv6 )
{
	char		src_ip6_buf[ INET6_ADDRSTRLEN ];
	char		dst_ip6_buf[ INET6_ADDRSTRLEN ];

	struct in6_addr		src_ipv6;
	int				cidr, cidr_save, mask;
	int				i;
	int				match;

	if ( spf_request->client_ver != AF_INET6 )
		return FALSE;

	src_ipv6 = spf_request->ipv6;

	cidr = SPF_i_mech_cidr(spf_request, mech);
	if ( cidr == 0 )
		cidr = 128;
	cidr_save = cidr;

	match = TRUE;
	for( i = 0; i < array_elem( ipv6.s6_addr ) && match; i++ )
	{
		if ( cidr > 8 )
			mask = 0xff;
		else if ( cidr > 0 )
			mask = (0xff << (8 - cidr)) & 0xff;
		else
			break;
		cidr -= 8;

		match = (src_ipv6.s6_addr[i] & mask) == (ipv6.s6_addr[i] & mask);
	}

	if (spf_server->debug) {
		INET_NTOP(AF_INET6, &src_ipv6.s6_addr,
							src_ip6_buf, sizeof(src_ip6_buf));
		INET_NTOP(AF_INET6, &ipv6.s6_addr,
							dst_ip6_buf, sizeof(dst_ip6_buf));
		SPF_debugf( "ip_match:  %s == %s  (/%d):  %d",
				src_ip6_buf, dst_ip6_buf, cidr_save, match );
	}

	return match;
}
Esempio n. 11
0
void text_renderer_destroy(text_renderer_p renderer) {
	texture_destroy(renderer->texture);
	
	for(size_t i = 0; i < renderer->lines->length; i++)
		array_destroy( array_elem(renderer->lines, text_renderer_line_t, i).cells );
	array_destroy(renderer->lines);
	
	for(hash_elem_t e = hash_start(renderer->fonts); e != NULL; e = hash_next(renderer->fonts, e))
		text_renderer_font_destroy(renderer, hash_key(e));
	hash_destroy(renderer->fonts);
	
	FT_Error error = FT_Done_FreeType(renderer->freetype);
	if (error)
		printf("FT_Done_FreeType error\n");
}
Esempio n. 12
0
void opt_write(FILE *fp) {
	size_t i;

	for (i = 0 ; i < array_elem(global_pref) ; i++) {
		switch (global_pref[i].type) {
			case OPT_BOOL:
				fprintf(fp, "set %s %s\n", global_pref[i].name,
					(global_pref[i].val.b ? "TRUE" : "FALSE"));
				break;

			case OPT_STR:
				if (global_pref[i].val.s != NULL &&
					global_pref[i].val.s[0] != '\0')
				{
					fprintf(fp, "set %s %s\n", global_pref[i].name,
						global_pref[i].val.s);
				}
				break;

			case OPT_INT:
				fprintf(fp, "set %s %d\n", global_pref[i].name,
					global_pref[i].val.i);
				break;

			case OPT_CHAR:
				if (isprint(global_pref[i].val.c)) {
					fprintf(fp, "set %s %c\n", global_pref[i].name,
						global_pref[i].val.c);
				} else {
					fprintf(fp, "set %s 0x%x\n", global_pref[i].name,
						global_pref[i].val.c);
				}
				break;

			case OPT_COLOR: {
				char buf[128];

				color_get_str(global_pref[i].val.i, buf, sizeof(buf));
				fprintf(fp, "set %s %s\n", global_pref[i].name, buf);
				break;
			}
		}
	}
}
Esempio n. 13
0
int opt_set_color(uint32_t opt, char *args) {
	attr_t attr = 0;

	if (*args != '%') {
		if (color_parse_code(args, &attr) == -1)
			return (-1);
	} else {
		char buf[32];
		chtype ch[4];

		snprintf(buf, sizeof(buf), "%s ", args);
		if (plaintext_to_cstr(ch, array_elem(ch), buf, NULL) != 1)
			return (-1);

		attr = ch[0] & A_ATTRIBUTES;
	}

	global_pref[opt].val.i = attr;

	if (global_pref[opt].updated != NULL)
		global_pref[opt].updated();

	return (0);
}
Esempio n. 14
0
/**
 * set_input
 *      Sets the input to capture images , could be tuner (METEOR_INPUT_DEV1)
 *      or any of others input :
 *      RCA/COMPOSITE1 (METEOR_INPUT_DEV0)
 *      COMPOSITE2/S-VIDEO (METEOR_INPUT_DEV2)
 *      S-VIDEO (METEOR_INPUT_DEV3)
 *      VBI ?! (METEOR_INPUT_DEV_SVIDEO)
 */
static int set_input(struct video_dev *viddev, unsigned input)
{
    int actport;
    int portdata[] = { METEOR_INPUT_DEV0, METEOR_INPUT_DEV1,
                       METEOR_INPUT_DEV2, METEOR_INPUT_DEV3,
                       METEOR_INPUT_DEV_SVIDEO  };

    if (input >= array_elem(portdata)) {
        MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO, "%s: Channel Port %d out of range (0-4)",
                   input);
        return -1;
    }

    actport = portdata[ input ];
    if (ioctl(viddev->fd_bktr, METEORSINPUT, &actport) < 0) {
        if (input != IN_DEFAULT) {
            MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "%s: METEORSINPUT %d invalid -"
                       "Trying default %d", input, IN_DEFAULT);
            input = IN_DEFAULT;
            actport = portdata[ input ];
            if (ioctl(viddev->fd_bktr, METEORSINPUT, &actport) < 0) {
                MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "%s: METEORSINPUT %d init",
                           input);
                return -1;
            }
        } else {
            MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "%s: METEORSINPUT %d init",
                       input);
            return -1;
        }
    }

    MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "%s: to [%d]", input);

    return input;
}
Esempio n. 15
0
size_t text_renderer_render(text_renderer_p renderer, int32_t font_handle, char* text, size_t x, size_t y, float* buffer_ptr, size_t buffer_size) {
	text_renderer_font_p font = hash_get_ptr(renderer->fonts, font_handle);
	if (!font)
		return 0;
	
	// The current position is the baseline of the text so start one line down
	// from the position. Otherwise we would render above it.
	size_t pos_x = x, pos_y = y + (font->face->size->metrics.height / 64);
	float* p = buffer_ptr;
	FT_UInt glyph_index = 0, prev_glyph_index = 0;
	
	glBindTexture(GL_TEXTURE_RECTANGLE, renderer->texture);
	
	// Lookup the size of our texture (needed by find_free_cell_or_revoke_unused_cell() for some checks)
	GLint texture_width = 0, texture_height = 0;
	glGetTexLevelParameteriv(GL_TEXTURE_RECTANGLE, 0, GL_TEXTURE_WIDTH, &texture_width);
	glGetTexLevelParameteriv(GL_TEXTURE_RECTANGLE, 0, GL_TEXTURE_HEIGHT, &texture_height);
	
	GLint unpack_alignment = 0;
	glGetIntegerv(GL_UNPACK_ALIGNMENT, &unpack_alignment);
	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
	
	for(utf8_iterator_t it = utf8_first(text); it.code_point != 0; it = utf8_next(it)) {
		// Handle line break.
		if (it.code_point == '\n') {
			pos_y += font->face->size->metrics.height / 64;
			pos_x = x;
			
			// Don't do kerning at the next character after the line break.
			prev_glyph_index = 0;
			
			continue;
		}
		
		// Look if this glyph is present in the texture. If so this font has a cell reference
		// for this code point.
		text_renderer_cell_ref_p cell_ref = hash_get_ptr(font->cell_refs, it.code_point);
		
		// Glyph not rendered yet, try to render it
		if (!cell_ref) {
			glyph_index = FT_Get_Char_Index(font->face, it.code_point);
			if (glyph_index == 0)
				goto render_error_glyph;
			
			FT_Error error = FT_Load_Glyph(font->face, glyph_index, FT_LOAD_RENDER);
			if (error)
				goto render_error_glyph;
			
			// Look for a free cell to store the rendered glyph
			uint32_t gw = font->face->glyph->bitmap.width, gh = font->face->glyph->bitmap.rows;
			size_t line_idx = 0, cell_idx = 0;
			text_renderer_cell_p free_cell = find_free_cell_or_revoke_unused_cell(renderer, font, gw, gh, texture_width, texture_height, &line_idx, &cell_idx);
			
			if (free_cell == NULL)
				goto render_error_glyph;
			
			free_cell->glyph_index    = glyph_index;
			free_cell->hori_bearing_x = font->face->glyph->metrics.horiBearingX / 64;
			free_cell->hori_bearing_y = font->face->glyph->metrics.horiBearingY / 64;
			free_cell->hori_advance   = font->face->glyph->metrics.horiAdvance  / 64;
			
			/*
			printf("%c: %2ux%2u %2u bytes, pitch %u, x: %u, y: %u hori_bearing: %2u/%2u, adv: %2u\n",
				it.code_point, gw, gh, gw*gh, font->face->glyph->bitmap.pitch,
				free_cell->x, free_cell->y, free_cell->hori_bearing_x, free_cell->hori_bearing_y, free_cell->hori_advance);
			*/

			glPixelStorei(GL_UNPACK_ROW_LENGTH, font->face->glyph->bitmap.pitch);
			glTexSubImage2D(GL_TEXTURE_RECTANGLE, 0, free_cell->x, free_cell->y, gw, gh, GL_RED, GL_UNSIGNED_BYTE, font->face->glyph->bitmap.buffer);
			
			cell_ref = hash_put_ptr(font->cell_refs, it.code_point);
			cell_ref->line_idx = line_idx;
			cell_ref->cell_idx = cell_idx;
		}
		
		// Glyph rendered successfully, do kerning and generate vertices for it
		text_renderer_line_t line = array_elem(renderer->lines, text_renderer_line_t, cell_ref->line_idx);
		text_renderer_cell_t cell = array_elem(line.cells, text_renderer_cell_t, cell_ref->cell_idx);
		
		if (cell.glyph_index && prev_glyph_index) {
			FT_Vector delta;
			FT_Get_Kerning(font->face, prev_glyph_index, glyph_index, FT_KERNING_DEFAULT, &delta);
			pos_x += delta.x / 64;
		}
		
		// We have the texture coordinates of the glyph, generate the vertex buffer
		if ( (p + 6*4 - buffer_ptr) * sizeof(float) < buffer_size ) {
			float w = cell.width, h = line.height;
			
			float cx = pos_x + cell.hori_bearing_x;
			float cy = pos_y - cell.hori_bearing_y;
			
			float tl_x = cx + 0, tl_y = cy + 0,  tl_u = cell.x,     tl_v = cell.y;
			float tr_x = cx + w, tr_y = cy + 0,  tr_u = cell.x + w, tr_v = cell.y;
			float bl_x = cx + 0, bl_y = cy + h,  bl_u = cell.x,     bl_v = cell.y + h;
			float br_x = cx + w, br_y = cy + h,  br_u = cell.x + w, br_v = cell.y + h;
			
			*(p++) = tl_x; *(p++) = tl_y; *(p++) = tl_u; *(p++) = tl_v;
			*(p++) = tr_x; *(p++) = tr_y; *(p++) = tr_u; *(p++) = tr_v;
			*(p++) = bl_x; *(p++) = bl_y; *(p++) = bl_u; *(p++) = bl_v;
			*(p++) = tr_x; *(p++) = tr_y; *(p++) = tr_u; *(p++) = tr_v;
			*(p++) = br_x; *(p++) = br_y; *(p++) = br_u; *(p++) = br_v;
			*(p++) = bl_x; *(p++) = bl_y; *(p++) = bl_u; *(p++) = bl_v;
			
			pos_x += cell.hori_advance;
		}
		
		prev_glyph_index = glyph_index;
		continue;
		
		render_error_glyph:
			// For now just output nothing when we fail to render a glyph.
			// TODO: Figure out how to render a kind of error glyph.
			prev_glyph_index = glyph_index;
			continue;
	}
	
	glPixelStorei(GL_UNPACK_ALIGNMENT, unpack_alignment);
	glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
	glBindTexture(GL_TEXTURE_RECTANGLE, 0);
	
	return (p - buffer_ptr) * sizeof(float);
}
Esempio n. 16
0
/**
 * This could better collect errors, like the compiler does.
 * This requires that *bufp be either malloced to *buflenp, or NULL
 * This may realloc *bufp.
 */
SPF_errcode_t
SPF_record_expand_data(SPF_server_t *spf_server,
				SPF_request_t *spf_request,
				SPF_response_t *spf_response,
				SPF_data_t *data, size_t data_len,
				char **bufp, size_t *buflenp)
{
	SPF_data_t	*d, *data_end;

	size_t		 len;
	const char	*p_err;	// XXX Check this value, when returned.
	char		*p, *p_end;
	const char	*p_read;
	const char	*p_read_end;
	char		*p_write;
	char		*p2, *p2_end;


	const char	*var;
	char		*munged_var = NULL;
	char		*url_var = NULL;

			/* Pretty-printing buffers. */
	char		ip4_buf[ INET_ADDRSTRLEN ];
	char		ip6_buf[ INET6_ADDRSTRLEN ];
			/* Hex buffer for ipv6 (size in nibbles) */
	char		ip6_rbuf[ sizeof( struct in6_addr ) * 4 + 1 ];

	char		time_buf[ sizeof( "4294967296" ) ]; /* 2^32 seconds max		*/

	int			num_found;
	int			i;
	size_t		buflen;
	int			compute_length;
	SPF_errcode_t	 err;


	/*
	 * make sure we were passed valid data to work with
	 */
	SPF_ASSERT_NOTNULL(spf_server);
	SPF_ASSERT_NOTNULL(data);
	SPF_ASSERT_NOTNULL(bufp);
	SPF_ASSERT_NOTNULL(buflenp);

	buflen = 1;	/* For the terminating '\0' */
	compute_length = 1;
	p = NULL;
	p_end = NULL;

	/* data_end = SPF_mech_end_data( mech ); */ /* doesn't work for mods */
	data_end = (SPF_data_t *)((char *)data + data_len);

top:
#ifdef DEBUG
	fprintf(stderr, "Pass start compute_length=%d\n", compute_length);
#endif
	/*
	 * expand the data
	 */
	for (d = data; d < data_end; d = SPF_data_next(d)) {
#ifdef DEBUG
		fprintf(stderr, " Item type=%d at %p\n", d->dc.parm_type, d);
#endif
		if (d->dc.parm_type == PARM_CIDR)
			continue;

		if (d->ds.parm_type == PARM_STRING) {
			if (compute_length) {
				buflen += d->ds.len;
				continue;
			}
			/* This should NEVER happen now. */
			if (p_end - (p + d->ds.len) <= 0)
					SPF_error("Failed to allocate enough memory "
								"to expand string.");
			memcpy(p, SPF_data_str(d), d->ds.len);
			p += d->ds.len;
			continue;
		}

		/* Otherwise, it's a variable. */

		var = NULL;
		switch (d->dv.parm_type) {
		case PARM_LP_FROM:		/* local-part of envelope-sender */
			var = spf_request->env_from_lp;
			break;

		case PARM_ENV_FROM:		/* envelope-sender				*/
			var = spf_request->env_from;
			break;

		case PARM_DP_FROM:		/* envelope-domain				*/
			var = spf_request->env_from_dp;
			break;

		case PARM_CUR_DOM:		/* current-domain				*/
			var = spf_request->cur_dom;
			break;

		case PARM_CLIENT_IP:		/* SMTP client IP				*/
			if (compute_length) {
				len = sizeof(ip6_buf);
				if (d->dv.url_encode)
					len *= 3;
				buflen += len;
				continue;
			}
			if (spf_request->client_ver == AF_INET) {
				p_err = inet_ntop(AF_INET, &spf_request->ipv4,
								   ip4_buf, sizeof(ip4_buf));
				var = ip4_buf;
			}
			else if (spf_request->client_ver == AF_INET6) {
				p2 = ip6_rbuf;
				p2_end = p2 + sizeof(ip6_rbuf);

				for (i = 0; i < array_elem(spf_request->ipv6.s6_addr); i++) {
					p2 += snprintf(p2, p2_end - p2, "%.1x.%.1x.",
									spf_request->ipv6.s6_addr[i] >> 4,
									spf_request->ipv6.s6_addr[i] & 0xf);
				}

				/* squash the final '.' */
				ip6_rbuf[sizeof(struct in6_addr) * 4 - 1] = '\0';

				var = ip6_rbuf;
			}
			break;

		case PARM_CLIENT_IP_P:		/* SMTP client IP (pretty)		*/
			if (compute_length) {
				len = sizeof(ip6_buf);
				if (d->dv.url_encode)
					len *= 3;
				buflen += len;
				continue;
			}
			if (spf_request->client_ver == AF_INET) {
				p_err = inet_ntop(AF_INET, &spf_request->ipv4,
								   ip4_buf, sizeof(ip4_buf));
				var = ip4_buf;
			}
			else if (spf_request->client_ver == AF_INET6) {
				p_err = inet_ntop(AF_INET6, &spf_request->ipv6,
								   ip6_buf, sizeof(ip6_buf));
				var = ip6_buf;
			}
			break;

		case PARM_TIME:				/* time in UTC epoch secs		*/
			if (compute_length) {
				len = sizeof(time_buf);
				/* This never gets bigger using URL encoding. */
				buflen += len;
				continue;
			}
			snprintf(time_buf, sizeof(time_buf), "%ld",
					  (long)time(NULL));
			var = time_buf;
			break;

		case PARM_CLIENT_DOM:		/* SMTP client domain name		*/
			var = SPF_request_get_client_dom(spf_request);
			if (! var)
				return SPF_E_NO_MEMORY;
			break;

		case PARM_CLIENT_VER:		/* IP ver str - in-addr/ip6		*/
			if (spf_request->client_ver == AF_INET)
				var = client_ver_ipv4;
			else if (spf_request->client_ver == AF_INET6)
				var = client_ver_ipv6;
			break;

		case PARM_HELO_DOM:		/* HELO/EHLO domain				*/
			var = spf_request->helo_dom;
			break;

		case PARM_REC_DOM:		/* receiving domain				*/
			var = SPF_request_get_rec_dom(spf_request);
			break;

		default:
#ifdef DEBUG
			fprintf(stderr, "Invalid variable %d\n", d->dv.parm_type);
#endif
			return SPF_E_INVALID_VAR;
			break;
		}

		if (var == NULL)
			return SPF_E_UNINIT_VAR;

		len = strlen(var);
		if (compute_length) {
			if (d->dv.url_encode)
				len *= 3;
			buflen += len;
			continue;
		}

		/* Now we put 'var' through the munging procedure. */
		munged_var = (char *)malloc(len + 1);
		if (munged_var == NULL)
			return SPF_E_NO_MEMORY;
		memset(munged_var, 0, len + 1);

		p_read_end = var + len;
		p_write = munged_var;

		/* reverse */

/* The following code confuses both me and Coverity. Shevek. */

		if (d->dv.rev) {
			p_read = p_read_end - 1;

			while ( p_read >= var ) {
				if ( SPF_delim_valid(d, *p_read) ) {
					/* Subtract 1 because p_read points to delim, and
					 * p_read_end points to the following delim. */
					len = p_read_end - p_read - 1;
					memcpy( p_write, p_read + 1, len );
					p_write += len;
					*p_write++ = '.';

					p_read_end = p_read;
				}
				p_read--;
			}

			/* Now p_read_end should point one before the start of the
			 * string. p_read_end might also point there if the string
			 * starts with a delimiter. */
			if (p_read_end >= p_read) {
				len = p_read_end - p_read - 1;
				memcpy( p_write, p_read + 1, len );
				p_write += len;
				*p_write++ = '.';
			}

			/* p_write always points to the 'next' character. */
			p_write--;
			*p_write = '\0';
		}
		else {
			p_read = var;

			while (p_read < p_read_end) {
				if (SPF_delim_valid(d, *p_read))
					*p_write++ = '.';
				else
					*p_write++ = *p_read;
				p_read++;
			}

			*p_write = '\0';
		}

		/* Now munged_var is a copy of var, possibly reversed, and
		 * thus len == strlen(munged_var). However, we continue to
		 * manipulate the underlying munged_var since var is const. */

		/* truncate, from the right hand side. */
		if (d->dv.num_rhs > 0) {
			p_read_end = munged_var + len;		/* const, at '\0' */
			p_write = munged_var + len - 1;
			num_found = 0;
			while (p_write > munged_var) {
				if (*p_write == '.')
					num_found++;
				if (num_found == d->dv.num_rhs)
					break;
				p_write--;
			}
			p_write++;		/* Move to just after the '.' */
			/* This moves the '\0' as well. */
			len = p_read_end - p_write;
			memmove(munged_var, p_write, len + 1);
		}

		var = munged_var;
		/* Now, we have 'var', of length 'len' */

		/* URL encode */

		if (d->dv.url_encode) {
			url_var = malloc(len * 3 + 1);
			if (url_var == NULL) {
				if (munged_var)
					free(munged_var);
				return SPF_E_NO_MEMORY;
			}

			p_read = var;
			p_write = url_var;

			/* escape non-uric characters (rfc2396) */
			while ( *p_read != '\0' )
			{
				if ( isalnum( (unsigned char)( *p_read  ) ) )
					*p_write++ = *p_read++;
				else
				{
					switch( *p_read )
					{
					case '-':
					case '_':
					case '.':
					case '!':
					case '~':
					case '*':
					case '\'':
					case '(':
					case ')':
						*p_write++ = *p_read++;
						break;

					default:
						/* No point doing snprintf with a const '4'
						 * because we know we're going to get 4
						 * characters anyway. */
						sprintf( p_write, "%%%02x", *p_read );
						p_write += 3;
						p_read++;
						break;
					}
				}
			}
			*p_write = '\0';

			var = url_var;
			len = p_write - url_var;		/* Not actually used. */
		}


		/* finish up */
		len = snprintf(p, p_end - p, "%s", var);
		p += len;
		if (p_end - p <= 0) {
			if (munged_var)
				free(munged_var);
			if (url_var)
				free(url_var);
			return SPF_E_INTERNAL_ERROR;
		}

		if (munged_var)
			free(munged_var);
		munged_var = NULL;
		if (url_var)
			free(url_var);
		url_var = NULL;
	}
Esempio n. 17
0
static void genvalue(Sfio_t *out, Shclass_t *sp, int indent, Namval_t *npar)
{
	Shfield_t *fp = sp->fields;
	Namval_t *np, **nodes= (Namval_t**)(sp+1);
	register int i,isarray;
	if(out)
	{
		sfwrite(out,"(\n",2);
		indent++;
	}
	for(i=0; i < sp->nelem; i++,fp++)
	{
#if 0
		/* handle recursive case */
#endif
		if(!(np=nodes[i]) && out)
			np = sh_newnode(fp,npar);
		if(np)
		{
			isarray=0;
			if(nv_isattr(np,NV_ARRAY))
			{
				isarray=1;
				if(array_elem(nv_arrayptr(np))==0)
					isarray=2;
				else
					nv_putsub(np,(char*)0,ARRAY_SCAN);
			}
			sfnputc(out,'\t',indent);
			sfputr(out,fp->name,(isarray==2?'\n':'='));
			if(isarray)
			{
				if(isarray==2)
					continue;
				sfwrite(out,"(\n",2);
				sfnputc(out,'\t',++indent);
			}
			while(1)
			{
				char *fmtq;
				if(isarray)
				{
					sfprintf(out,"[%s]",sh_fmtq(nv_getsub(np)));
					sfputc(out,'=');
				}
				if(!(fmtq=nv_getval(np)) || !(fmtq=sh_fmtq(fmtq)))
					fmtq = "";
				sfputr(out,fmtq,'\n');
				if(!nv_nextsub(np))
					break;
				sfnputc(out,'\t',indent);
			}
			if(isarray)
			{
				sfnputc(out,'\t',--indent);
				sfwrite(out,")\n",2);
			}
		}
	}
	if(out)
	{
		if(indent>1)
			sfnputc(out,'\t',indent-1);
		sfputc(out,')');
	}
}
Esempio n. 18
0
void opt_print(void) {
	size_t i;

	for (i = 0 ; i < array_elem(global_pref) ; i++)
		opt_print_var(i, "is set to");
}
Esempio n. 19
0
void wopt_print(struct imwindow *imwindow) {
	size_t i;

	for (i = 0 ; i < array_elem(window_var) ; i++)
		wopt_print_var(imwindow, i, "is set to");
}