示例#1
0
static char *
genhelp_handler (void)
{
	int i, j;
	unsigned long fp;
	struct handler * h;
	struct key * kw;
	char * reply;
	char * p;

	reply = MALLOC(INITIAL_REPLY_LEN);

	if (!reply)
		return NULL;

	p = reply;
	p += sprintf(p, VERSION_STRING);
	p += sprintf(p, "CLI commands reference:\n");

	vector_foreach_slot (handlers, h, i) {
		fp = h->fingerprint;
		vector_foreach_slot (keys, kw, j) {
			if ((kw->code & fp)) {
				fp -= kw->code;
				p += sprintf(p, " %s", kw->str);
				p += genhelp_sprint_aliases(p, keys, kw);

				if (kw->has_param)
					p += sprintf(p, " $%s", kw->str);
			}
		}
		p += sprintf(p, "\n");
	}
示例#2
0
static int
do_genhelp(char *reply, int maxlen, const char *cmd, int error) {
	int len = 0;
	int i, j;
	uint64_t fp;
	struct handler * h;
	struct key * kw;

	switch(error) {
	case ENOMEM:
		len += snprintf(reply + len, maxlen - len,
				"%s: Not enough memory\n", cmd);
		break;
	case EAGAIN:
		len += snprintf(reply + len, maxlen - len,
				"%s: not found\n", cmd);
		break;
	case EINVAL:
		len += snprintf(reply + len, maxlen - len,
				"%s: Missing argument\n", cmd);
		break;
	}
	if (len >= maxlen)
		goto out;
	len += snprintf(reply + len, maxlen - len, VERSION_STRING);
	if (len >= maxlen)
		goto out;
	len += snprintf(reply + len, maxlen - len, "CLI commands reference:\n");
	if (len >= maxlen)
		goto out;

	vector_foreach_slot (handlers, h, i) {
		fp = h->fingerprint;
		vector_foreach_slot (keys, kw, j) {
			if ((kw->code & fp)) {
				fp -= kw->code;
				len += snprintf(reply + len , maxlen - len,
						" %s", kw->str);
				if (len >= maxlen)
					goto out;
				len += genhelp_sprint_aliases(reply + len,
							      maxlen - len,
							      keys, kw);
				if (len >= maxlen)
					goto out;

				if (kw->has_param) {
					len += snprintf(reply + len,
							maxlen - len,
							" $%s", kw->str);
					if (len >= maxlen)
						goto out;
				}
			}
		}
		len += snprintf(reply + len, maxlen - len, "\n");
		if (len >= maxlen)
			goto out;
	}