/*
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that: (1) source code
 * distributions retain the above copyright notice and this paragraph
 * in its entirety, and (2) distributions including binary code include
 * the above copyright notice and this paragraph in its entirety in
 * the documentation or other materials provided with the distribution.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
 * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
 * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE.
 */

/* \summary: Secure Shell (SSH) printer */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "netdissect-stdinc.h"
#include "netdissect-ctype.h"

#include "netdissect.h"
#include "extract.h"

static int
ssh_print_version(netdissect_options *ndo, const u_char *pptr, u_int len)
{
	u_int idx = 0;

	if ( GET_U_1(pptr+idx) != 'S' )
		return 0;
	idx++;
	if ( GET_U_1(pptr+idx) != 'S' )
		return 0;
	idx++;
	if ( GET_U_1(pptr+idx) != 'H' )
		return 0;
	idx++;
	if ( GET_U_1(pptr+idx) != '-' )
		return 0;
	idx++;

	while (idx < len) {
		u_char c;

		c = GET_U_1(pptr + idx);
		if (c == '\n') {
			/*
			 * LF without CR; end of line.
			 * Skip the LF and print the line, with the
			 * exception of the LF.
			 */
			goto print;
		} else if (c == '\r') {
			/* CR - any LF? */
			if ((idx+1) >= len) {
				/* not in this packet */
				goto trunc;
			}
			if (GET_U_1(pptr + idx + 1) == '\n') {
				/*
				 * CR-LF; end of line.
				 * Skip the CR-LF and print the line, with
				 * the exception of the CR-LF.
				 */
				goto print;
			}

			/*
			 * CR followed by something else; treat this as
			 * if it were binary data and don't print it.
			 */
			goto trunc;
		} else if (!ND_ASCII_ISPRINT(c) ) {
			/*
			 * Not a printable ASCII character; treat this
			 * as if it were binary data and don't print it.
			 */
			goto trunc;
		}
		idx++;
	}
trunc:
	return -1;
print:
	ND_PRINT(": ");
	nd_print_protocol_caps(ndo);
	ND_PRINT(": %.*s", (int)idx, pptr);
	return idx;
}

void
ssh_print(netdissect_options *ndo, const u_char *pptr, u_int len)
{
	ndo->ndo_protocol = "ssh";

	ssh_print_version(ndo, pptr, len);
}
