common.c

/*
 * File Name:     common.c
 * Author:        Jade Cheng
 * Date:          March 29, 2009
 * Course:        ICS 451
 * Assignment:    Project 2
 */

#include "common.h"

/* ------------------------------------------------------------------------ */
extern void fprint_buffer(FILE * f, const void * input, size_t len)
{
    int            i;
    const u_char * ptr;

    ptr = input;

    /* First print the buffer as hex values. */
    fprintf(f, "  { ");
    for (i = 0; i < len; i++)
        fprintf(f, "%02x ", ptr[i]);
    fprintf(f, "}\n");

    /* Next print the buffer as ASCII values, if possible. */
    fprintf(f, "  { ");
    for (i = 0; i < len; i++)
        fprintf(f, " %c ", ((ptr[i] >= 32 && ptr[i] <= 127) ? ptr[i] : '?'));

    fprintf(f, "}\n");
}

/* ------------------------------------------------------------------------ */
extern void fprint_peer(FILE * f, const peer_t * peer) {
    char ip[16];

    inet_ntop(AF_INET, &peer->addr, ip, sizeof(ip));
    fprintf(f, "%s:%hu", ip, peer->port);
}

/* ------------------------------------------------------------------------ */
extern int peer_cmp(const peer_t * peer1, const peer_t * peer2)
{
    int result;

    assert(peer1 != NULL);
    assert(peer2 != NULL);

    if (0 != (result = (peer1->addr - peer2->addr)))
        return result;

    return peer1->port - peer2->port;
}

/* ------------------------------------------------------------------------ */
#ifdef DEBUG
extern int return_failure(
    const char * file,
    const size_t line,
    const char * function,
    const int    info)
{
    assert(file != NULL);
    assert(function != NULL);

    fprintf(stderr, "%s(%d): %s failed.", file, line, function);

    /* errno is not always set. Don't print information if it isn't. */
    if (info != 0)
        fprintf(stderr, " (%d) %s", info, strerror(info));

    fprintf(stderr, "\n");

    return EXIT_FAILURE;
}
#endif /* DEBUG */

/* ------------------------------------------------------------------------ */
extern int verify_name(const char * name)
{
    size_t dots;
    size_t i;
    size_t len;

    assert(name != NULL);

    /* Check the length is valid. */
    len = strlen(name);
    RETURN_IF_FALSE(len <= MAX_NAME_LENGTH);
    RETURN_IF_FALSE(len > 0);

    /* Check each character is valid. */
    dots = 0;
    for (i = 0; i < len; i++) {

        RETURN_IF_FALSE(
            islower((int)name[i])
            || isdigit((int)name[i])
            || name[i] == '_'
            || name[i] == '.');

        /* Do not allow more than one dot. */
        if (name[i] == '.' && ++dots == 2)
            RETURN_FAILURE();
    }

    return EXIT_SUCCESS;
}
Valid HTML 4.01 Valid CSS