Beispiel #1
0
/* takes a hex string and puts into buffer */
void hex_to_buf(sldns_buffer* pkt, const char* hex)
{
	const char* p = hex;
	int val;
	sldns_buffer_clear(pkt);
	while(*p) {
		skip_whites(&p);
		if(sldns_buffer_position(pkt) == sldns_buffer_limit(pkt))
			fatal_exit("hex_to_buf: buffer too small");
		if(!isalnum((unsigned char)*p))
			break;
		val = sldns_hexdigit_to_int(*p++) << 4;
		skip_whites(&p);
		log_assert(*p && isalnum((unsigned char)*p));
		val |= sldns_hexdigit_to_int(*p++);
		sldns_buffer_write_u8(pkt, (uint8_t)val);
		skip_whites(&p);
	}
	sldns_buffer_flip(pkt);
}
Beispiel #2
0
/* return codes: -1 is error; 0 is everything OK but did not find shebang;
   if shebang is found, does an exec */
static int attempt_shebang_launch(char *program_to_launch, char *origin, char *profile_bin_dir,
                                  int argc, char **argv) {
    /* Attempt to open the file to scan for a shebang, which we handle
       ourself.  (If a script is executable but not readable then no
       interpreter can read it anyway; assume such a thing doesn't
       exist.) */
    FILE *f;
    char shebang[SHEBANG_MAX], interpreter[SHEBANG_MAX], arg[SHEBANG_MAX];
    char *r, *s, *interpreter_part, *arg_part = NULL;
    char **new_argv;
    char **p;
    /* read first line */
    if ((f = fopen(program_to_launch, "r")) == NULL) return -1;
    r = fgets(shebang, SHEBANG_MAX, f);
    fclose(f);
    if (r == NULL) return -1;
    /* Reference: http://homepages.cwi.nl/~aeb/std/hashexclam.html */
    /* TODO: There's a Mac OS X special case on interpreter handling.. */

    /* shebang header */
    if (r[0] != '#' || r[1] != '!') return 0; /* shebang not present return code */
    r += 2;
    skip_whites(&r);
    if (r == '\0') return -1;
    interpreter_part = r;
    skip_nonwhites(&r);
    if (*r != '\0') {
        *r = '\0'; /* terminate 'interpreter' string */
        ++r;
        skip_whites(&r);
        /* there may be an argument: */
        arg_part = r;
        rstrip(arg_part);
    }
    if (expandvars(interpreter, interpreter_part, origin, profile_bin_dir, SHEBANG_MAX) != 0) return -1;
    if (arg_part != NULL) {
        if (expandvars(arg, arg_part, origin, profile_bin_dir, SHEBANG_MAX) != 0) return -1;
    } else {
        arg[0] = '\0';
    }
    if (debug) {
        fprintf(stderr, "%sshebang_cmd=%s\n", debug_header, interpreter);
        fprintf(stderr, "%sshebang_arg=%s\n", debug_header, arg);
    }

    /* Done parsing, do launch */
    new_argv = malloc(sizeof(char*) * (argc + 3));
    p = new_argv;
    p++; /* we'll set interpreter below */
    if (arg[0]) *p++ = arg;
    /* substitute argv[0] with program_to_launch */
    argv++;
    *p++ = program_to_launch;
    while (*argv) *p++ = *argv++;
    *p = NULL;
    
    /* The interpreter string may contain : to separate many possible interpreters;
       try them in turn. */
    s = interpreter;
    for (;;) {
        r = strstr(s, ":");
        if (r != NULL) r[0] = '\0';
        new_argv[0] = s;
        execv(s, new_argv);
        if (r == NULL) break;
        s = r + 1;
    }
    /* failed to execute */
    free(new_argv);
    return -1;
}