コード例 #1
0
ファイル: main.cpp プロジェクト: calccrypto/OpenPGP
int main(int argc, char * argv[]) {
    if (argc == 1) {
        show_header(std::cout);
        help("", std::cout, "    ");
        return 0;
    }

    // if requesting help
    if (!std::strncmp(argv[1], "help", 4)) {
        if (argc == 2) {
            show_header(std::cout);
            help("", std::cout, "    ");
        }
        else{
            std::stringstream s;
            const std::size_t found = help(argv[2], s, "    ");
            std::cout << found << " matches for \"" << argv[2] << "\"";
            if (found) {
                std::cout << ":\n" << s.str() << std::flush;
            }
            else{
                std::cout << std::endl;
            }
        }
        return 0;
    }

    // reverse the mapping for commands
    std::map <std::string, std::vector <module::Module>::size_type> mapping;
    for(std::vector <module::Module>::size_type i = 0; i < module::ordered.size(); i++) {
        mapping[module::ordered[i].get_name()] = i;
    }

    // find module
    std::map <std::string, std::vector <module::Module>::size_type>::iterator it = mapping.find(argv[1]);

    // if module not found, try suggestions
    if (it == mapping.end()) {
        std::cerr << "Error: Function \"" << argv[1] << "\" not found." << std::endl;
        std::stringstream s;
        const std::size_t found = help(argv[1], s, "    ");
        if (found) {
            std::cout << found << " matches:\n" << s.str() << std::flush;
        }
        return -1;
    }

    // run module
    return module::ordered.at(it -> second)(argc - 2, argv + 2);
}
コード例 #2
0
ファイル: tm_frame.cpp プロジェクト: svn2github/texmacs
void
tm_frame_rep::full_screen_mode (bool on, bool edit) {
  if (on && !edit) {
    show_header (false);
    show_footer (false);
  }
  else {
    show_header (true);
    show_footer (true);
  }
  set_full_screen (concrete_window () -> win, on);
  get_current_editor () -> full_screen_mode (on && !edit);
  full_screen = on;
  full_screen_edit = on && edit;
}
コード例 #3
0
void
gtk_source_completion_model_set_show_headers (GtkSourceCompletionModel *model,
                                              gboolean                  show_headers)
{
	GList *l;

	g_return_if_fail (GTK_SOURCE_IS_COMPLETION_MODEL (model));

	if (model->priv->show_headers == show_headers)
	{
		return;
	}

	model->priv->show_headers = show_headers;

	for (l = model->priv->providers; l != NULL; l = l->next)
	{
		if (show_headers)
		{
			show_header (model, l);
		}
		else
		{
			hide_header (model, l);
		}
	}
}
コード例 #4
0
ファイル: snoop_mip.c プロジェクト: AlainODea/illumos-gate
void interpret_icmp_mip_ext(uchar_t *p, int len) {
	show_space();
	show_header("ICMP:  ", " MIP Advertisement Extensions ", len);
	show_space();

	interpret_extensions(p, len, ADV);
}
コード例 #5
0
ファイル: acmtool.c プロジェクト: BackupTheBerlios/libacm
static void play_file(const char *fn)
{
	ACMStream *acm;
	int err, res, buflen;
	ao_sample_format fmt;
	ao_device *dev;
	char *buf;
	unsigned int total_bytes, bytes_done = 0;

	err = acm_open_file(&acm, fn, cf_force_chans);
	if (err < 0) {
		fprintf(stderr, "%s: %s\n", fn, acm_strerror(err));
		return;
	}
	show_header(fn, acm);
	fmt.bits = 16;
	fmt.rate = acm_rate(acm);
	fmt.channels = acm_channels(acm);
	fmt.byte_format = AO_FMT_LITTLE;

	dev = open_audio(&fmt);

	buflen = 4*1024;
	buf = malloc(buflen);

	total_bytes = acm_pcm_total(acm) * acm_channels(acm) * ACM_WORD;
	while (bytes_done < total_bytes) {
		res = acm_read_loop(acm, buf, buflen/ACM_WORD, 0,2,1);
		if (res == 0)
			break;
		if (res > 0) {
			bytes_done += res;
			res = ao_play(dev, buf, res);
		} else {
			fprintf(stderr, "%s: %s\n", fn, acm_strerror(res));
			break;
		}
	}

	memset(buf, 0, buflen);
	if (bytes_done < total_bytes)
		fprintf(stderr, "%s: adding filler_samples: %d\n",
				fn, total_bytes - bytes_done);
	while (bytes_done < total_bytes) {
		int bs;
		if (bytes_done + buflen > total_bytes) {
			bs = total_bytes - bytes_done;
		} else {
			bs = buflen;
		}
		res = ao_play(dev, buf, bs);
		if (res != bs)
			break;
		bytes_done += res;
	}

	acm_close(acm);
	free(buf);
}
コード例 #6
0
ファイル: snoop_ipsec.c プロジェクト: alhazred/onarm
/* ARGSUSED */
int
interpret_esp(int flags, uint8_t *hdr, int iplen, int fraglen)
{
	/* LINTED: alignment */
	esph_t *esph = (esph_t *)hdr;
	esph_t *aligned_esph;
	esph_t storage;	/* In case hdr isn't aligned. */
	char *line;

	if (fraglen < sizeof (esph_t))
		return (fraglen);	/* incomplete header */

	if (!IS_P2ALIGNED(hdr, 4)) {
		aligned_esph = &storage;
		bcopy(hdr, aligned_esph, sizeof (esph_t));
	} else {
		aligned_esph = esph;
	}

	if (flags & F_SUM) {
		line = (char *)get_sum_line();
		/*
		 * sprintf() is safe because line guarantees us 80 columns,
		 * and SPI and replay certainly won't exceed that.
		 */
		(void) sprintf(line, "ESP SPI=0x%x Replay=%u",
		    ntohl(aligned_esph->esph_spi),
		    ntohl(aligned_esph->esph_replay));
		line += strlen(line);
	}

	if (flags & F_DTAIL) {
		show_header("ESP:  ", "Encapsulating Security Payload",
		    sizeof (esph_t));
		show_space();
		/*
		 * sprintf() is safe because get_line guarantees us 80 columns,
		 * and SPI and replay certainly won't exceed that.
		 */
		(void) sprintf(get_line((char *)&esph->esph_spi - dlc_header,
		    4), "SPI = 0x%x", ntohl(aligned_esph->esph_spi));
		(void) sprintf(get_line((char *)&esph->esph_replay -
		    dlc_header, 4), "Replay = %u",
		    ntohl(aligned_esph->esph_replay));
		(void) sprintf(get_line((char *)(esph + 1) - dlc_header,
		    4), "   ....ENCRYPTED DATA....");
	}

	return (sizeof (esph_t));
}
コード例 #7
0
ファイル: acmtool.c プロジェクト: BackupTheBerlios/libacm
static void show_info(const char *fn)
{
	int err;
	ACMStream *acm;

	err = acm_open_file(&acm, fn, cf_force_chans);
	if (err < 0) {
		printf("%s: %s\n", fn, acm_strerror(err));
		return;
	}

	show_header(fn, acm);
	acm_close(acm);
}
コード例 #8
0
ファイル: snoop_pppoe.c プロジェクト: AlainODea/illumos-gate
int
interpret_pppoe(int flags, poep_t *poep, int len)
{
	uint8_t code = poep->poep_code;
	uint8_t *payload;

	if (len < sizeof (poep_t))
		return (len);

	payload = (uint8_t *)poep + sizeof (poep_t);

	if (flags & F_SUM) {
		(void) sprintf(get_sum_line(), "PPPoE %s",
		    pppoe_codetoname(code, B_FALSE));
	} else { /* flags & F_DTAIL */
		show_header("PPPoE:  ", "PPP Over Ethernet", len);
		show_space();

		(void) sprintf(get_line(0, 0),
		    "Version = %d", POE_VERS(poep->poep_version_type));

		(void) sprintf(get_line(0, 0),
		    "Type = %d", POE_TYPE(poep->poep_version_type));

		(void) sprintf(get_line(0, 0),
		    "Code = %d (%s)", code, pppoe_codetoname(code, B_TRUE));

		(void) sprintf(get_line(0, 0),
		    "Session Id = %d", ntohs(poep->poep_session_id));

		(void) sprintf(get_line(0, 0),
		    "Length = %d bytes", ntohs(poep->poep_length));

		show_space();

		len -= sizeof (poep_t);
		len = MIN(len, ntohs(poep->poep_length));

		if (poep->poep_code != 0 && poep->poep_length > 0) {
			interpret_tags(payload, len);
		}
	}

	if (poep->poep_code == 0) {
		return (interpret_ppp(flags, payload, len));
	}
	return (len);
}
コード例 #9
0
ファイル: gda-test-blob.c プロジェクト: arthurnn/libgda
static gboolean
clear_blobs (GdaConnection *cnc, GError **error)
{
	GdaStatement *stmt;
	gboolean retval;
#define SQL_DELETE "DELETE FROM blobs"
	show_header ("Clear blobs");
	stmt = gda_sql_parser_parse_string (parser, SQL_DELETE, NULL, error);
	if (!stmt)
		return FALSE;
	
	retval = exec_statement (cnc, stmt, NULL, error);
	g_object_unref (stmt);

	return retval;
}
コード例 #10
0
ファイル: gda-test-blob.c プロジェクト: arthurnn/libgda
static gboolean
update_blob (GdaConnection *cnc, gint id, const gchar *data, glong binary_length, GError **error)
{
	GdaStatement *stmt;
	GdaSet *plist;
	GdaHolder *param;
	GValue *value;
	gchar *str;
	gboolean retval;
	const gchar* SQL_UPDATE = "UPDATE blobs set name = ##/*name:'name' type:gchararray*/, data = ##/*name:'theblob' type:'GdaBlob'*/ WHERE id= ##/*name:'id' type:gint*/";

	show_header ("Update a blob");
	stmt = gda_sql_parser_parse_string (parser, SQL_UPDATE, NULL, error);
	if (!stmt)
		return FALSE;
	if (!gda_statement_get_parameters (stmt, &plist, NULL))
		return FALSE;

	/* blob id */
	param = gda_set_get_holder (plist, "id");
	str = g_strdup_printf ("%d", id);
	if (! gda_holder_set_value_str (param, NULL, str, error))
		return FALSE;
	g_free (str);

	/* blob name */
	param = gda_set_get_holder (plist, "name");
	str = g_strdup_printf ("BLOB_%d", id);
	if (! gda_holder_set_value_str (param, NULL, str, error))
		return FALSE;
	g_free (str);

	/* blob data */
	param = gda_set_get_holder (plist, "theblob");
	value = gda_value_new_blob ((guchar*) data, binary_length);
	if (! gda_holder_set_value (param, value, error))
		return FALSE;
	gda_value_free (value);

	gda_connection_clear_events_list (cnc);
	retval = exec_statement (cnc, stmt, plist, error);
	g_object_unref (stmt);
	g_object_unref (plist);

	return retval;
}
コード例 #11
0
ファイル: snoop_pppoe.c プロジェクト: AlainODea/illumos-gate
/*
 * interpret_tags() prints PPPoE Discovery Stage TAGs in detail.
 */
static void
interpret_tags(uint8_t *payload, uint16_t length)
{
	uint8_t *tagptr = payload;
	uint16_t tag_length;
	uint16_t tag_type;
	uint8_t *tag_value;
	taginfo_t *tinfo;

	while (length >= POET_HDRLEN) {
		tag_type = POET_GET_TYPE(tagptr);
		tag_length = POET_GET_LENG(tagptr);

		tinfo = pppoe_gettaginfo(tag_type);

		show_header("PPPoE:  ", tinfo->tag_name,
		    tag_length + POET_HDRLEN);

		(void) sprintf(get_line(0, 0),
		    "Tag Type = %d", tag_type);

		(void) sprintf(get_line(0, 0),
		    "Tag Length = %d bytes", tag_length);

		length -= POET_HDRLEN;
		if (tag_length > length) {
			(void) sprintf(get_line(0, 0),
			    "Warning: Truncated Packet");
			show_space();
			break;
		}

		/*
		 * unknown tags or tags which should always have 0 length
		 * are not interpreted any further.
		 */
		tag_value = POET_DATA(tagptr);
		if (tag_length != 0 && tinfo->interpret_tagvalue != NULL)
			tinfo->interpret_tagvalue(tag_value, tag_length);

		show_space();
		length -= tag_length;
		tagptr = POET_NEXT(tagptr);
	}
}
コード例 #12
0
ファイル: mca.c プロジェクト: edgar-pek/PerspicuOS
static void
show(char *data, const char *mib)
{
	size_t reclen, seclen;

	if (mib != NULL)
		printf("<!-- MIB: %s -->\n", mib);

	printf("<record>\n");
	reclen = show_header((void*)data) - sizeof(struct mca_record_header);
	data += sizeof(struct mca_record_header);
	while (reclen > sizeof(struct mca_section_header)) {
		seclen = show_section((void*)data);
		reclen -= seclen;
		data += seclen;
	}
	printf("</record>\n");
}
コード例 #13
0
ファイル: snoop_nbp.c プロジェクト: ColinIanKing/openzfs
void
interpret_nbp(int flags, struct nbp_hdr *nbp, int len)
{
    uint8_t *data;
    int nbp_cnt = nbp->nbp_fun_cnt & 0xf; /* lower four bits */
    int nbp_op = (nbp->nbp_fun_cnt >> 4) & 0xf; /* upper four bits */

    data = (uint8_t *)(nbp + 1);

    if (flags & F_SUM) {
        if (len < sizeof (struct nbp_hdr)) {
            (void) snprintf(get_sum_line(), MAXLINE,
                            "NBP (short packet)");
            return;
        }
        (void) snprintf(get_sum_line(), MAXLINE,
                        "NBP F=%s CNT=%d ID=%d", nbp_short[nbp_op],
                        nbp_cnt, nbp->nbp_id);
    }

    if (flags & F_DTAIL) {
        show_header("NBP:  ", "NBP Header", len);
        show_space();

        if (len < sizeof (struct nbp_hdr)) {
            (void) snprintf(get_line(0, 0), get_line_remain(),
                            "NBP (short packet)");
            return;
        }
        (void) snprintf(get_line(0, 0), get_line_remain(),
                        "Length = %d", len);

        (void) snprintf(get_line(0, 0), get_line_remain(),
                        "Func = %d (%s)", nbp_op, nbp_short[nbp_op]);

        (void) snprintf(get_line(0, 0), get_line_remain(),
                        "Tuple count = %d", nbp_cnt);
        (void) snprintf(get_line(0, 0), get_line_remain(),
                        "Id = %d", nbp->nbp_id);
        show_nbp_tuples(data, nbp_cnt, ((uint8_t *)nbp) + len);
    }
}
コード例 #14
0
ファイル: snoop_dhcpv6.c プロジェクト: AlainODea/illumos-gate
static void
nest_options(const uint8_t *data, uint_t olen, char *prefix, char *title)
{
	char *str, *oldnest, *oldprefix;

	if (olen <= 0)
		return;
	oldprefix = prot_prefix;
	oldnest = prot_nest_prefix;
	str = malloc(strlen(prot_nest_prefix) + strlen(prot_prefix) + 1);
	if (str == NULL) {
		prot_nest_prefix = prot_prefix;
	} else {
		(void) sprintf(str, "%s%s", prot_nest_prefix, prot_prefix);
		prot_nest_prefix = str;
	}
	show_header(prefix, title, 0);
	show_options(data, olen);
	free(str);
	prot_prefix = oldprefix;
	prot_nest_prefix = oldnest;
}
コード例 #15
0
ファイル: snoop_aecho.c プロジェクト: AlainODea/illumos-gate
void
interpret_aecho(int flags, struct ddp_hdr *ddp, int len)
{
	char *data;

	data = (char *)ddp + DDPHDR_SIZE;

	if (flags & F_SUM) {
		if (len < DDPHDR_SIZE + 1) {
			(void) snprintf(get_sum_line(), MAXLINE,
			    "AECHO (short packet)");
			return;
		}

		(void) snprintf(get_sum_line(), MAXLINE,
		    "AECHO F=%s LEN=%d",
		    *data == AEP_REQ ? "Request" : "Reply",
		    len);
	}

	if (flags & F_DTAIL) {
		if (len < DDPHDR_SIZE + 1) {
			(void) snprintf(get_line(0, 0), get_line_remain(),
			    "AECHO (short packet)");
			return;
		}

		show_header("AECHO:  ", "AECHO Header", len);
		show_space();

		(void) snprintf(get_line(0, 0), get_line_remain(),
		    "Func = %d (%s)",
		    data[0],
		    data[0] == AEP_REQ ? "Request" : "Reply");
		(void) snprintf(get_line(0, 0), get_line_remain(),
		    "Length = %d", len);
	}
}
コード例 #16
0
static uint_t
interpret_ipnet(int flags, char *header, int elen, int origlen)
{
	dl_ipnetinfo_t dl;
	size_t len = elen - sizeof (dl_ipnetinfo_t);
	char *off = (char *)header + sizeof (dl_ipnetinfo_t);
	int blen = MAX(origlen, 8252);
	char szone[MAX_UINT64_STR];
	char dzone[MAX_UINT64_STR];

	(void) memcpy(&dl, header, sizeof (dl));
	if (data != NULL && datalen != 0 && datalen < blen) {
		free(data);
		data = NULL;
		datalen = 0;
	}
	if (data == NULL) {
		data = (char *)malloc(blen);
		if (!data)
			pr_err("Warning: malloc failure");
		datalen = blen;
	}

	if (dl.dli_zsrc == ALL_ZONES)
		sprintf(szone, "Unknown");
	else
		sprintf(szone, "%lu", BE_32(dl.dli_zsrc));

	if (dl.dli_zdst == ALL_ZONES)
		sprintf(dzone, "Unknown");
	else
		sprintf(dzone, "%lu", BE_32(dl.dli_zdst));

	if (flags & F_SUM) {
		(void) snprintf(get_sum_line(), MAXLINE,
		    "IPNET src zone %s dst zone %s", szone, dzone);
	}

	if (flags & F_DTAIL) {
		show_header("IPNET:  ", "IPNET Header", elen);
		show_space();
		(void) sprintf(get_line(0, 0),
		    "Packet %d arrived at %d:%02d:%d.%05d",
		    pi_frame,
		    pi_time_hour, pi_time_min, pi_time_sec,
		    pi_time_usec / 10);
		(void) sprintf(get_line(0, 0),
		    "Packet size = %d bytes",
		    elen);
		(void) snprintf(get_line(0, 0), get_line_remain(),
		    "dli_version = %d", dl.dli_version);
		(void) snprintf(get_line(0, 0), get_line_remain(),
		    "dli_family = %d", dl.dli_family);
		(void) snprintf(get_line(0, 2), get_line_remain(),
		    "dli_zsrc = %s", szone);
		(void) snprintf(get_line(0, 2), get_line_remain(),
		    "dli_zdst = %s", dzone);
		show_space();
	}
	memcpy(data, off, len);

	switch (dl.dli_family) {
	case AF_INET:
		(void) interpret_ip(flags, (struct ip *)data, len);
		break;
	case AF_INET6:
		(void) interpret_ipv6(flags, (ip6_t *)data, len);
		break;
	default:
		break;
	}

	return (0);
}
コード例 #17
0
uint_t
interpret_tr(int flags, caddr_t e, int elen, int origlen)
{
	struct tr_header *mh;
	struct tr_ri *rh;
	uchar_t fc;
	struct llc_snap_hdr *snaphdr;
	char *off;
	int maclen, len;
	boolean_t data_copied = B_FALSE;
	extern char *dst_name, *src_name;
	int ethertype;
	int is_llc = 0, is_snap = 0, source_routing = 0;
	int blen = MAX(origlen, 17800);

	if (data != NULL && datalen != 0 && datalen < blen) {
		free(data);
		data = NULL;
		datalen = 0;
	}
	if (!data) {
		data = (char *)malloc(blen);
		if (!data)
			pr_err("Warning: malloc failure");
		datalen = blen;
	}

	if (origlen < ACFCDASA_LEN) {
		if (flags & F_SUM) {
			(void) sprintf(get_sum_line(),
			    "RUNT (short packet - %d bytes)",
			    origlen);
		}
		if (flags & F_DTAIL)
			show_header("RUNT:  ", "Short packet", origlen);
		return (elen);
	}
	if (elen < ACFCDASA_LEN)
		return (elen);

	mh = (struct tr_header *)e;
	rh = (struct tr_ri *)&mh->ri;
	fc = mh->fc;

	if (is_llc = tr_machdr_len(e, &maclen, &source_routing)) {
		snaphdr = (struct llc_snap_hdr *)(e + maclen);
		if (snaphdr->d_lsap == LSAP_SNAP &&
		    snaphdr->s_lsap == LSAP_SNAP &&
		    snaphdr->control == CNTL_LLC_UI) {
			is_snap = 1;
		}
	}

	if (memcmp(&mh->dhost, &ether_broadcast,
	    sizeof (struct ether_addr)) == 0)
		dst_name = "(broadcast)";
	else if (memcmp(&mh->dhost, &tokenbroadcastaddr2,
	    sizeof (struct ether_addr)) == 0)
		dst_name = "(mac broadcast)";
	else if (mh->dhost.ether_addr_octet[0] & TR_FN_ADDR)
		dst_name = "(functional)";

	if (is_snap)
		ethertype = ntohs(snaphdr->type);
	else {
		src_name =  print_etherinfo(&mh->shost);
		dst_name =  print_etherinfo(&mh->dhost);
	}

	/*
	 * The 14 byte ether header screws up alignment
	 * of the rest of the packet for 32 bit aligned
	 * architectures like SPARC. Alas, we have to copy
	 * the rest of the packet in order to align it.
	 */
	if (is_llc) {
		if (is_snap) {
			len = elen - (maclen + LLC_SNAP_HDR_LEN);
			off = (char *)(e + maclen + LLC_SNAP_HDR_LEN);
		} else {
			len = elen - (maclen + LLC_HDR1_LEN);
			off = (char *)(e + maclen + LLC_HDR1_LEN);
		}
	} else {
		len = elen - maclen;
		off = (char *)(e + maclen);
	}

	if (len > 0 && (off + len <= (char *)e + elen)) {
		(void) memcpy(data, off, len);
		data_copied = B_TRUE;
	}

	if (flags & F_SUM) {
		if (source_routing)
			sprintf(get_sum_line(), print_sr(rh));

		if (is_llc) {
			if (is_snap) {
				(void) sprintf(get_sum_line(), "TR LLC w/SNAP "
				    "Type=%04X (%s), size=%d bytes",
				    ethertype,
				    print_ethertype(ethertype),
				    origlen);
			} else {
				(void) sprintf(get_sum_line(), "TR LLC, but no "
				    "SNAP encoding, size = %d bytes",
				    origlen);
			}
		} else {
			(void) sprintf(get_sum_line(),
			    "TR MAC FC=%02X (%s), size = %d bytes",
			    fc, print_fc(fc), origlen);
		}
	}

	if (flags & F_DTAIL) {
		show_header("TR:  ", "TR Header", elen);
		show_space();
		(void) sprintf(get_line(0, 0),
		    "Packet %d arrived at %d:%02d:%d.%05d",
		    pi_frame,
		    pi_time_hour, pi_time_min, pi_time_sec,
		    pi_time_usec / 10);
		(void) sprintf(get_line(0, 0),
		    "Packet size = %d bytes",
		    elen);
		(void) sprintf(get_line(0, 1),
		    "Frame Control = %02x (%s)",
		    fc, print_fc(fc));
		(void) sprintf(get_line(2, 6),
		    "Destination = %s, %s",
		    printether(&mh->dhost),
		    print_etherinfo(&mh->dhost));
		(void) sprintf(get_line(8, 6),
		    "Source      = %s, %s",
		    printether(&mh->shost),
		    print_etherinfo(&mh->shost));

		if (source_routing)
			sprintf(get_line(ACFCDASA_LEN, rh->len), print_sr(rh));

		if (is_llc) {
			(void) sprintf(get_line(maclen, 1),
			    "Dest   Service Access Point = %02x",
			    snaphdr->d_lsap);
			(void) sprintf(get_line(maclen+1, 1),
			    "Source Service Access Point = %02x",
			    snaphdr->s_lsap);
			(void) sprintf(get_line(maclen+2, 1),
			    "Control = %02x",
			    snaphdr->control);
			if (is_snap) {
				(void) sprintf(get_line(maclen+3, 3),
				    "SNAP Protocol Id = %02x%02x%02x",
				    snaphdr->org[0], snaphdr->org[1],
				    snaphdr->org[2]);
			}
		}

		if (is_snap) {
			(void) sprintf(get_line(maclen+6, 2),
			    "SNAP Type = %04X (%s)",
			    ethertype, print_ethertype(ethertype));
		}

		show_space();
	}

	/* go to the next protocol layer */
	if (is_snap && data_copied) {
		switch (ethertype) {
		case ETHERTYPE_IP:
			(void) interpret_ip(flags, (struct ip *)data, len);
			break;
		/* Just in case it is decided to add this type */
		case ETHERTYPE_IPV6:
			(void) interpret_ipv6(flags, (ip6_t *)data, len);
			break;
		case ETHERTYPE_ARP:
		case ETHERTYPE_REVARP:
			interpret_arp(flags, (struct arphdr *)data, len);
			break;
		case ETHERTYPE_AARP:	/* AppleTalk */
			interpret_aarp(flags, data, len);
			break;
		case ETHERTYPE_AT:
			interpret_at(flags, (struct ddp_hdr *)data, len);
			break;
		default:
			break;
		}
	}

	return (elen);
}
コード例 #18
0
uint_t
interpret_ether(int flags, char *header, int elen, int origlen)
{
	struct ether_header *e = (struct ether_header *)header;
	uchar_t *off, *ieeestart;
	int len;
	int ieee8023 = 0;
	extern char *dst_name;
	int ethertype;
	struct ether_vlan_extinfo *evx = NULL;
	int blen = MAX(origlen, ETHERMTU);
	boolean_t trillpkt = B_FALSE;
	uint16_t tci = 0;

	if (data != NULL && datalen != 0 && datalen < blen) {
		free(data);
		data = NULL;
		datalen = 0;
	}
	if (!data) {
		data = (char *)malloc(blen);
		if (!data)
			pr_err("Warning: malloc failure");
		datalen = blen;
	}
inner_pkt:
	if (origlen < 14) {
		if (flags & F_SUM) {
			(void) sprintf(get_sum_line(),
			    "RUNT (short packet - %d bytes)",
			    origlen);
		}
		if (flags & F_DTAIL)
			show_header("RUNT:  ", "Short packet", origlen);
		return (elen);
	}
	if (elen < 14)
		return (elen);

	if (memcmp(&e->ether_dhost, &ether_broadcast,
	    sizeof (struct ether_addr)) == 0)
		dst_name = "(broadcast)";
	else if (e->ether_dhost.ether_addr_octet[0] & 1)
		dst_name = "(multicast)";

	ethertype = ntohs(e->ether_type);

	/*
	 * The 14 byte ether header screws up alignment
	 * of the rest of the packet for 32 bit aligned
	 * architectures like SPARC. Alas, we have to copy
	 * the rest of the packet in order to align it.
	 */
	len = elen - sizeof (struct ether_header);
	off = (uchar_t *)(e + 1);

	if (ethertype == ETHERTYPE_VLAN) {
		if (origlen < sizeof (struct ether_vlan_header)) {
			if (flags & F_SUM) {
				(void) sprintf(get_sum_line(),
				    "RUNT (short VLAN packet - %d bytes)",
				    origlen);
			}
			if (flags & F_DTAIL) {
				show_header("RUNT:  ", "Short VLAN packet",
				    origlen);
			}
			return (elen);
		}
		if (len < sizeof (struct ether_vlan_extinfo))
			return (elen);

		evx = (struct ether_vlan_extinfo *)off;
		off += sizeof (struct ether_vlan_extinfo);
		len -= sizeof (struct ether_vlan_extinfo);

		ethertype = ntohs(evx->ether_type);
		tci = ntohs(evx->ether_tci);
	}

	if (ethertype <= 1514) {
		/*
		 * Fake out the IEEE 802.3 packets.
		 * Should be DSAP=0xAA, SSAP=0xAA, control=0x03
		 * then three padding bytes of zero (OUI),
		 * followed by a normal ethernet-type packet.
		 */
		ieee8023 = ethertype;
		ieeestart = off;
		if (off[0] == 0xAA && off[1] == 0xAA) {
			ethertype = ntohs(*(ushort_t *)(off + 6));
			off += 8;
			len -= 8;
		} else {
			ethertype = 0;
			off += 3;
			len -= 3;
		}
	}

	if (flags & F_SUM) {
		/*
		 * Set the flag that says don't display VLAN information.
		 * If it needs to change, that will be done later if the
		 * packet is VLAN tagged and if snoop is in its default
		 * summary mode.
		 */
		set_vlan_id(0);
		if (evx == NULL) {
			if (ethertype == 0 && ieee8023 > 0) {
				(void) sprintf(get_sum_line(),
				    "ETHER 802.3 SSAP %02X DSAP %02X, "
				    "size=%d bytes", ieeestart[0], ieeestart[1],
				    origlen);
			} else {
				(void) sprintf(get_sum_line(),
				    "ETHER Type=%04X (%s), size=%d bytes",
				    ethertype, print_ethertype(ethertype),
				    origlen);
			}
		} else {
			if (ethertype == 0 && ieee8023 > 0) {
				(void) sprintf(get_sum_line(),
				    "ETHER 802.3 SSAP %02X DSAP %02X, "
				    "VLAN ID=%hu, size=%d bytes", ieeestart[0],
				    ieeestart[1], VLAN_ID(tci), origlen);
			} else {
				(void) sprintf(get_sum_line(),
				    "ETHER Type=%04X (%s), VLAN ID=%hu, "
				    "size=%d bytes", ethertype,
				    print_ethertype(ethertype), VLAN_ID(tci),
				    origlen);
			}

			if (!(flags & F_ALLSUM))
				set_vlan_id(VLAN_ID(tci));
		}
	}

	if (flags & F_DTAIL) {
		show_header("ETHER:  ", "Ether Header", elen);
		show_space();
		if (!trillpkt) {
			(void) sprintf(get_line(0, 0),
			    "Packet %d arrived at %d:%02d:%d.%05d",
			    pi_frame,
			    pi_time_hour, pi_time_min, pi_time_sec,
			    pi_time_usec / 10);
			(void) sprintf(get_line(0, 0),
			    "Packet size = %d bytes",
			    elen, elen);
		}
		(void) sprintf(get_line(0, 6),
		    "Destination = %s, %s",
		    printether(&e->ether_dhost),
		    print_etherinfo(&e->ether_dhost));
		(void) sprintf(get_line(6, 6),
		    "Source      = %s, %s",
		    printether(&e->ether_shost),
		    print_etherinfo(&e->ether_shost));
		if (evx != NULL) {
			(void) sprintf(get_line(0, 0),
			    "VLAN ID     = %hu", VLAN_ID(tci));
			(void) sprintf(get_line(0, 0),
			    "VLAN Priority = %hu", VLAN_PRI(tci));
		}
		if (ieee8023 > 0) {
			(void) sprintf(get_line(12, 2),
			    "IEEE 802.3 length = %d bytes", ieee8023);
			/* Print LLC only for non-TCP/IP packets */
			if (ethertype == 0) {
				(void) snprintf(get_line(0, 0),
				    get_line_remain(),
				    "SSAP = %02X, DSAP = %02X, CTRL = %02X",
				    ieeestart[0], ieeestart[1], ieeestart[2]);
			}
		}
		if (ethertype != 0 || ieee8023 == 0)
			(void) sprintf(get_line(12, 2),
			    "Ethertype = %04X (%s)",
			    ethertype, print_ethertype(ethertype));
		show_space();
	}

	/*
	 * We cannot trust the length field in the header to be correct.
	 * But we should continue to process the packet.  Then user can
	 * notice something funny in the header.
	 * Go to the next protocol layer only if data have been
	 * copied.
	 */
	if (len > 0 && (off + len <= (uchar_t *)e + elen)) {
		(void) memmove(data, off, len);

		if (!trillpkt && ethertype == ETHERTYPE_TRILL) {
			ethertype = interpret_trill(flags, &e, data, &len);
			/* Decode inner Ethernet frame */
			if (ethertype != 0) {
				evx = NULL;
				trillpkt = B_TRUE;
				(void) memmove(data, e, len);
				e = (struct ether_header *)data;
				origlen = len;
				elen = len;
				goto inner_pkt;
			}
		}

		switch (ethertype) {
		case ETHERTYPE_IP:
			(void) interpret_ip(flags, (struct ip *)data, len);
			break;
		/* Just in case it is decided to add this type */
		case ETHERTYPE_IPV6:
			(void) interpret_ipv6(flags, (ip6_t *)data, len);
			break;
		case ETHERTYPE_ARP:
		case ETHERTYPE_REVARP:
			interpret_arp(flags, (struct arphdr *)data, len);
			break;
		case ETHERTYPE_PPPOED:
		case ETHERTYPE_PPPOES:
			(void) interpret_pppoe(flags, (poep_t *)data, len);
			break;
		case ETHERTYPE_AARP:    /* AppleTalk */
			interpret_aarp(flags, data, len);
			break;
		case ETHERTYPE_AT:
			interpret_at(flags, (struct ddp_hdr *)data, len);
			break;
		case 0:
			if (ieee8023 == 0)
				break;
			switch (ieeestart[0]) {
			case 0xFE:
				interpret_isis(flags, data, len,
				    memcmp(&e->ether_dhost, &all_isis_rbridges,
				    sizeof (struct ether_addr)) == 0);
				break;
			case 0x42:
				interpret_bpdu(flags, data, len);
				break;
			}
			break;
		}
	}

	return (elen);
}
コード例 #19
0
static uint_t
interpret_ib(int flags, char *header, int elen, int origlen)
{
	struct ipoib_header *hdr = (struct ipoib_header *)header;
	char *off;
	int len;
	unsigned short ethertype;
	int blen = MAX(origlen, 4096);

	if (data != NULL && datalen != 0 && datalen < blen) {
		free(data);
		data = NULL;
		datalen = 0;
	}
	if (data == NULL) {
		data = malloc(blen);
		if (data == NULL)
			pr_err("Warning: malloc failure");
		datalen = blen;
	}
	if (origlen < IPOIB_HDRSIZE) {
		if (flags & F_SUM)
			(void) snprintf(get_sum_line(), MAXLINE,
			    "RUNT (short packet - %d bytes)", origlen);
		if (flags & F_DTAIL)
			show_header("RUNT:  ", "Short packet", origlen);
		return (elen);
	}
	if (elen < IPOIB_HDRSIZE)
		return (elen);

	/*
	 * It is not possible to understand just by looking
	 * at the header whether this was a broad/multi cast
	 * packet; thus dst_name is not updated.
	 */
	ethertype = ntohs(hdr->ipoib_type);
	len = elen - IPOIB_HDRSIZE;
	off = (char *)(hdr + 1);
	(void) memcpy(data, off, len);

	if (flags & F_SUM) {
		(void) snprintf(get_sum_line(), MAXLINE,
		    "IPIB Type=%04X (%s), size = %d bytes",
		    ethertype,
		    print_ethertype(ethertype),
		    origlen);
	}

	if (flags & F_DTAIL) {
		show_header("IPIB:  ", "IPIB Header", elen);
		show_space();
		(void) snprintf(get_line(0, 0), get_line_remain(),
		    "Packet %d arrived at %d:%02d:%d.%02d",
		    pi_frame, pi_time_hour, pi_time_min,
		    pi_time_sec, pi_time_usec / 10000);
		(void) snprintf(get_line(0, 0), get_line_remain(),
		    "Packet size = %d bytes", elen, elen);
		(void) snprintf(get_line(0, 2), get_line_remain(),
		    "Ethertype = %04X (%s)", ethertype,
		    print_ethertype(ethertype));
		show_space();
	}

	/* Go to the next protocol layer */
	switch (ethertype) {
		case ETHERTYPE_IP:
			(void) interpret_ip(flags, (struct ip *)data, len);
			break;
		case ETHERTYPE_IPV6:
			(void) interpret_ipv6(flags, (ip6_t *)data, len);
			break;
		case ETHERTYPE_ARP:
		case ETHERTYPE_REVARP:
			interpret_arp(flags, (struct arphdr *)data, len);
			break;
	}

	return (elen);
}
コード例 #20
0
ファイル: snoop_rip6.c プロジェクト: andreiw/polaris
int
interpret_rip6(int flags, struct rip6 *rip6, int fraglen)
{
	char *p;
	struct netinfo6 *n;
	int len, count;
	struct in6_addr *dst;
	int notdefault = 0;
	char dststr[INET6_ADDRSTRLEN];

	if (flags & F_SUM) {
		switch (rip6->rip6_cmd) {
		case RIPCMD6_REQUEST:	p = "C";		break;
		case RIPCMD6_RESPONSE:	p = "R";		break;
		default: p = "?"; break;
		}

		switch (rip6->rip6_cmd) {
		case RIPCMD6_REQUEST:
		case RIPCMD6_RESPONSE:
			len = fraglen - 4;
			count = 0;
			for (n = rip6->rip6_nets;
			    len >= sizeof (struct netinfo6); n++) {
				count++;
				len -= sizeof (struct netinfo6);
			}
			(void) sprintf(get_sum_line(),
			    "RIPng %s (%d destinations)", p, count);
			break;
		default:
			(void) sprintf(get_sum_line(), "RIPng %s", p);
			break;
		}
	}

	if (flags & F_DTAIL) {

		show_header("RIPng:  ", "Routing Information Protocol for IPv6",
		    fraglen);
		show_space();
		(void) sprintf(get_line((char *)(uintptr_t)rip6->rip6_cmd -
		    dlc_header, 1), "Opcode = %d (%s)", rip6->rip6_cmd,
		    show_cmd6(rip6->rip6_cmd));
		(void) sprintf(get_line((char *)(uintptr_t)rip6->rip6_vers -
		    dlc_header, 1), "Version = %d", rip6->rip6_vers);

		switch (rip6->rip6_cmd) {
		case RIPCMD6_REQUEST:
		case RIPCMD6_RESPONSE:
			show_space();
			(void) sprintf(get_line(0, 0), "Address"
			    "                       Prefix        Metric");
			len = fraglen - 4;
			for (n = rip6->rip6_nets;
			    len >= sizeof (struct netinfo6); n++) {
				if (rip6->rip6_vers > 0) {
					n->rip6_metric = n->rip6_metric;
				}
				dst = &n->rip6_prefix;
				notdefault = bcmp((caddr_t *)dst,
				    (caddr_t *)&all_zeroes_addr, sizeof (*dst));
				(void) inet_ntop(AF_INET6, (char *)dst, dststr,
				    INET6_ADDRSTRLEN);
				(void) sprintf(get_line((char *)n - dlc_header,
				    sizeof (struct netinfo6)),
				    "%-30s %-10d     %-5d %s",
				    notdefault ? dststr :
				    " (default)", n->rip6_prefix_length,
				    n->rip6_metric, n->rip6_metric == 16 ?
				    " (not reachable)":"");
				len -= sizeof (struct netinfo);
			}
			break;
		}
	}
	return (fraglen);
}
コード例 #21
0
uint_t
interpret_fddi(int flags, caddr_t e, int elen, int origlen)
{
	struct fddi_header fhdr, *f = &fhdr;
	char *off;
	int len;
	boolean_t data_copied = B_FALSE;
	extern char *dst_name, *src_name;
	int ethertype;
	int is_llc = 0, is_smt = 0, is_snap = 0;
	int blen = MAX(origlen, 4500);

	if (data != NULL && datalen != 0 && datalen < blen) {
		free(data);
		data = NULL;
		datalen = 0;
	}
	if (!data) {
		data = (char *)malloc(blen);
		if (!data)
			pr_err("Warning: malloc failure");
		datalen = blen;
	}

	if (origlen < 13) {
		if (flags & F_SUM) {
			(void) sprintf(get_sum_line(),
			    "RUNT (short packet - %d bytes)",
			    origlen);
		}
		if (flags & F_DTAIL)
			show_header("RUNT:  ", "Short packet", origlen);
		return (elen);
	}
	if (elen < 13)
		return (elen);

	(void) memcpy(&f->fc, e, sizeof (f->fc));
	addr_copy_swap(&f->dhost, (struct ether_addr *)(e+1));
	addr_copy_swap(&f->shost, (struct ether_addr *)(e+7));

	if ((f->fc&0x50) == 0x50) {
		is_llc = 1;
		(void) memcpy(&f->dsap, e+13, sizeof (f->dsap));
		(void) memcpy(&f->ssap, e+14, sizeof (f->ssap));
		(void) memcpy(&f->ctl, e+15, sizeof (f->ctl));
		if (f->dsap == 0xaa && f->ssap == 0xaa) {
			is_snap = 1;
			(void) memcpy(&f->proto_id, e+16, sizeof (f->proto_id));
			(void) memcpy(&f->type, e+19, sizeof (f->type));
		}
	} else {
		if ((f->fc&0x41) == 0x41 || (f->fc&0x4f) == 0x4f) {
			is_smt = 1;
		}
	}


	if (memcmp(&f->dhost, &ether_broadcast,
	    sizeof (struct ether_addr)) == 0)
		dst_name = "(broadcast)";
	else if (f->dhost.ether_addr_octet[0] & 0x01)
		dst_name = "(multicast)";

	if (is_snap)
		ethertype = ntohs(f->type);
	else {
		src_name = 	print_etherinfo(&f->shost);
		dst_name =  print_etherinfo(&f->dhost);
	}

	/*
	 * The 14 byte ether header screws up alignment
	 * of the rest of the packet for 32 bit aligned
	 * architectures like SPARC. Alas, we have to copy
	 * the rest of the packet in order to align it.
	 */
	if (is_llc) {
		if (is_snap) {
			len = elen - 21;
			off = (char *)(e + 21);
		} else {
			len = elen - 16;
			off = (char *)(e + 16);
		}
	} else {
		len = elen - 13;
		off = (char *)(e + 13);
	}

	if (len > 0 && (off + len <= (char *)e + elen)) {
		(void) memcpy(data, off, len);
		data_copied = B_TRUE;
	}

	if (flags & F_SUM) {
		if (is_llc) {
			if (is_snap) {
				(void) sprintf(get_sum_line(),
				    "FDDI LLC Type=%04X (%s), size = %d bytes",
				    ethertype,
				    print_ethertype(ethertype),
				    origlen);
			} else {
				(void) sprintf(get_sum_line(), "LLC, but no "
				    "SNAP encoding, size = %d bytes",
				    origlen);
			}
		} else if (is_smt) {
			(void) sprintf(get_sum_line(), "SMT Type=%02X (%s), "
			    "Class = %02X (%s), size = %d bytes",
			    *(uchar_t *)(data+1), print_smttype(*(data+1)),
			    *data, print_smtclass(*data), origlen);
		} else {
			(void) sprintf(get_sum_line(),
			    "FC=%02X (%s), size = %d bytes",
			    f->fc, print_fc(f->fc), origlen);
		}
	}

	if (flags & F_DTAIL) {
		show_header("FDDI:  ", "FDDI Header", elen);
		show_space();
		(void) sprintf(get_line(0, 0),
		    "Packet %d arrived at %d:%02d:%d.%05d",
		    pi_frame,
		    pi_time_hour, pi_time_min, pi_time_sec,
		    pi_time_usec / 10);
		(void) sprintf(get_line(0, 0),
		    "Packet size = %d bytes",
		    elen, elen);
		(void) sprintf(get_line(0, 6),
		    "Destination = %s, %s",
		    printether(&f->dhost),
		    print_etherinfo(&f->dhost));
		(void) sprintf(get_line(6, 6),
		    "Source      = %s, %s",
		    printether(&f->shost),
		    print_etherinfo(&f->shost));

		if (is_llc) {
			(void) sprintf(get_line(12, 2),
			    "Frame Control = %02x (%s)",
			    f->fc, print_fc(f->fc));
			(void) sprintf(get_line(12, 2),
			    "Dest   Service Access Point = %02x",
			    f->dsap);
			(void) sprintf(get_line(12, 2),
			    "Source Service Access Point = %02x",
			    f->ssap);
			(void) sprintf(get_line(12, 2),
			    "Control = %02x",
			    f->ctl);
			if (is_snap) {
				(void) sprintf(get_line(12, 2),
				    "Protocol Id = %02x%02x%02x",
				    f->proto_id[0], f->proto_id[1],
				    f->proto_id[2]);
			}
		} else if (is_smt) {
			(void) sprintf(get_line(12, 2),
			    "Frame Control = %02x (%s)",
			    f->fc, print_fc(f->fc));
			(void) sprintf(get_line(12, 2),
			    "Class = %02x (%s)",
			    (uchar_t)*data, print_smtclass(*data));
			(void) sprintf(get_line(12, 2),
			    "Type = %02x (%s)",
			    *(uchar_t *)(data+1), print_smttype(*(data+1)));
		} else {
			(void) sprintf(get_line(12, 2),
			    "FC=%02X (%s), size = %d bytes",
			    f->fc, print_fc(f->fc), origlen);
		}

		if (is_snap) {
			(void) sprintf(get_line(12, 2),
			    "LLC Type = %04X (%s)",
			    ethertype, print_ethertype(ethertype));
		}

		show_space();
	}

	/* go to the next protocol layer */
	if (is_llc && is_snap && f->ctl == 0x03 && data_copied) {
		switch (ethertype) {
		case ETHERTYPE_IP:
			(void) interpret_ip(flags, (struct ip *)data, len);
			break;
		/* Just in case it is decided to add this type */
		case ETHERTYPE_IPV6:
			(void) interpret_ipv6(flags, (ip6_t *)data, len);
			break;
		case ETHERTYPE_ARP:
		case ETHERTYPE_REVARP:
			interpret_arp(flags, (struct arphdr *)data, len);
			break;
		default:
			break;
		}

	}

	return (elen);
}
コード例 #22
0
ファイル: snoop_slp.c プロジェクト: jasonbking/illumos-gate
static int v1_header(int flags,
			struct slpv1_hdr *slp,
			int fraglen) {
	extern int src_port, dst_port, curr_proto;
	char *prototag = (curr_proto == IPPROTO_TCP? "/tcp" : "");

	if (flags & F_SUM) {
	    char portflag = ' ';

	    if (msglength < sizeof (*slp)) {
		sprintf(msgbuf, "SLP V1 [incomplete header]");
		return (0);
	    }

	    if (slp->vers != 1) {
		if (curr_proto == IPPROTO_TCP)
		    sprintf(msgbuf, "SLP [TCP Continuation]");
		else
		    sprintf(msgbuf, "SLP [unknown version %d]", slp->vers);
		return (0);
	    }

	    if (src_port != 427 && dst_port != 427)
		portflag = '-';

	    sprintf(msgbuf, "SLP V1%c%s [%d%s] ", portflag,
		    slpv1_func(slp->function, B_TRUE),
		    ntohs(slp->xid), prototag);
	    msgend = msgbuf + strlen(msgbuf);
	    msglength -= sizeof (*slp);
	    p += sizeof (*slp);
	} else if (flags & F_DTAIL) {
	    show_header("SLP:  ", "Service Location Protocol (v1)", fraglen);
	    show_space();

	    if (msglength < sizeof (*slp)) {
		sprintf(get_line(0, 0), "==> Incomplete SLP header");
		return (0);
	    }

	    sprintf(get_line(0, 0), "Version = %d", slp->vers);
	    if (slp->vers != 1) {
		if (curr_proto == IPPROTO_TCP)
		    sprintf(get_line(0, 0), "==> TCP continuation");
		else
		    sprintf(get_line(0, 0), "==> Unexpected version number");
		return (0);
	    }
	    sprintf(get_line(0, 0), "Function = %d, %s",
		slp->function, slpv1_func(slp->function, B_FALSE));
	    sprintf(get_line(0, 0), "Message length = %u", ntohs(slp->length));

	    /* flags */
	    sprintf(get_line(0, 0), "Flags = 0x%02x", slp->flags);
	    sprintf(get_line(0, 0), "      %s",
		    getflag(slp->flags, V1_OVERFLOW,
			    "overflow", "no overflow"));
	    sprintf(get_line(0, 0), "      %s",
		    getflag(slp->flags, V1_MONOLINGUAL,
			    "monolingual", "not monolingual"));
	    sprintf(get_line(0, 0), "      %s",
		    getflag(slp->flags, V1_URL_AUTH,
			    "url authentication", "no url authentication"));
	    sprintf(get_line(0, 0), "      %s",
		    getflag(slp->flags, V1_ATTR_AUTH,
		"attribute authentication", "no attribute authentication"));
	    sprintf(get_line(0, 0), "      %s",
		    getflag(slp->flags, V1_FRESH_REG,
			    "fresh registration", "no fresh registration"));
	    /* check reserved flags that must be zero */
	    if ((slp->flags & 7) != 0) {
		sprintf(get_line(0, 0),
			"      .... .xxx = %d (reserved flags nonzero)",
			slp->flags & 7);
	    }
	    /* end of flags */

	    sprintf(get_line(0, 0), "Dialect = %u", slp->dialect);
	    sprintf(get_line(0, 0), "Language = 0x%02x%02x, %c%c",
		    slp->language[0], slp->language[1],
		    slp->language[0], slp->language[1]);
	    v1_charset = ntohs(slp->charset);
	    sprintf(get_line(0, 0), "Character encoding = %u, %s",
		    v1_charset,
		    slpv1_charset(v1_charset));
	    sprintf(get_line(0, 0), "XID = %u", ntohs(slp->xid));

	    /* set msglength to remaining length of SLP message */
	    msglength -= sizeof (*slp);
	    p += sizeof (*slp);
	}

	return (1);
}
コード例 #23
0
ファイル: snoop_igmp.c プロジェクト: AlainODea/illumos-gate
/*ARGSUSED*/
void
interpret_igmp(int flags, char *data, int iplen, int ilen)
{
	const char *pt;
	char *line;
	struct igmp *igmp = (struct igmp *)data;
	char addrstr[INET_ADDRSTRLEN];

	if (ilen < IGMP_MINLEN) {
		/* incomplete header */
		line = get_sum_line();
		(void) snprintf(line, MAXLINE, "Malformed IGMP packet");
		return;
	}

	switch (igmp->igmp_type) {
	case IGMP_MEMBERSHIP_QUERY:
		if (ilen == IGMP_MINLEN) {
			if (igmp->igmp_code == 0)
				pt = "v1 membership query";
			else
				pt = "v2 membership query";
		} else if (ilen >= IGMP_V3_QUERY_MINLEN) {
			pt = "v3 membership query";
		} else {
			pt = "Unknown membership query";
		}
		break;
	case IGMP_V1_MEMBERSHIP_REPORT:
		pt = "v1 membership report";
		break;
	case IGMP_V2_MEMBERSHIP_REPORT:
		pt = "v2 membership report";
		break;
	case IGMP_V3_MEMBERSHIP_REPORT:
		pt = "v3 membership report";
		break;
	case IGMP_V2_LEAVE_GROUP:
		pt = "v2 leave group";
		break;

	default:
		pt = "Unknown";
		break;
	}

	if (flags & F_SUM) {
		line = get_sum_line();
		(void) snprintf(line, MAXLINE, "IGMP %s", pt);
	}

	if (flags & F_DTAIL) {
		show_header("IGMP:  ", "IGMP Header", ilen);
		show_space();
		(void) snprintf(get_line(0, 0), get_line_remain(),
		    "Type = %d (%s)", igmp->igmp_type, pt);
		(void) snprintf(get_line(0, 0), get_line_remain(),
		    "Max Response Time = %d", igmp->igmp_code);
		(void) snprintf(get_line(0, 0), get_line_remain(),
		    "Checksum = %x", ntohs(igmp->igmp_cksum));

		if (igmp->igmp_type == IGMP_MEMBERSHIP_QUERY &&
		    ilen >= IGMP_V3_QUERY_MINLEN) {
			interpret_igmpv3qry(igmp, ilen);
		} else if (igmp->igmp_type == IGMP_V3_MEMBERSHIP_REPORT) {
			interpret_igmpv3rpt(igmp, ilen);
		} else {
			(void) snprintf(get_line(0, 0), get_line_remain(),
			    "Group = %s",
			    inet_ntop(AF_INET, &igmp->igmp_group.s_addr,
			    addrstr, INET_ADDRSTRLEN));
		}

		show_space();
	}
}
コード例 #24
0
ファイル: snoop_mip.c プロジェクト: AlainODea/illumos-gate
void
interpret_mip_cntrlmsg(int flags, uchar_t *msg, int fraglen) {
	char		*pt, *pc = NULL;
	char		*line;
	regreq_t	rreq[1];
	regrep_t	rrep[1];
	int		regext_size;
	uchar_t		*regext_data;
	struct in_addr	addr_temp;


	/* First byte of the message should be the type */
	switch (*msg) {
	case REG_TYPE_REQ:
		if (fraglen < sizeof (regreq_t))
			return;
		pt = (flags & F_DTAIL ? "registration request ":"reg rqst ");

		(void) memcpy(rreq, msg, sizeof (*rreq));
		regext_size = fraglen - sizeof (regreq_t);
		regext_data = msg + sizeof (*rreq);
		break;
	case REG_TYPE_REP:
		if (fraglen < sizeof (regrep_t))
			return;
		pt = (flags & F_DTAIL ? "registration reply ":"reg reply ");

		(void) memcpy(rrep, msg, sizeof (*rrep));
		regext_size = fraglen - sizeof (regrep_t);
		regext_data = msg + sizeof (*rrep);

		switch (rrep->code) {
		case  REPLY_CODE_ACK:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL)) ?
			    "OK" : "OK code 0";
			break;
		case  REPLY_CODE_ACK_NO_SIMULTANEOUS:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "OK simultaneous bindings" : "OK code 1";
			break;
		case  REPLY_CODE_FA_NACK_UNSPECIFIED:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: unspecified":"FA denial: code 64";
			break;
		case  REPLY_CODE_FA_NACK_PROHIBITED:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: prohibited":"FA denial: code 65";
			break;
		case  REPLY_CODE_FA_NACK_RESOURCES:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: no resources":"FA denial: code 66";
			break;
		case  REPLY_CODE_FA_NACK_MN_AUTH:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: MN auth failed":"FA denial: code 67";
			break;
		case  REPLY_CODE_FA_NACK_HA_AUTH:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: HA auth failed":
			    "FA denial: code 68";
			break;
		case  REPLY_CODE_FA_NACK_LIFETIME:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: lifetime":"FA denial: code 69";
			break;
		case  REPLY_CODE_FA_NACK_BAD_REQUEST:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: bad request": "FA: code 70";
			break;
		case  REPLY_CODE_FA_NACK_BAD_REPLY:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: bad Reply":"FA denial: code 71";
			break;
		case  REPLY_CODE_FA_NACK_ENCAP_UNAVAILABLE:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: encapsulation":"FA denial: code 72";
			break;
		case  REPLY_CODE_FA_NACK_VJ_UNAVAILABLE:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: VJ compression":"FA denial: code 73";
			break;
		case  REPLY_CODE_FA_NACK_BIDIR_TUNNEL_UNAVAILABLE:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: reverse tunnel unavailable":
				"FA denial: code 74";
			break;
		case  REPLY_CODE_FA_NACK_BIDIR_TUNNEL_NO_TBIT:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: reverse tunnel: missing T-bit":
				"FA denial: code 75";
			break;
		case  REPLY_CODE_FA_NACK_BIDIR_TUNNEL_TOO_DISTANT:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: reverse tunnel: too distant":
				"FA denial: code 76";
			break;
		case  REPLY_CODE_FA_NACK_ICMP_HA_NET_UNREACHABLE:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: home network unreachable":
			    "FA denial: code 80";
			break;
		case  REPLY_CODE_FA_NACK_ICMP_HA_HOST_UNREACHABLE:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: HA host unreachable":
			    "FA denial: code 81";
			break;
		case  REPLY_CODE_FA_NACK_ICMP_HA_PORT_UNREACHABLE:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: HA port unreachable":
			    "FA denial: code 82";
			break;
		case  REPLY_CODE_FA_NACK_ICMP_HA_UNREACHABLE:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: HA unreachable":"FA denial: code 88";
			break;
		case REPLY_CODE_FA_NACK_UNIQUE_HOMEADDR_REQD:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: Unique Home Addr Required":
				"FA denial: code 96";
			break;
		case REPLY_CODE_FA_NACK_MISSING_NAI:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: Missing NAI":
				"FA denial: code 97";
			break;
		case REPLY_CODE_FA_NACK_MISSING_HOME_AGENT:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: Missing Home Agent":
				"FA denial: code 98";
			break;
		case REPLY_CODE_FA_NACK_UNKNOWN_CHALLENGE:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: Unknown Challenge":
				"FA denial: code 104";
			break;
		case REPLY_CODE_FA_NACK_MISSING_CHALLENGE:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: Missing Challenge":
				"FA denial: code 105";
			break;
		case REPLY_CODE_FA_NACK_MISSING_MN_FA:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "FA denial: Missing Mobile-Foreign Key Extension":
				"FA denial: code 106";
			break;
		case  REPLY_CODE_HA_NACK_UNSPECIFIED:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "HA denial: unspecified":"HA denial: code 128";
			break;
		case  REPLY_CODE_HA_NACK_PROHIBITED:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "HA denial: prohibited":"HA denial: code 129";
			break;
		case  REPLY_CODE_HA_NACK_RESOURCES:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "HA denial: no resources":"HA denial: code 130";
			break;
		case  REPLY_CODE_HA_NACK_MN_AUTH:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "HA denial: MN auth failed":"HA denial: code 131";
			break;
		case  REPLY_CODE_HA_NACK_FA_AUTH:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "HA denial: FA auth failed":"HA denial: code 132";
			break;
		case  REPLY_CODE_HA_NACK_ID_MISMATCH:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "HA denial: ID mismatch":"HA denial: code 133";
			break;
		case  REPLY_CODE_HA_NACK_BAD_REQUEST:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "HA denial: bad request":"HA denial: code 134";
			break;
		case  REPLY_CODE_HA_NACK_TOO_MANY_BINDINGS:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "HA denial: too many bindings":
			    "HA denial: code 135";
			break;
		case  REPLY_CODE_HA_NACK_BAD_HA_ADDRESS:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "HA denial: bad HA address":"HA denial: code 136";
			break;
		case  REPLY_CODE_HA_NACK_BIDIR_TUNNEL_UNAVAILABLE:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "HA denial: no reverse tunnel":
			    "HA denial: code 137";
			break;
		case  REPLY_CODE_HA_NACK_BIDIR_TUNNEL_NO_TBIT:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "HA denial: reverse tunnel: no T-bit":
			    "HA denial: code 138";
			break;
		case  REPLY_CODE_HA_NACK_BIDIR_ENCAP_UNAVAILABLE:
			pc = ((flags & F_ALLSUM) || (flags & F_DTAIL))?
			    "HA denial: encapsulation unavailable":
			    "HA denial: code 139";
			break;
		default:
			pc = "?";
			break;
		}
		break;

	default :
		break;
	}
	if (flags & F_SUM) {
		line = get_sum_line();

		if (pc != NULL)
			(void) sprintf(line, "Mobile IP %s(%s)", pt, pc);
		else
			(void) sprintf(line, "Mobile IP %s", pt);
	}

	if (flags & F_DTAIL) {
		show_header("MIP:  ", "Mobile IP Header", fraglen);
		show_space();

		if (*msg == REG_TYPE_REQ) {
			(void) sprintf(get_line((char *)&rreq -
			    dlc_header, 1), "Registration header type = %s",
			    pt);
			(void) sprintf(get_line(
			    (char *)(((uchar_t *)&rreq) + 1) - dlc_header, 1),
			    "%d... .... = %s simultaneous bindings  ",
			    (rreq->Simultaneous_registration == 1)? 1 : 0,
			    (rreq->Simultaneous_registration == 1)? "":"no");
			(void) sprintf(get_line(
			    (char *)(((uchar_t *)&rreq) + 1) - dlc_header, 1),
			    ".%d.. .... = %s broadcast datagrams ",
			    (rreq->Broadcasts_desired == 1) ?  1 : 0,
			    (rreq->Broadcasts_desired == 1) ? "":"no");
			(void) sprintf(get_line(
			    (char *)(((uchar_t *)&rreq) + 1) - dlc_header, 1),
			    "..%d. .... = %s decapsulation by MN",
			    (rreq->Decapsulation_done_locally == 1) ? 1 : 0,
			    (rreq->Decapsulation_done_locally == 1) ?
				"" : "no");
			(void) sprintf(get_line(
			    (char *)(((uchar_t *)&rreq) + 1) - dlc_header, 1),
			    "...%d .... = %s minimum encapsulation ",
			    (rreq->Minimal_encap_desired == 1) ? 1 : 0,
			    (rreq->Minimal_encap_desired == 1) ? "" : "no");
			(void) sprintf(get_line(
			    (char *)(((uchar_t *)&rreq) + 1) - dlc_header, 1),
			    ".... %d... = %s GRE encapsulation ",
			    (rreq->GRE_encap_desired == 1) ? 1 : 0,
			    (rreq->GRE_encap_desired == 1) ? "" : "no");
			(void) sprintf(get_line(
			    (char *)(((uchar_t *)&rreq) + 1) - dlc_header, 1),
			    ".... .%d.. = %s VJ hdr Compression ",
			    (rreq->VJ_compression_desired == 1) ? 1 : 0,
			    (rreq->VJ_compression_desired == 1) ? "" : "no");
			(void) sprintf(get_line(
			    (char *)(((uchar_t *)&rreq) + 1) - dlc_header, 1),
			    ".... ..%d. = %s reverse tunnel",
			    (rreq->BiDirectional_Tunnel_desired == 1) ? 1 : 0,
			    (rreq->BiDirectional_Tunnel_desired == 1) ?
				"" : "no");
			if (ntohs(rreq->lifetime) == 0xffff) {
				(void) sprintf(get_line(
				    (char *)&rreq->lifetime - dlc_header, 1),
				    "Life Time = 0xFFFF (infinity)");
			} else if (ntohs(rreq->lifetime) == 0) {
				(void) sprintf(get_line(
				    (char *)&rreq->lifetime - dlc_header, 1),
				    "Life Time = 0 "
				    "(request for de-registration)");
			} else {
				(void) sprintf(get_line(
				    (char *)&rreq->lifetime - dlc_header, 1),
				    "Life time = %d seconds",
				    ntohs(rreq->lifetime));
			}
			addr_temp.s_addr = rreq->home_addr;
			(void) sprintf(get_line(
			    (char *)&rreq->home_addr - dlc_header, 1),
			    "Home address = %s, %s",
			    inet_ntoa(addr_temp),
			    addrtoname(AF_INET, &addr_temp));
			addr_temp.s_addr = rreq->home_agent_addr;
			(void) sprintf(get_line(
			    (char *)&rreq->home_agent_addr - dlc_header, 1),
			    "Home Agent address = %s, %s",
			    inet_ntoa(addr_temp),
			    addrtoname(AF_INET, &addr_temp));
			addr_temp.s_addr = rreq->care_of_addr;
			(void) sprintf(get_line(
			    (char *)&rreq->care_of_addr - dlc_header, 1),
			    "Care of address = %s, %s",
			    inet_ntoa(addr_temp),
			    addrtoname(AF_INET, &addr_temp));
			(void) sprintf(get_line(
			    (char *)&rreq->identification - dlc_header, 1),
			    "Identification = 0x%x-%x",
			    ntohl(rreq->identification.high_bits),
			    ntohl(rreq->identification.low_bits));
		} else if (*msg == REG_TYPE_REP) {
			(void) sprintf(
			    get_line((char *)&rrep->type - dlc_header, 1),
			    "Registration header type = %d (%s)",
			    (int)rrep->type, pt);
			(void) sprintf(get_line((char *)&rrep - dlc_header, 1),
			    "Code = %d %s", (int)rrep->code, pc);
			if (ntohs(rrep->lifetime) == 0xffff) {
				(void) sprintf(get_line(
				    (char *)&rrep->lifetime - dlc_header, 1),
				    "Life time = 0xFFFF (infinity)");
			} else if (ntohs(rrep->lifetime) == 0) {
				(void) sprintf(get_line(
				    (char *)&rrep->lifetime - dlc_header, 1),
				    ((rrep->code == REPLY_CODE_ACK) ||
				    (rrep->code ==
					REPLY_CODE_ACK_NO_SIMULTANEOUS))?
				    "Life time = 0 (de-registeration success)" :
				    "Life time = 0 (de-registration failed)");
			} else {
				(void) sprintf(get_line(
				    (char *)&rrep->lifetime - dlc_header, 1),
				    "Life time = %d seconds",
				    ntohs(rrep->lifetime));
			}
			addr_temp.s_addr = rrep->home_addr;
			(void) sprintf(
			    get_line((char *)&rrep->home_addr - dlc_header, 1),
			    "Home address = %s, %s",
			    inet_ntoa(addr_temp),
			    addrtoname(AF_INET, &addr_temp));
			addr_temp.s_addr = rrep->home_agent_addr;
			(void) sprintf(get_line(
			    (char *)&rrep->home_agent_addr - dlc_header, 1),
			    "Home Agent address = %s, %s",
			    inet_ntoa(addr_temp),
			    addrtoname(AF_INET, &addr_temp));
			(void) sprintf(get_line(
			    (char *)&rrep->identification - dlc_header, 1),
			    "Identification = 0x%x-%x",
			    ntohl(rrep->identification.high_bits),
			    ntohl(rrep->identification.low_bits));
		}
		fraglen = interpret_extensions(regext_data, regext_size, REG);
	}
}
コード例 #25
0
ファイル: snoop_slp.c プロジェクト: jasonbking/illumos-gate
static int v2_header(int flags,
			struct slpv2_hdr *slp,
			int *totallen,
			int fraglen) {
	extern int curr_proto, dst_port;
	char *prototag = (curr_proto == IPPROTO_TCP ? "/tcp" : "");

	if ((slp->flags & V2_OVERFLOW) == V2_OVERFLOW)
	    overflow = B_TRUE;

	/* summary mode header parsing */
	if (flags & F_SUM) {

	    /* make sure we have at least a header */
	    if (msglength < sizeof (*slp)) {
		sprintf(get_sum_line(), "SLP V2 [Incomplete Header]");
		return (0);
	    }

	    sprintf(msgbuf, "SLP V2 %s [%d%s] ",
		    slpv2_func(slp->function, B_TRUE),
		    ntohs(slp->xid), prototag);

	    /* skip to end of header */
	    msgend = msgbuf + strlen(msgbuf);
	    msglength -= sizeof (*slp);
	    p += sizeof (*slp);

	    /* skip language tag */
	    SKIPFIELD(FIELD_DEFAULT);
	} else if (flags & F_DTAIL) {
	    char *lang;
	    int len;

	    /* detailed mode header parsing */
	    show_header("SLP:  ", "Service Location Protocol (v2)", fraglen);
	    show_space();

	    if (msglength < sizeof (*slp)) {
		sprintf(get_line(0, 0), "==> Incomplete SLP header");
		return (0);
	    }

	    sprintf(get_line(0, 0), "Version = %d", slp->vers);
	    sprintf(get_line(0, 0), "Function = %d, %s",
		    slp->function, slpv2_func(slp->function, B_FALSE));
	    get_int24(&(slp->l1));
	    *totallen = netval;
	    sprintf(get_line(0, 0), "Message length = %u", *totallen);
	    /* check for TCP continuation */
	    if (curr_proto == IPPROTO_TCP &&
		*totallen > msglength &&
		!tcp_continuation) {
		tcp_continuation = B_TRUE;
		reg_tcp_cont((char *)slp, *totallen, msglength, dst_port);
	    }

	    if (!tcp_continuation && *totallen != msglength) {
		sprintf(get_line(0, 0),
			"  (Stated and on-the-wire lengths differ)");
	    }
	    /* flags */
	    sprintf(get_line(0, 0), "Flags = 0x%02x", slp->flags);
	    sprintf(get_line(0, 0), "      %s",
		    getflag(slp->flags, V2_OVERFLOW,
			    "overflow", "no overflow"));
	    sprintf(get_line(0, 0), "      %s",
		    getflag(slp->flags, V2_FRESH,
			    "fresh registration", "no fresh registration"));
	    sprintf(get_line(0, 0), "      %s",
		    getflag(slp->flags, V2_MCAST,
			    "request multicast / broadcast", "unicast"));
	    /* check reserved flags that must be zero */
	    if ((slp->flags & 7) != 0) {
		sprintf(get_line(0, 0),
			"      .... .xxx = %d (reserved flags nonzero)",
			slp->flags & 7);
	    }
	    /* end of flags */

	    /* language tag */
	    p = (char *)slp + sizeof (*slp);
	    msglength -= sizeof (*slp);
	    GETSHORT(len);
	    if (len > msglength) {
		sprintf(get_line(0, 0),
			"Language Tag Length = %u [CORRUPT MESSAGE]",
			len);
		return (0);
	    }

	    lang = get_line(0, 0);
	    strcpy(lang, "Language Tag = ");
	    strncat(lang,  p, len);
	    sprintf(get_line(0, 0), "XID = %u", ntohs(slp->xid));

	    /* set msglength to remaining length of SLP message */
	    p += len;
	    msglength -= len;
	}

	return (1);
}
コード例 #26
0
ファイル: estwisedb.c プロジェクト: mrmckain/RefTrans
int main(int argc,char ** argv) 
{
  int i;
  char * temp;

  build_defaults();

  bootstrap_HMMer2();
  
  strip_out_standard_options(&argc,argv,show_help,show_version);

  if( (temp = strip_out_assigned_argument(&argc,argv,"gap")) != NULL )
    gap_str = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"g")) != NULL )
    gap_str = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"ext")) != NULL )
    ext_str = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"e")) != NULL )
    ext_str = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"matrix")) != NULL )
    matrix_file = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"m")) != NULL )
    matrix_file = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"s")) != NULL )
    qstart_str = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"t")) != NULL )
    qend_str = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"aln")) != NULL )
    aln_number_str = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"codon")) != NULL )
    codon_file = temp;


  if( (temp = strip_out_assigned_argument(&argc,argv,"alg")) != NULL )
    alg_str = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"aalg")) != NULL )
    aln_alg_str = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"cut")) != NULL )
    search_cutoff_str = temp;


  if( (temp = strip_out_assigned_argument(&argc,argv,"ecut")) != NULL )
    evalue_search_str = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"subs")) != NULL )
    subs_string = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"indel")) != NULL )
    indel_string = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"init")) != NULL )
    startend_string = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"alln")) != NULL )
    allN_string = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"null")) != NULL )
    null_string = temp;

  if( (strip_out_boolean_argument(&argc,argv,"dnas")) == TRUE )
    use_single_dna = TRUE;

  if( (strip_out_boolean_argument(&argc,argv,"dnadb")) == TRUE )
    use_single_dna = FALSE;

  if( (strip_out_boolean_argument(&argc,argv,"tfor")) == TRUE )
    do_forward_only = TRUE;

  if( (strip_out_boolean_argument(&argc,argv,"flati")) == TRUE )
    flat_insert = TRUE;

  if( (strip_out_boolean_argument(&argc,argv,"hmmer")) == TRUE )
    use_tsm = TRUE;

  if( (strip_out_boolean_argument(&argc,argv,"pfam2")) == TRUE )
    use_pfam1 = TRUE;

  if( (strip_out_boolean_argument(&argc,argv,"pfam")) == TRUE )
    use_pfam2 = TRUE;

  if( (strip_out_boolean_argument(&argc,argv,"protein")) == TRUE )
    use_single_pro = TRUE;

  if( (strip_out_boolean_argument(&argc,argv,"prodb")) == TRUE )
    use_db_pro = TRUE;


  if( (temp = strip_out_assigned_argument(&argc,argv,"hname")) != NULL )
    hmm_name = temp;

  if( (strip_out_boolean_argument(&argc,argv,"nohis")) != FALSE )
    show_histogram = FALSE;

  if( (strip_out_boolean_argument(&argc,argv,"pretty")) != FALSE )
    show_pretty = TRUE;

  if( (strip_out_boolean_argument(&argc,argv,"pep")) != FALSE )
    show_pep = TRUE;

  if( (strip_out_boolean_argument(&argc,argv,"mul")) != FALSE )
    make_anchored_aln = TRUE;

  if( (strip_out_boolean_argument(&argc,argv,"para")) != FALSE )
    show_para = TRUE;

  if( (strip_out_boolean_argument(&argc,argv,"sum")) != FALSE )
    show_match_sum = TRUE;

  if( (strip_out_boolean_argument(&argc,argv,"alb")) != FALSE )
    show_AlnBlock = TRUE;

  if( (strip_out_boolean_argument(&argc,argv,"pal")) != FALSE )
    show_PackAln = TRUE;

  if( (temp = strip_out_assigned_argument(&argc,argv,"divide")) != NULL )
    divide_str = temp;

  if( (temp = strip_out_assigned_argument(&argc,argv,"block")) != NULL )
    main_block_str = temp;


  if( (temp = strip_out_assigned_argument(&argc,argv,"report")) != NULL )
    report_str = temp;

  dbsi = new_DBSearchImpl_from_argv(&argc,argv);
  
  dpri = new_DPRunImpl_from_argv(&argc,argv);


  strip_out_remaining_options_with_warning(&argc,argv);
  

  if( argc !=  3 ) {
    warn("Wrong number of arguments (expect 2)!\n");
    if( argc > 1 ){
      warn("Arg line looked like (after option processing)");
      for(i=1;i<argc;i++) {
	fprintf(stderr,"   %s\n",argv[i]);
      }
    }

    show_short_help();
  }

  if( show_pretty == FALSE && show_AlnBlock == FALSE && show_PackAln == FALSE && show_pep == FALSE ) {
    show_pretty = TRUE;
    show_para = TRUE;
  }

  if( use_db_pro == FALSE && use_single_pro == FALSE && use_tsm == FALSE && use_pfam1 == FALSE && use_pfam2 == FALSE ) {
    use_single_pro = TRUE;
  }

  if( use_single_pro == TRUE || use_tsm == TRUE ) {
    if( use_single_dna == TRUE ) 
      fatal("one on one search. Shouldn't you use pcwise?");
    search_mode = PC_SEARCH_S2DB;
  } else {
    if( use_single_dna == TRUE ) 
      search_mode = PC_SEARCH_DB2S;
    else 
      search_mode = PC_SEARCH_DB2DB;
  }

  if( evalue_search_str != NULL && search_mode != PC_SEARCH_S2DB ) {
    fatal("Trying to set a evalue cutoff on a non evalue based search. you can only use evalues in a protein HMM vs DNA database search (sorry!)");
  }

  if( make_anchored_aln == TRUE && search_mode != PC_SEARCH_S2DB ) {
    fatal("Trying to make an anchored alignment and not in single search mode");
  }

  if( make_anchored_aln == TRUE) {
    do_complete_analysis = TRUE;
  }

  /* pick up remaining args and do it */

    
  dna_seq_file = argv[2];
  protein_file = argv[1];

  if( build_objects() == FALSE) 
    fatal("Could not build objects!");

  if( build_db_objects() == FALSE) 
    fatal("Could not build database-ready objects!");


  show_header(stdout);

  if( search_db() == FALSE) 
    warn("Could not search database");


  show_output();


  free_objects();


  return 0;
}
コード例 #27
0
ファイル: snoop_ipsec.c プロジェクト: alhazred/onarm
int
interpret_ah(int flags, uint8_t *hdr, int iplen, int fraglen)
{
	/* LINTED: alignment */
	ah_t *ah = (ah_t *)hdr;
	ah_t *aligned_ah;
	ah_t storage;	/* In case hdr isn't aligned. */
	char *line, *buff;
	uint_t ahlen, auth_data_len;
	uint8_t *auth_data, *data;
	int new_iplen;
	uint8_t proto;

	if (fraglen < sizeof (ah_t))
		return (fraglen);		/* incomplete header */

	if (!IS_P2ALIGNED(hdr, 4)) {
		aligned_ah = (ah_t *)&storage;
		bcopy(hdr, &storage, sizeof (ah_t));
	} else {
		aligned_ah = ah;
	}

	/*
	 * "+ 8" is for the "constant" part that's not included in the AH
	 * length.
	 *
	 * The AH RFC specifies the length field in "length in 4-byte units,
	 * not counting the first 8 bytes".  So if an AH is 24 bytes long,
	 * the length field will contain "4".  (4 * 4 + 8 == 24).
	 */
	ahlen = (aligned_ah->ah_length << 2) + 8;
	fraglen -= ahlen;
	if (fraglen < 0)
		return (fraglen + ahlen);	/* incomplete header */

	auth_data_len = ahlen - sizeof (ah_t);
	auth_data = (uint8_t *)(ah + 1);
	data = auth_data + auth_data_len;

	if (flags & F_SUM) {
		line = (char *)get_sum_line();
		(void) sprintf(line, "AH SPI=0x%x Replay=%u",
		    ntohl(aligned_ah->ah_spi), ntohl(aligned_ah->ah_replay));
		line += strlen(line);
	}

	if (flags & F_DTAIL) {
		show_header("AH:  ", "Authentication Header", ahlen);
		show_space();
		(void) sprintf(get_line((char *)&ah->ah_nexthdr - dlc_header,
		    1), "Next header = %d (%s)", aligned_ah->ah_nexthdr,
		    getproto(aligned_ah->ah_nexthdr));
		(void) sprintf(get_line((char *)&ah->ah_length - dlc_header, 1),
		    "AH length = %d (%d bytes)", aligned_ah->ah_length, ahlen);
		(void) sprintf(get_line((char *)&ah->ah_reserved - dlc_header,
		    2), "<Reserved field = 0x%x>",
		    ntohs(aligned_ah->ah_reserved));
		(void) sprintf(get_line((char *)&ah->ah_spi - dlc_header, 4),
		    "SPI = 0x%x", ntohl(aligned_ah->ah_spi));
		(void) sprintf(get_line((char *)&ah->ah_replay - dlc_header, 4),
		    "Replay = %u", ntohl(aligned_ah->ah_replay));

		/* * 2 for two hex digits per auth_data byte. */
		buff = malloc(auth_data_len * 2);
		if (buff != NULL) {
			int i;

			for (i = 0; i < auth_data_len; i++)
				sprintf(buff + i * 2, "%02x", auth_data[i]);
		}

		(void) sprintf(get_line((char *)auth_data - dlc_header,
		    auth_data_len), "ICV = %s",
		    (buff == NULL) ? "<out of memory>" : buff);

		/* malloc(3c) says I can call free even if buff == NULL */
		free(buff);

		show_space();
	}

	new_iplen = iplen - ahlen;
	proto = aligned_ah->ah_nexthdr;

	/*
	 * Print IPv6 Extension Headers, or skip them in the summary case.
	 */
	if (proto == IPPROTO_HOPOPTS || proto == IPPROTO_DSTOPTS ||
	    proto == IPPROTO_ROUTING || proto == IPPROTO_FRAGMENT) {
		(void) print_ipv6_extensions(flags, &data, &proto, &iplen,
		    &fraglen);
	}

	if (fraglen > 0)
		switch (proto) {
			case IPPROTO_ENCAP:
				/* LINTED: alignment */
				(void) interpret_ip(flags, (struct ip *)data,
				    new_iplen);
				break;
			case IPPROTO_IPV6:
				(void) interpret_ipv6(flags, (ip6_t *)data,
				    new_iplen);
				break;
			case IPPROTO_ICMP:
				(void) interpret_icmp(flags,
				    /* LINTED: alignment */
				    (struct icmp *)data, new_iplen, fraglen);
				break;
			case IPPROTO_ICMPV6:
				/* LINTED: alignment */
				(void) interpret_icmpv6(flags, (icmp6_t *)data,
				    new_iplen, fraglen);
				break;
			case IPPROTO_TCP:
				(void) interpret_tcp(flags,
				    (struct tcphdr *)data, new_iplen, fraglen);
				break;

			case IPPROTO_ESP:
				(void) interpret_esp(flags, data, new_iplen,
				    fraglen);
				break;

			case IPPROTO_AH:
				(void) interpret_ah(flags, data, new_iplen,
				    fraglen);
				break;

			case IPPROTO_UDP:
				(void) interpret_udp(flags,
				    (struct udphdr *)data, new_iplen, fraglen);
				break;
			/* default case is to not print anything else */
		}

	return (ahlen);
}
コード例 #28
0
ファイル: cmds_normal.c プロジェクト: rubenerd/sc-im
void do_normalmode(struct block * buf) {
    int bs = get_bufsize(buf);
    struct ent * e;

    switch (buf->value) {

        // Movement commands
        case 'j':
        case OKEY_DOWN:
            currow = forw_row(1)->row;
            unselect_ranges();
            update(TRUE);
            break;

        case 'k':
        case OKEY_UP:
            currow = back_row(1)->row;
            unselect_ranges();
            update(TRUE);
            break;

        case 'h':
        case OKEY_LEFT:
            curcol = back_col(1)->col;
            unselect_ranges();
            update(TRUE);
            break;

        case 'l':
        case OKEY_RIGHT:
            curcol = forw_col(1)->col;
            unselect_ranges();
            update(TRUE);
            break;

        case '0':
        case OKEY_HOME:
            curcol = left_limit()->col;
            unselect_ranges();
            update(TRUE);
            break;

        case '$':
        case OKEY_END:
            curcol = right_limit()->col;
            unselect_ranges();
            update(TRUE);
            break;

        case '^':
            currow = goto_top()->row;
            unselect_ranges();
            update(TRUE);
            break;

        case '#':
            currow = goto_bottom()->row;
            unselect_ranges();
            update(TRUE);
            break;

        // Tick
        case '\'':
            if (bs != 2) break;
            unselect_ranges();
            e = tick(buf->pnext->value);
            if (row_hidden[e->row]) {
                scerror("Cell row is hidden");
                break;
            }
            if (col_hidden[e->col]) {
                scerror("Cell column is hidden");
                break;
            }
            currow = e->row;
            curcol = e->col;
            update(TRUE);
            break;

        // CTRL j
        case ctl('j'):
            {
            int p, c = curcol, cf = curcol;
            if ( (p = is_range_selected()) != -1) {
                struct srange * sr = get_range_by_pos(p);
                c = sr->tlcol;
                cf = sr->brcol;
            }
            auto_justify(c, cf, DEFWIDTH);  // auto justificado de columnas
            update(TRUE);
            break;
            }

        // CTRL d
        case ctl('d'):                      // set date format using current locate D_FMT format
            {
        #ifdef USELOCALE
            #include <locale.h>
            #include <langinfo.h>
            char * loc = NULL;
            char * f = NULL;
            loc = setlocale(LC_TIME, "");
            if (loc != NULL) {
                f = nl_langinfo(D_FMT);
            } else {
                scerror("No locale set. Nothing changed");
            }
            int p, r = currow, c = curcol, rf = currow, cf = curcol;
            if ( (p = is_range_selected()) != -1) {
                struct srange * sr = get_range_by_pos(p);
                r = sr->tlrow;
                c = sr->tlcol;
                rf = sr->brrow;
                cf = sr->brcol;
            }
            if (any_locked_cells(r, c, rf, cf)) {
                scerror("Locked cells encountered. Nothing changed");
                return;
            }
            dateformat(lookat(r, c), lookat(rf, cf), f);
            update(TRUE);
            break;
        #else
            scinfo("Build made without USELOCALE enabled");
        #endif
            }

        // CTRL f
        case ctl('f'):
        case OKEY_PGDOWN:
            {
            int n = LINES - RESROW - 1;
            if (atoi(get_conf_value("half_page_scroll"))) n = n / 2;
            struct ent * e = forw_row(n);
            currow = e->row;
            unselect_ranges();
            scroll_down(n);
            update(TRUE);
            break;
            }

        // CTRL b
        case ctl('b'):
        case OKEY_PGUP:
            {
            int n = LINES - RESROW - 1;
            if (atoi(get_conf_value("half_page_scroll"))) n = n / 2;
            currow = back_row(n)->row;
            unselect_ranges();
            scroll_up(n);
            update(TRUE);
            break;
            }

        case 'w':
            e = go_forward();
            currow = e->row;
            curcol = e->col;
            unselect_ranges();
            update(TRUE);
            break;

        case 'b':
            e = go_backward();
            currow = e->row;
            curcol = e->col;
            unselect_ranges();
            update(TRUE);
            break;

        case '/':
            {
            char cadena[] = ":int goto ";
            int i;
            for (i=0; i<strlen(cadena); i++) {
                flush_buf(buf);
                addto_buf(buf, cadena[i]);
                exec_single_cmd(buf);
            }
            break;
            }

        case 'H':
            currow = vert_top()->row;
            unselect_ranges();
            update(TRUE);
            break;

        case 'M':
            currow = vert_middle()->row;
            unselect_ranges();
            update(TRUE);
            break;

        case 'L':
            currow = vert_bottom()->row;
            unselect_ranges();
            update(TRUE);
            break;

        case 'G': // goto end
            e = go_end();
            currow = e->row;
            curcol = e->col;
            unselect_ranges();
            update(TRUE);
            break;

        // GOTO goto
        case ctl('a'):
            e = go_home();
            curcol = e->col;
            currow = e->row;
            unselect_ranges();
            update(TRUE);
            break;

        case 'g':
            if (buf->pnext->value == '0') {                               // g0
                curcol = go_bol()->col;

            } else if (buf->pnext->value == '$') {                        // g$
                curcol = go_eol()->col;

            } else if (buf->pnext->value == 'g') {                        // gg
                e = go_home();
                curcol = e->col;
                currow = e->row;

            } else if (buf->pnext->value == 'G') {                        // gG
                e = go_end();
                currow = e->row;
                curcol = e->col;

            } else if (buf->pnext->value == 'M') {                        // gM
                curcol = horiz_middle()->col;

            } else {                                                      // gA4 (goto cell)
                (void) sprintf(interp_line, "goto %s", parse_cell_name(1, buf));
                send_to_interp(interp_line);
            }
            unselect_ranges();
            update(TRUE);
            break;

        // repeat last command
        case '.':
            copybuffer(lastcmd_buffer, buf); // nose graba en lastcmd_buffer!!
            cmd_multiplier = 1;
            exec_mult(buf, COMPLETECMDTIMEOUT);
            break;

        // enter command mode
        case ':':
            clr_header(input_win, 0);
            chg_mode(':');
#ifdef HISTORY_FILE
            add(commandline_history, "");
#endif
            print_mode(input_win);
            wrefresh(input_win);
            handle_cursor();
            inputline_pos = 0;
            break;

        // enter visual mode
        case 'v':
            chg_mode('v');
            handle_cursor();
            clr_header(input_win, 0);
            print_mode(input_win);
            wrefresh(input_win);
            start_visualmode(currow, curcol, currow, curcol);
            break;

        // INPUT COMMANDS
        case '=':
        case '\\':
        case '<':
        case '>':
            if (locked_cell(currow, curcol)) return;
            insert_edit_submode = buf->value;
            chg_mode(insert_edit_submode);
            clr_header(input_win, 0);
            print_mode(input_win);
            wrefresh(input_win);
            inputline_pos = 0;
            break;

        // EDITION COMMANDS
        // edit cell (v)
        case 'e':
            if (locked_cell(currow, curcol)) return;
            clr_header(input_win, 0);
            inputline_pos = 0;
            if (start_edit_mode(buf, 'v')) show_header(input_win);
            break;

        // edit cell (s)
        case 'E':
            if (locked_cell(currow, curcol)) return;
            clr_header(input_win, 0);
            inputline_pos = 0;
            if (start_edit_mode(buf, 's')) show_header(input_win);
            else {
                scinfo("No string value to edit");
                chg_mode('.');
                show_celldetails(input_win);
                print_mode(input_win);
                wrefresh(input_win);
            }
            break;

        // del current cell or range
        case 'x':
            del_selected_cells();
            update(TRUE);
            break;

        // format col
        case 'f':
            if (bs != 2) return;
            formatcol(buf->pnext->value);
            break;

        // mark cell or range
        case 'm':
            if (bs != 2) break;
            int p = is_range_selected();
            if (p != -1) { // mark range
                struct srange * sr = get_range_by_pos(p);
                set_range_mark(buf->pnext->value, sr);
            } else         // mark cell 
                set_cell_mark(buf->pnext->value, currow, curcol);
            modflg++;
            break;

        // copy
        case 'c':
            {
            if (bs != 2) break;
            struct mark * m = get_mark(buf->pnext->value);
            if ( m == NULL) return;
            // if m represents a range
            if ( m->row == -1 && m->col == -1) {
                srange * r = m->rng;
                yank_area(r->tlrow, r->tlcol, r->brrow, r->brcol, 'a', cmd_multiplier);
                if (paste_yanked_ents(0, 'c') == -1) {
                    scerror("Locked cells encountered. Nothing changed");
                    break;
                }

            // if m represents just one cell
            } else {
                struct ent * p = *ATBL(tbl, get_mark(buf->pnext->value)->row, get_mark(buf->pnext->value)->col);
                struct ent * n;
                int c1;

#ifdef UNDO
                create_undo_action();
#endif
                for (c1 = curcol; cmd_multiplier-- && c1 < maxcols; c1++) {
                    if ((n = * ATBL(tbl, currow, c1))) {
                        if (n->flags & is_locked)
                            continue;
                        if (! p) {
                            clearent(n);
                            continue;
                        }
                    } else {
                        if (! p) break;
                        n = lookat(currow, c1);
                    }
#ifdef UNDO
                    copy_to_undostruct(currow, c1, currow, c1, 'd');
#endif
                    copyent(n, p, currow - get_mark(buf->pnext->value)->row, c1 - get_mark(buf->pnext->value)->col, 0, 0, maxrow, maxcol, 0);

                    n->row += currow - get_mark(buf->pnext->value)->row;
                    n->col += c1 - get_mark(buf->pnext->value)->col;

                    n->flags |= is_changed;
#ifdef UNDO
                    copy_to_undostruct(currow, c1, currow, c1, 'a');
#endif
                }
#ifdef UNDO
                end_undo_action();
#endif
            }

            if (atoi(get_conf_value("autocalc"))) EvalAll();
            update(TRUE);
            break;
            }

        // repeat last goto command
        case 'n':
            go_last();
            update(TRUE);
            break;

        // range lock / unlock / valueize
        case 'r':
            {
            int p, r = currow, c = curcol, rf = currow, cf = curcol;
            if ( (p = is_range_selected()) != -1) {
                struct srange * sr = get_range_by_pos(p);
                r = sr->tlrow;
                c = sr->tlcol;
                rf = sr->brrow;
                cf = sr->brcol;
            }
            if (buf->pnext->value == 'l') {
                lock_cells(lookat(r, c), lookat(rf, cf));
            } else if (buf->pnext->value == 'u') {
                unlock_cells(lookat(r, c), lookat(rf, cf));
            } else if (buf->pnext->value == 'v') {
                valueize_area(r, c, rf, cf);
            }
            update(TRUE);
            break;
            }

        // create range with two marks
        case 'R':
            if (bs == 3) {
                create_range(buf->pnext->value, buf->pnext->pnext->value, NULL, NULL);
                update(TRUE);
            }
            break;

        // Zr Zc - Zap col or row - Show col or row - Sr Sc
        case 'Z':
        case 'S':
            {
            int rs, r = currow, c = curcol, arg = cmd_multiplier;
            struct srange * sr;
            if ( (rs = is_range_selected()) != -1) {
                sr = get_range_by_pos(rs);
                cmd_multiplier = 1;
                r = sr->tlrow;
                c = sr->tlcol;
                arg = buf->pnext->value == 'r' ? sr->brrow - sr->tlrow + 1 : sr->brcol - sr->tlcol + 1;
            }
            if (buf->value == 'Z' && buf->pnext->value == 'r') {
                hide_row(r, arg);
            } else if (buf->value == 'Z' && buf->pnext->value == 'c') {
                hide_col(c, arg);
            } else if (buf->value == 'S' && buf->pnext->value == 'r') {
                show_row(r, arg);
            } else if (buf->value == 'S' && buf->pnext->value == 'c') {
                show_col(c, arg);
            }
            cmd_multiplier = 0;
            update(TRUE);
            break;
            }

        // shift range or cell
        case 's':
            {
            int p, r = currow, c = curcol, rf = currow, cf = curcol;
            if ( (p = is_range_selected()) != -1) {
                struct srange * sr = get_range_by_pos(p);
                r = sr->tlrow;
                c = sr->tlcol;
                rf = sr->brrow;
                cf = sr->brcol;
            }
            if ( any_locked_cells(r, c, rf, cf) && (buf->pnext->value == 'h' || buf->pnext->value == 'k') ) {
                scerror("Locked cells encountered. Nothing changed");
                return;
            }
#ifdef UNDO
            create_undo_action();
#endif
            int ic = cmd_multiplier + 1;
            switch (buf->pnext->value) {
                case 'j':
                    fix_marks(  (rf - r + 1) * cmd_multiplier, 0, r, maxrow, c, cf);
#ifdef UNDO
                    save_undo_range_shift(cmd_multiplier, 0, r, c, rf + (rf-r+1) * (cmd_multiplier - 1), cf);
#endif
                    while (ic--) shift_range(ic, 0, r, c, rf, cf);
                    break;
                case 'k':
                    fix_marks( -(rf - r + 1) * cmd_multiplier, 0, r, maxrow, c, cf);
                    yank_area(r, c, rf + (rf-r+1) * (cmd_multiplier - 1), cf, 'a', cmd_multiplier); // keep ents in yanklist for sk
#ifdef UNDO
                    copy_to_undostruct(r, c, rf + (rf-r+1) * (cmd_multiplier - 1), cf, 'd');
                    save_undo_range_shift(-cmd_multiplier, 0, r, c, rf + (rf-r+1) * (cmd_multiplier - 1), cf);
#endif
                    while (ic--) shift_range(-ic, 0, r, c, rf, cf);
#ifdef UNDO
                    copy_to_undostruct(r, c, rf + (rf-r+1) * (cmd_multiplier - 1), cf, 'a');
#endif
                    break;
                case 'h':
                    fix_marks(0, -(cf - c + 1) * cmd_multiplier, r, rf, c, maxcol);
                    yank_area(r, c, rf, cf + (cf-c+1) * (cmd_multiplier - 1), 'a', cmd_multiplier); // keep ents in yanklist for sk
#ifdef UNDO
                    copy_to_undostruct(r, c, rf, cf + (cf-c+1) * (cmd_multiplier - 1), 'd');
                    save_undo_range_shift(0, -cmd_multiplier, r, c, rf, cf + (cf-c+1) * (cmd_multiplier - 1));
#endif
                    while (ic--) shift_range(0, -ic, r, c, rf, cf);
#ifdef UNDO
                    copy_to_undostruct(r, c, rf, cf + (cf-c+1) * (cmd_multiplier - 1), 'a');
#endif
                    break;
                case 'l':
                    fix_marks(0,  (cf - c + 1) * cmd_multiplier, r, rf, c, maxcol);
#ifdef UNDO
                    save_undo_range_shift(0, cmd_multiplier, r, c, rf, cf + (cf-c+1) * (cmd_multiplier - 1));
#endif
                    while (ic--) shift_range(0, ic, r, c, rf, cf);
                    break;
            }
#ifdef UNDO
            end_undo_action();
#endif
            cmd_multiplier = 0;
            unselect_ranges();
            update(TRUE);
            break;
            }

        // delete row or column, or selected cell or range
        case 'd':
            {
            if (bs != 2) return;
            int ic = cmd_multiplier; // orig

            if (buf->pnext->value == 'r') {
                if (any_locked_cells(currow, 0, currow + cmd_multiplier, maxcol)) {
                    scerror("Locked cells encountered. Nothing changed");
                    return;
                }
#ifdef UNDO
                create_undo_action();
                copy_to_undostruct(currow, 0, currow + ic - 1, maxcol, 'd');
                save_undo_range_shift(-ic, 0, currow, 0, currow - 1 + ic, maxcol);
#endif
                fix_marks(-ic, 0, currow + ic - 1, maxrow, 0, maxcol);
                yank_area(currow, 0, currow - 1 + cmd_multiplier, maxcol, 'r', ic);
                while (ic--) deleterow();
#ifdef UNDO
                copy_to_undostruct(currow, 0, currow - 1 + cmd_multiplier, maxcol, 'a');
                end_undo_action();
#endif
                if (cmd_multiplier > 0) cmd_multiplier = 0;

            } else if (buf->pnext->value == 'c') {
                if (any_locked_cells(0, curcol, maxrow, curcol + cmd_multiplier)) {
                    scerror("Locked cells encountered. Nothing changed");
                    return;
                }
#ifdef UNDO
                create_undo_action();
                copy_to_undostruct(0, curcol, maxrow, curcol - 1 + ic, 'd');
                save_undo_range_shift(0, -ic, 0, curcol, maxrow, curcol - 1 + ic);
#endif
                fix_marks(0, -ic, 0, maxrow,  curcol - 1 + ic, maxcol);
                yank_area(0, curcol, maxrow, curcol + cmd_multiplier - 1, 'c', ic);
                while (ic--) deletecol();
#ifdef UNDO
                copy_to_undostruct(0, curcol, maxrow, curcol + cmd_multiplier - 1, 'a');
                end_undo_action();
#endif
                if (cmd_multiplier > 0) cmd_multiplier = 0;

            } else if (buf->pnext->value == 'd') {
                del_selected_cells(); 
            }
            update(TRUE);
            break;
            }

        // insert row or column
        case 'i':
            {
            if (bs != 2) return;
#ifdef UNDO
            create_undo_action();
#endif
            if (buf->pnext->value == 'r') {
#ifdef UNDO
                save_undo_range_shift(1, 0, currow, 0, currow, maxcol);
#endif
                fix_marks(1, 0, currow, maxrow, 0, maxcol);
                insert_row(0);

            } else if (buf->pnext->value == 'c') {
#ifdef UNDO
                save_undo_range_shift(0, 1, 0, curcol, maxrow, curcol);
#endif
                fix_marks(0, 1, 0, maxrow, curcol, maxcol);
                insert_col(0);
            }
#ifdef UNDO
            end_undo_action();
#endif
            update(TRUE);
            break;
            }

        case 'y':
            // yank row
            if ( bs == 2 && buf->pnext->value == 'r') {
                yank_area(currow, 0, currow + cmd_multiplier - 1, maxcol, 'r', cmd_multiplier);
                if (cmd_multiplier > 0) cmd_multiplier = 0;

            // yank col
            } else if ( bs == 2 && buf->pnext->value == 'c') {
                yank_area(0, curcol, maxrow, curcol + cmd_multiplier - 1, 'c', cmd_multiplier);
                if (cmd_multiplier > 0) cmd_multiplier = 0;

            // yank cell
            } else if ( bs == 2 && buf->pnext->value == 'y' && is_range_selected() == -1) {
                yank_area(currow, curcol, currow, curcol, 'e', cmd_multiplier);

            // yank range
            } else if ( bs == 1 && is_range_selected() != -1) {
                srange * r = get_selected_range();
                yank_area(r->tlrow, r->tlcol, r->brrow, r->brcol, 'a', cmd_multiplier);
            }
            break;

        // paste cell below or left
        case 'p':
            if (paste_yanked_ents(0, 'a') == -1) {
                scerror("Locked cells encountered. Nothing changed");
                break;
            }
            update(TRUE);
            break;

        case 'P':
        case 'T':
            if (bs != 2) break;
            if (buf->pnext->value == 'v' || buf->pnext->value == 'f' || buf->pnext->value == 'c') {
                int res = buf->value == 'P' ? paste_yanked_ents(0, buf->pnext->value) : paste_yanked_ents(1, buf->pnext->value); // paste cell above or right
                if (res == -1) {
                    scerror("Locked cells encountered. Nothing changed");
                    break;
                }
                update(TRUE);
            }
            break;

        // paste cell above or right
        case 't':
            if (paste_yanked_ents(1, 'a') == -1) {
                scerror("Locked cells encountered. Nothing changed");
                break;
            }
            update(TRUE);
            break;

        // select inner range - Vir
        case 'V':
            if (buf->value == 'V' && bs == 3 &&
            buf->pnext->value == 'i' && buf->pnext->pnext->value == 'r') {
                int tlrow = currow;
                int brrow = currow;
                int tlcol = curcol;
                int brcol = curcol;
                int * tlr = &tlrow;
                int * brr = &brrow;
                int * tlc = &tlcol;
                int * brc = &brcol;
                select_inner_range(tlr, tlc, brr, brc);
                start_visualmode(*tlr, *tlc, *brr, *brc);
            }
            break;

        // autojus
        case 'a':
            if ( bs != 2 ) break;

            if (buf->pnext->value == 'a') {
                int p, r = currow, c = curcol, rf = currow, cf = curcol;
                if ( (p = is_range_selected()) != -1) {
                    struct srange * sr = get_range_by_pos(p);
                    r = sr->tlrow;
                    c = sr->tlcol;
                    rf = sr->brrow;
                    cf = sr->brcol;
                }
                if (any_locked_cells(r, c, rf, cf)) {
                    scerror("Locked cells encountered. Nothing changed");
                    return;
                }
                char cline [BUFFERSIZE];
                sprintf(cline, "autojus %s:", coltoa(c));
                sprintf(cline + strlen(cline), "%s", coltoa(cf));
                send_to_interp(cline);
                update(TRUE);
            }
            break;

        // scroll
        case 'z':
            if ( bs != 2 ) break;
            int scroll = 0;

            switch (buf->pnext->value) {
                case 'l':
                    scroll_right(1);
                    //unselect_ranges();
                    break;

                case 'h':
                    scroll_left(1);
                    //unselect_ranges();
                    break;

                case 'H':
                    scroll = calc_offscr_sc_cols();
                    if (atoi(get_conf_value("half_page_scroll"))) scroll /= 2;
                    scroll_left(scroll);
                    //unselect_ranges();
                    break;

                case 'L':
                    scroll = calc_offscr_sc_cols();
                    if (atoi(get_conf_value("half_page_scroll"))) scroll /= 2;
                    scroll_right(scroll);
                    //unselect_ranges();
                    break;

                case 'm':
                    ;
                    int i = 0, c = 0, ancho = rescol;
                    offscr_sc_cols = 0;

                    for (i = 0; i < curcol; i++) {
                        for (c = i; c < curcol; c++) {
                            if (!col_hidden[c]) ancho += fwidth[c];
                            if (ancho >= (COLS - rescol)/ 2) {
                                ancho = rescol;
                                break;
                            } 
                        }
                        if (c == curcol) break;
                    }
                    offscr_sc_cols = i;
                    break;

                case 'z':
                case '.':
                case 't':
                case 'b':
                    if (buf->pnext->value == 'z' || buf->pnext->value == '.')
                        scroll = currow - offscr_sc_rows + LINES - RESROW - 2 - (LINES - RESROW - 2)/2; // zz
                    else if (buf->pnext->value == 't')
                        scroll = currow - offscr_sc_rows + 1;
                    else if (buf->pnext->value == 'b')
                        scroll = currow - offscr_sc_rows - LINES + RESROW + 2;

                    if (scroll > 0)
                        scroll_down(scroll);
//                    else if (scroll > offscr_sc_rows)
//                        scroll_up(-scroll);
                    else if (scroll < 0)
                        scroll_up(-scroll);
//                    else if (offscr_sc_rows > 0)
//                        scroll_up(offscr_sc_rows);
                    break;

            }
            update(TRUE);
            break;

        // scroll up a line
        case ctl('y'):
            scroll_up(1);
            update(TRUE);
            break;

        // scroll down a line
        case ctl('e'):
            scroll_down(1);
            update(TRUE);
            break;

        // undo
        case 'u':
            #ifdef UNDO
            do_undo();
            // sync_refs();
            EvalAll();
            update(TRUE);
            break;
            #else
            scerror("Build was done without UNDO support");
            #endif

        // redo
        case ctl('r'):
            #ifdef UNDO
            do_redo();
            // sync_refs();
            EvalAll();
            update(TRUE);
            break;
            #else
            scerror("Build was done without UNDO support");
            #endif

        case '{': // left align
        case '}': // right align
        case '|': // center align
            {
            int p, r = currow, c = curcol, rf = currow, cf = curcol;
            struct srange * sr;
            if ( (p = is_range_selected()) != -1) {
                sr = get_range_by_pos(p);
                r = sr->tlrow;
                c = sr->tlcol;
                rf = sr->brrow;
                cf = sr->brcol;
            }
            if (any_locked_cells(r, c, rf, cf)) {
                scerror("Locked cells encountered. Nothing changed");
                return;
            }
#ifdef UNDO
            create_undo_action();
#endif
            if (buf->value == '{')      sprintf(interp_line, "leftjustify %s", v_name(r, c));
            else if (buf->value == '}') sprintf(interp_line, "rightjustify %s", v_name(r, c));
            else if (buf->value == '|') sprintf(interp_line, "center %s", v_name(r, c));
            if (p != -1) sprintf(interp_line + strlen(interp_line), ":%s", v_name(rf, cf));
#ifdef UNDO
            copy_to_undostruct(r, c, rf, cf, 'd');
#endif
            send_to_interp(interp_line);
#ifdef UNDO
            copy_to_undostruct(r, c, rf, cf, 'a');
            end_undo_action();
#endif
            cmd_multiplier = 0;
            update(TRUE);
            break;
            }

        case ctl('l'):
            /*
            endwin();
            start_screen();
            clearok(stdscr, TRUE);
            update(TRUE);
            flushinp();
            show_header(input_win);
            show_celldetails(input_win);
            wrefresh(input_win);
            update(TRUE);
            */
            winchg();
            break;

        case '@':
            EvalAll();
            update(TRUE);
            break;

        // increase or decrease numeric value of cell or range
        case '-':
        case '+':
            {
            int r, c, tlrow = currow, tlcol = curcol, brrow = currow, brcol = curcol;
            if ( is_range_selected() != -1 ) {
                struct srange * sr = get_selected_range();
                tlrow = sr->tlrow;
                tlcol = sr->tlcol;
                brrow = sr->brrow;
                brcol = sr->brcol;
            }
            if (any_locked_cells(tlrow, tlcol, brrow, brcol)) {
                scerror("Locked cells encountered. Nothing changed");
                return;
            }
            if (atoi(get_conf_value("numeric")) == 1) goto numeric;
            struct ent * p;
#ifdef UNDO
            create_undo_action();
#endif
            int arg = cmd_multiplier;
            int mf = modflg; // keep original modflg
            for (r = tlrow; r <= brrow; r++) {
                for (c = tlcol; c <= brcol; c++) {
                    p = *ATBL(tbl, r, c);
                    if ( ! p )  {
                        continue;
                    } else if (p->expr && !(p->flags & is_strexpr)) {
                        //scerror("Can't increment / decrement a formula");
                        continue;
                    } else if (p->flags & is_valid) {
#ifdef UNDO
                        copy_to_undostruct(r, c, r, c, 'd');
#endif
                        p->v += buf->value == '+' ? (double) arg : - 1 * (double) arg;
#ifdef UNDO
                        copy_to_undostruct(r, c, r, c, 'a');
#endif
                        if (mf == modflg) modflg++; // increase just one time
                    }
                }
            }
#ifdef UNDO
            end_undo_action();
#endif
            if (atoi(get_conf_value("autocalc"))) EvalAll();
            cmd_multiplier = 0;
            update(TRUE);
            }
            break;

        // input of numbers
        default:
        numeric:
            if ( (isdigit(buf->value) || buf->value == '-' || buf->value == '+') &&
                atoi(get_conf_value("numeric")) ) {
                insert_edit_submode='=';
                chg_mode(insert_edit_submode);
                inputline_pos = 0;
                ins_in_line(buf->value);
                show_header(input_win);
            }
    }
    return;
}
コード例 #29
0
ファイル: snoop_smb.c プロジェクト: AlainODea/illumos-gate
/*
 * This is called by snoop_netbios.c.
 * This is the external entry point.
 */
void
interpret_smb(int flags, uchar_t *data, int len)
{
	struct smb *smb;
	struct decode *decoder;
	char xtra[MAXLINE];
	ushort_t smb_flags2;
	void (*func)(int, uchar_t *, int, char *, int);

	if (len < sizeof (struct smb))
		return;

	smb = (struct smb *)data;
	decoder = &SMBtable[smb->com & 255];
	smb_flags2 = get2(smb->flags2);
	xtra[0] = '\0';

	/*
	 * SMB Header description
	 * [X/Open-SMB, Sec. 5.1]
	 */
	if (flags & F_DTAIL) {
		show_header("SMB:  ", "SMB Header", len);
		show_space();

		if (smb->flags & SERVER_RESPONSE)
			show_line("SERVER RESPONSE");
		else
			show_line("CLIENT REQUEST");

		if (decoder->name)
			show_printf("Command code = 0x%x (SMB%s)",
			    smb->com, decoder->name);
		else
			show_printf("Command code = 0x%x", smb->com);

		/*
		 * NT status or error class/code
		 * [X/Open-SMB, Sec. 5.6]
		 */
		if (smb_flags2 & FLAGS2_NT_STATUS) {
			show_printf("NT Status = %x", get4(smb->err));
		} else {
			/* Error classes [X/Open-SMB, Sec. 5.6] */
			show_printf("Error class/code = %d/%d",
			    smb->err[0], get2(&smb->err[2]));
		}

		show_printf("Flags summary = 0x%.2x", smb->flags);
		show_printf("Flags2 summary = 0x%.4x", smb_flags2);
		show_printf("Tree ID  (TID) = 0x%.4x", get2(smb->tid));
		show_printf("Proc. ID (PID) = 0x%.4x", get2(smb->pid));
		show_printf("User ID  (UID) = 0x%.4x", get2(smb->uid));
		show_printf("Mux. ID  (MID) = 0x%.4x", get2(smb->mid));
		show_space();
	}

	if ((func = decoder->func) == NULL)
		func = interpret_default;
	(*func)(flags, (uchar_t *)data, len, xtra, sizeof (xtra));

	if (flags & F_SUM) {
		char *p;
		int sz, tl;

		/* Will advance p and decr. sz */
		p = get_sum_line();
		sz = MAXLINE;

		/* Call or Reply */
		if (smb->flags & SERVER_RESPONSE)
			tl = snprintf(p, sz, "SMB R");
		else
			tl = snprintf(p, sz, "SMB C");
		p += tl;
		sz -= tl;

		/* The name, if known, else the cmd code */
		if (decoder->name) {
			tl = snprintf(p, sz, " Cmd=SMB%s", decoder->name);
		} else {
			tl = snprintf(p, sz, " Cmd=0x%02X", smb->com);
		}
		p += tl;
		sz -= tl;

		/*
		 * The "extra" (cmd-specific summary).
		 * If non-null, has leading blank.
		 */
		if (xtra[0] != '\0') {
			tl = snprintf(p, sz, "%s", xtra);
			p += tl;
			sz -= tl;
		}

		/*
		 * NT status or error class/code
		 * [X/Open-SMB, Sec. 5.6]
		 *
		 * Only show for response, not call.
		 */
		if (smb->flags & SERVER_RESPONSE) {
			if (smb_flags2 & FLAGS2_NT_STATUS) {
				uint_t status = get4(smb->err);
				snprintf(p, sz, " Status=0x%x", status);
			} else {
				uchar_t errcl = smb->err[0];
				ushort_t code = get2(&smb->err[2]);
				snprintf(p, sz, " Error=%d/%d", errcl, code);
			}
		}
	}

	if (flags & F_DTAIL)
		show_trailer();
}
コード例 #30
0
ファイル: snoop_udp.c プロジェクト: AlainODea/illumos-gate
int
interpret_udp(int flags, struct udphdr *udp, int iplen, int fraglen)
{
	char *data;
	int udplen;
	int sunrpc;
	char *pname;
	char buff [32];

	if (fraglen < sizeof (struct udphdr))
		return (fraglen);	/* incomplete header */

	data = (char *)udp + sizeof (struct udphdr);
	udplen = ntohs((ushort_t)udp->uh_ulen) - sizeof (struct udphdr);
	fraglen -= sizeof (struct udphdr);
	if (fraglen > udplen)
		fraglen = udplen;

	if (flags & F_SUM) {
		(void) sprintf(get_sum_line(),
			"UDP D=%d S=%d LEN=%d",
			ntohs(udp->uh_dport),
			ntohs(udp->uh_sport),
			ntohs((ushort_t)udp->uh_ulen));
	}

	sunrpc = !reservedport(IPPROTO_UDP, ntohs(udp->uh_dport)) &&
		!reservedport(IPPROTO_UDP, ntohs(udp->uh_sport)) &&
		valid_rpc(data, udplen);

	if (flags & F_DTAIL) {
		show_header("UDP:  ", "UDP Header", udplen);
		show_space();
		(void) sprintf(get_line((char *)(uintptr_t)udp->uh_sport -
		    dlc_header, 1), "Source port = %d", ntohs(udp->uh_sport));

		if (sunrpc) {
			pname = "(Sun RPC)";
		} else {
			pname = getportname(IPPROTO_UDP, ntohs(udp->uh_dport));
			if (pname == NULL) {
				pname = "";
			} else {
				(void) sprintf(buff, "(%s)", pname);
				pname = buff;
			}
		}
		(void) sprintf(get_line((char *)(uintptr_t)udp->uh_dport -
		    dlc_header, 1), "Destination port = %d %s",
		    ntohs(udp->uh_dport), pname);
		(void) sprintf(get_line((char *)(uintptr_t)udp->uh_ulen -
		    dlc_header, 1), "Length = %d %s",
		    ntohs((ushort_t)udp->uh_ulen),
		    udplen > fraglen ?
			"(Not all data contained in this fragment)"
			: "");
		    (void) sprintf(get_line((char *)(uintptr_t)udp->uh_sum -
			dlc_header, 1),	"Checksum = %04X %s",
			ntohs(udp->uh_sum),
			udp->uh_sum == 0 ? "(no checksum)" : "");
		show_space();
	}


	/* go to the next protocol layer */

	if (!interpret_reserved(flags, IPPROTO_UDP,
		ntohs(udp->uh_sport),
		ntohs(udp->uh_dport),
		data, fraglen)) {
		if (fraglen > 0 && sunrpc)
			interpret_rpc(flags, data, fraglen, IPPROTO_UDP);
	}

	return (fraglen);
}