common.h

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

#ifndef COMMON_H_
#define COMMON_H_

/* Standard C */
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

/* Sockets */
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

/** To allow timeval without struct. */
typedef struct timeval timeval;

#ifdef DEBUG
/**
 * In the DEBUG configuration, the program displays additional error messages
 * to stderr, but this does not happen in the RELEASE configuration.  Most
 * functions in the program return either EXIT_SUCCESS or EXIT_FAILURE, and
 * this macro makes it easy to trace errors in these functions.
 */
#define RETURN_FAILURE() \
    return return_failure(__FILE__, __LINE__, __func__, errno)
#else
/** This macro returns EXIT_FAILURE. */
#define RETURN_FAILURE() return EXIT_FAILURE
#endif

/** This macro returns EXIT_FAILURE if the argument is false (zero). */
#define RETURN_IF_FALSE(E) if (0 == (E)) RETURN_FAILURE()

/** This macro returns EXIT_FAILURE if the argument equals EXIT_FAILURE. */
#define RETURN_IF_FAILED(E) if ((E) != EXIT_SUCCESS) RETURN_FAILURE()

/** The maximum number of command line arguments. */
#define MAX_ARGS 21

/** The maximum length of the name of some content (a file). */
#define MAX_NAME_LENGTH 20

/**
 * The maximum number of bytes for a name of some content.  This includes
 * the null-terminator.
 */
#define NAME_BUFFER_SIZE (MAX_NAME_LENGTH + 1)

/** The maximum length of a content file. */
#define MAX_CONTENT_LENGTH 1024

/** Data corresponding to a peer. */
typedef struct peer_t {

    /** The port number. */
    u_short port;

    /** The IP address in host order. */
    u_long addr;

} peer_t;

/**
 * Prints a binary buffer to a file.
 *
 * @param f The file pointer.
 * @param input The input buffer.
 * @param len The number of bytes to print.
 */
extern void fprint_buffer(FILE * f, const void * input, size_t len);

/**
 * Prints information about a peer to a file.
 *
 * @param f The file pointer.
 * @param peer The peer.
 */
extern void fprint_peer(FILE * f, const peer_t * peer);

/**
 * Compares two peers.
 *
 * @param peer1 The first peer.
 * @param peer2 The second peer.
 *
 * @return A value compatible with strcmp.
 */
extern int peer_cmp(const peer_t * peer1, const peer_t * peer2);

#ifdef DEBUG
/**
 * Returns EXIT_FAILURE after displaying some error message to stderr.
 *
 * @param file The name of the file.
 * @param line The line number that failed.
 * @param function The name of the function that failed.
 * @param info The value of errno when things failed.
 *
 * @return EXIT_FAILURE.
 */
extern int return_failure(
    const char * file,
    const size_t line,
    const char * function,
    const int    info);
#endif

/**
 * Verifies a name is a valid file name.
 *
 * @param name The name.
 *
 * @return EXIT_SUCCESS or EXIT_FAILURE.
 */
extern int verify_name(const char * name);

#endif /* COMMON_H_ */
Valid HTML 4.01 Valid CSS