示例#1
0
int resolve_selector(const char *sel) {
    try_initialize();
    if(sel == NULL || sel[0] == '\0') {
	fprintf(stderr,"Empty or null selectors not allowed\n");
	abort();
    }
    int *res = bytecode_hash_table_get(&symbol_table,sel);
    if(res==NULL) {
	return new_selector(sel);
    } else {
	return *res;
    }
}
示例#2
0
abstract_css_selector *css_selector_reader::create_single_selector (const char *str)
{
  trim_whitespace_left (str);
  unique_ptr <simple_selector> selector (new simple_selector);
  if (!selector->create_from_string (str))
    return nullptr;

  unique_ptr <abstract_css_selector> result (selector.release ());

  while (*str)
    {
      char combinator = get_combinator (str);
      if (*str == '\0')
        return selector.release ();

      unique_ptr <simple_selector> new_selector (new simple_selector);
      if (!new_selector->create_from_string (str))
        return nullptr;

      switch (combinator)
        {
        case ' ':
          result.reset (new descendant_selector (result.release (), new_selector.release ()));
          break;
        case '+':
          result.reset (new adjancent_selector (result.release (), new_selector.release ()));
          break;
        case '>':
          result.reset (new child_selector (result.release (), new_selector.release ()));
          break;
        default:
          return nullptr;
        }
    }

  return result.release ();
}
示例#3
0
static ERL_NIF_TERM
read_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
	ks_returner_t	*ret;
	ERL_NIF_TERM	term, statistics;
	ks_handle_t	*handle;
	ks_instance_t	*ksi;
	ks_nvpair_t	*nvpair;
	char		*ks_number;
	ks_selector_t	*selector;
	int		matched;

	ret = new_returner(env);

	if (argc < 1 || argc > 6) {
		return EKSTAT_RETURN(enif_make_badarg(ret->env));
	}

	if (!enif_get_resource(env, argv[0], kstat_handle, (void **)(&handle))) {
		return EKSTAT_RETURN(enif_make_badarg(ret->env));
	}

	selector = new_selector(ret);

	if (ret->ready == B_TRUE) {
		if ((void *)(selector) != NULL) {
			free_selector(selector);
		}
		return EKSTAT_RETURN(ret->term);
	}

	switch (argc) {
	case 2:
		(void) ks_selector_arg(ret, &selector->ks_class, argv[1]);
		break;
	case 3:
		(void) ks_selector_arg(ret, &selector->ks_class, argv[1]);
		(void) ks_selector_arg(ret, &selector->ks_module, argv[2]);
		break;
	case 4:
		(void) ks_selector_arg(ret, &selector->ks_class, argv[1]);
		(void) ks_selector_arg(ret, &selector->ks_module, argv[2]);
		(void) ks_selector_arg(ret, &selector->ks_instance, argv[3]);
		break;
	case 5:
		(void) ks_selector_arg(ret, &selector->ks_class, argv[1]);
		(void) ks_selector_arg(ret, &selector->ks_module, argv[2]);
		(void) ks_selector_arg(ret, &selector->ks_instance, argv[3]);
		(void) ks_selector_arg(ret, &selector->ks_name, argv[4]);
		break;
	case 6:
		(void) ks_selector_arg(ret, &selector->ks_class, argv[1]);
		(void) ks_selector_arg(ret, &selector->ks_module, argv[2]);
		(void) ks_selector_arg(ret, &selector->ks_instance, argv[3]);
		(void) ks_selector_arg(ret, &selector->ks_name, argv[4]);
		(void) ks_selector_arg(ret, &selector->ks_statistic, argv[5]);
		break;
	default:
		break;
	}

	if (ret->ready == B_TRUE) {
		free_selector(selector);
		return EKSTAT_RETURN(ret->term);
	}

	term = enif_make_list(env, 0);

	/* Iterate over each instance */
	for (ksi = list_head(&handle->instances_list); ksi != NULL; ksi = list_next(&handle->instances_list, ksi)) {
		matched = 0;
		statistics = (ERL_NIF_TERM)(NULL);

		(void) asprintf(&ks_number, "%d", ksi->ks_instance);
		if (
			!(ks_match(ret, ksi->ks_module, &selector->ks_module) &&
			ks_match(ret, ksi->ks_name, &selector->ks_name) &&
			ks_match(ret, ks_number, &selector->ks_instance) &&
			ks_match(ret, ksi->ks_class, &selector->ks_class))
		) {
			free(ks_number);
			if (ret->ready == B_TRUE) {
				free_selector(selector);
				return EKSTAT_RETURN(ret->term);
			}
			continue;
		}

		free(ks_number);

		/* Finally iterate over each statistic */
		for (nvpair = list_head(&ksi->ks_nvlist); nvpair != NULL; nvpair = list_next(&ksi->ks_nvlist, nvpair)) {
			if (!ks_match(ret, nvpair->name, &selector->ks_statistic)) {
				if (ret->ready == B_TRUE) {
					free_selector(selector);
					return EKSTAT_RETURN(ret->term);
				}
				continue;
			}

			if ((void *)(statistics) == NULL) {
				statistics = enif_make_list(env, 0);
			}

			matched = 1;
			statistics = enif_make_list_cell(env, ks_nvpair_term(ret, nvpair), statistics);
		}

		if (matched == 1) {
			term = enif_make_list_cell(env, ks_instance_term(ret, ksi, statistics), term);
		}
	}

	free_selector(selector);

	return EKSTAT_RETURN(term);
}
示例#4
0
int
main(int argc, char **argv)
{
ks_selector_t	*nselector;
ks_selector_t	*uselector;
kstat_ctl_t	*kc;
hrtime_t	start_n;
hrtime_t	period_n;
boolean_t	errflg = B_FALSE;
boolean_t	nselflg = B_FALSE;
boolean_t	uselflg = B_FALSE;
char		*q;
int		count = 1;
int		infinite_cycles = 0;
int		interval = 0;
int		n = 0;
int		c, m, tmp;

(void) setlocale(LC_ALL, "");
#if !defined(TEXT_DOMAIN)		/* Should be defined by cc -D */
#define	TEXT_DOMAIN "SYS_TEST"		/* Use this only if it wasn't */
#endif
(void) textdomain(TEXT_DOMAIN);

/*
 * Create the selector list and a dummy default selector to match
 * everything. While we process the cmdline options we will add
 * selectors to this list.
 */
list_create(&selector_list, sizeof (ks_selector_t),
		offsetof(ks_selector_t, ks_next));

nselector = new_selector();

/*
 * Parse named command line arguments.
 */
while ((c = getopt(argc, argv, "h?Cqjlpx:H:T:m:i:n:s:c:")) != EOF)
	switch (c) {
	case 'h':
	case '?':
		usage();
		exit(0);
		break;
	case 'C':
		g_pflg = g_cflg = B_TRUE;
		break;
	case 'q':
		g_qflg = B_TRUE;
		break;
	case 'j':
		g_jflg = B_TRUE;
		break;
	case 'l':
		g_pflg = g_lflg = B_TRUE;
		break;
	case 'H':
		g_host = B_TRUE;
		tachyon_host = (char *)ks_safe_strdup(optarg);
		break;
	case 'x':
		g_url = g_pflg = g_nflg = B_TRUE;
		// If we use nsq we need to init curl globaly.
    tm_curl_global_init();
		tachyon_url = (char *)ks_safe_strdup(optarg);
		break;
	case 'p':
		g_pflg = B_TRUE;
		break;
	case 'T':
		switch (*optarg) {
		case 'd':
			g_timestamp_fmt = DDATE;
			break;
		case 'u':
			g_timestamp_fmt = UDATE;
			break;
		default:
			errflg = B_TRUE;
		}
		break;
	case 'm':
		nselflg = B_TRUE;
		nselector->ks_module.pstr =
				(char *)ks_safe_strdup(optarg);
		break;
	case 'i':
		nselflg = B_TRUE;
		nselector->ks_instance.pstr =
				(char *)ks_safe_strdup(optarg);
		break;
	case 'n':
		nselflg = B_TRUE;
		nselector->ks_name.pstr =
				(char *)ks_safe_strdup(optarg);
		break;
	case 's':
		nselflg = B_TRUE;
		nselector->ks_statistic.pstr =
				(char *)ks_safe_strdup(optarg);
		break;
	case 'c':
		g_ks_class.pstr =
				(char *)ks_safe_strdup(optarg);
		break;
	default:
		errflg = B_TRUE;
		break;
	}

if (g_qflg && (g_jflg || g_pflg || g_nflg)) {
	(void) fprintf(stderr, gettext(
			"-q and -lpjn are mutually exclusive\n"));
	errflg = B_TRUE;
}
if (g_url ^ g_host) {
	(void) fprintf(stderr, gettext(
			"-H and -x must both be set.\n"));
	errflg = B_TRUE;
}

if (errflg) {
	usage();
	exit(2);
}

argc -= optind;
argv += optind;

/*
 * Consume the rest of the command line. Parsing the
 * unnamed command line arguments.
 */
while (argc--) {
	errno = 0;
	tmp = strtoul(*argv, &q, 10);
	if (tmp == ULONG_MAX && errno == ERANGE) {
		if (n == 0) {
			(void) fprintf(stderr, gettext(
					"Interval is too large\n"));
		} else if (n == 1) {
			(void) fprintf(stderr, gettext(
					"Count is too large\n"));
		}
		usage();
		exit(2);
	}

	if (errno != 0 || *q != '\0') {
		m = 0;
		uselector = new_selector();
		while ((q = (char *)strsep(argv, ":")) != NULL) {
			m++;
			if (m > 4) {
				free(uselector);
				usage();
				exit(2);
			}

			if (*q != '\0') {
				switch (m) {
				case 1:
					uselector->ks_module.pstr =
							(char *)ks_safe_strdup(q);
					break;
				case 2:
					uselector->ks_instance.pstr =
							(char *)ks_safe_strdup(q);
					break;
				case 3:
					uselector->ks_name.pstr =
							(char *)ks_safe_strdup(q);
					break;
				case 4:
					uselector->ks_statistic.pstr =
							(char *)ks_safe_strdup(q);
					break;
				default:
					assert(B_FALSE);
				}
			}
		}

		uselflg = B_TRUE;
		list_insert_tail(&selector_list, uselector);
	} else {
		if (tmp < 1) {
			if (n == 0) {
				(void) fprintf(stderr, gettext(
						"Interval must be an "
						"integer >= 1"));
			} else if (n == 1) {
				(void) fprintf(stderr, gettext(
						"Count must be an integer >= 1"));
			}
			usage();
			exit(2);
		} else {
			if (n == 0) {
				interval = tmp;
				count = -1;
			} else if (n == 1) {
				count = tmp;
			} else {
				usage();
				exit(2);
			}
		}
		n++;
	}
	argv++;
}

/*
 * Check if we founded a named selector on the cmdline.
 */
if (uselflg) {
	if (nselflg) {
		(void) fprintf(stderr, gettext(
				"[module[:instance[:name[:statistic]]]] and "
				"-m -i -n -s are mutually exclusive"));
		usage();
		exit(2);
	} else {
		free(nselector);
	}
} else {
	list_insert_tail(&selector_list, nselector);
}

assert(!list_is_empty(&selector_list));

list_create(&instances_list, sizeof (ks_instance_t),
		offsetof(ks_instance_t, ks_next));

while ((kc = kstat_open()) == NULL) {
	if (errno == EAGAIN) {
		(void) poll(NULL, 0, 200);
	} else {
		perror("kstat_open");
		exit(3);
	}
}

if (count > 1) {
	if (signal(SIGCONT, cont_handler) == SIG_ERR) {
		(void) fprintf(stderr, gettext(
				"signal failed"));
		exit(3);
	}
}

period_n = (hrtime_t)interval * NANOSEC;
start_n = gethrtime();


while (count == -1 || count-- > 0) {
	ks_instances_read(kc);
  kstat_time = time(NULL);
	ks_instances_print();

	if (interval && count) {
		ks_sleep_until(&start_n, period_n, infinite_cycles,
				&caught_cont);
		(void) kstat_chain_update(kc);
    if (! g_nflg)
  		(void) putchar('\n');
	}
}

(void) kstat_close(kc);

return (g_matched);
}