Пример #1
1
int
accept_listener_source_address(struct Listener *listener, char *source) {
    if (listener->source_address != NULL) {
        err("Duplicate source address: %s", source);
        return 0;
    }

    listener->source_address = new_address(source);
    if (listener->source_address == NULL) {
        err("Unable to parse source address: %s", source);
        return 0;
    }
    if (!address_is_sockaddr(listener->source_address)) {
        err("Only source socket addresses permitted");
        free(listener->source_address);
        listener->source_address = NULL;
        return 0;
    }
    if (address_port(listener->source_address) != 0) {
        char address[256];
        err("Source address on listener %s set to non zero port, "
                "this prevents multiple connection to each backend server.",
                display_address(listener->address, address, sizeof(address)));
    }

    return 1;
}
Пример #2
0
int
accept_listener_arg(struct Listener *listener, char *arg) {
    if (listener->address == NULL && !is_numeric(arg)) {
        listener->address = new_address(arg);

        if (listener->address == NULL ||
                !address_is_sockaddr(listener->address)) {
            fprintf(stderr, "Invalid listener argument %s\n", arg);
            return -1;
        }
    } else if (listener->address == NULL && is_numeric(arg)) {
        listener->address = new_address("[::]");

        if (listener->address == NULL ||
                !address_is_sockaddr(listener->address)) {
            fprintf(stderr, "Unable to initialize default address\n");
            return -1;
        }

        address_set_port(listener->address, atoi(arg));
    } else if (address_port(listener->address) == 0 && is_numeric(arg)) {
        address_set_port(listener->address, atoi(arg));
    } else {
        fprintf(stderr, "Invalid listener argument %s\n", arg);
    }

    return 1;
}
Пример #3
0
int main() {
    /* using volatile variables so we can example core dumps */
    struct Address *addr;
    char buffer[255];
    int port;

    for (volatile unsigned int i = 0; i < sizeof(good) / sizeof(struct Test); i++) {
        addr = new_address(good[i].input);

        assert(addr != NULL);

        if (good[i].expected_type & TYPE_HOSTNAME && !address_is_hostname(addr)) {
            fprintf(stderr, "Expected %s to be a hostname\n", buffer);
            return 1;
        }

        if (good[i].expected_type & TYPE_SOCKADDR && !address_is_sockaddr(addr)) {
            fprintf(stderr, "Expected %s to be a sockaddr\n", buffer);
            return 1;
        }

        if (good[i].expected_type & TYPE_WILDCARD && !address_is_wildcard(addr)) {
            fprintf(stderr, "Expected %s to be a wildcard\n", buffer);
            return 1;
        }

        display_address(addr, buffer, sizeof(buffer));

        if (strcmp(buffer, good[i].output)) {
            fprintf(stderr, "display_address(%p) returned \"%s\", expected \"%s\"\n", addr, buffer, good[i].output);
            return 1;
        }

        port = address_port(addr);

        if (good[i].port != port) {
            fprintf(stderr, "address_port(%p) return %d, expected %d\n", addr, port, good[i].port);
            return 1;
        }

        free(addr);
    }

    for (volatile unsigned int i = 0; i < sizeof(bad) / sizeof(const char *); i++) {
        addr = new_address(bad[i]);

        if (addr != NULL) {
            fprintf(stderr, "Accepted bad hostname \"%s\"\n", bad[i]);
            return 1;
        }
    }

    return 0;
}
Пример #4
0
int compare_address_strings(const char *a, const char *b) {
    struct Address *addr_a = new_address(a);
    struct Address *addr_b = new_address(b);

    int result = address_compare(addr_a, addr_b);

    free(addr_a);
    free(addr_b);

    return result;
}
Пример #5
0
int
accept_listener_fallback_address(struct Listener *listener, char *fallback) {
    if (listener->fallback_address != NULL) {
        err("Duplicate fallback address: %s", fallback);
        return 0;
    }
    listener->fallback_address = new_address(fallback);
    if (listener->fallback_address == NULL) {
        err("Unable to parse fallback address: %s", fallback);
        return 0;
    }
#ifndef HAVE_LIBUDNS
    if (!address_is_sockaddr(listener->fallback_address)) {
        err("Only fallback socket addresses permitted when compiled without libudns");
        free(listener->fallback_address);
        listener->fallback_address = NULL;
        return 0;
    }
#endif
    if (address_is_wildcard(listener->fallback_address)) {
        free(listener->fallback_address);
        listener->fallback_address = NULL;
        /* The wildcard functionality requires successfully parsing the
         * hostname from the client's request, if we couldn't find the
         * hostname and are using a fallback address it doesn't make
         * much sense to configure it as a wildcard. */
        err("Wildcard address prohibited as fallback address");
        return 0;
    }

    return 1;
}
Пример #6
0
static void collect_addresses_into(InternetAddressList *ilist, AddressesList *addr_list, guint size) {
  g_return_if_fail(ilist != NULL);
  g_return_if_fail(addr_list != NULL);
  g_return_if_fail(size != 0);

  guint i;
  for (i = 0; i < size; i++) {
    InternetAddress *address = internet_address_list_get_address(ilist, i); // transfer none

    if (INTERNET_ADDRESS_IS_GROUP(address)) {
      InternetAddressGroup *group = INTERNET_ADDRESS_GROUP(address);
      InternetAddressList *group_list = internet_address_group_get_members(group); // transer none

      if (group_list) {
        guint gsize = internet_address_list_length(group_list);
        if (gsize)
          collect_addresses_into(group_list, addr_list, gsize);
      }

    } else if (INTERNET_ADDRESS_IS_MAILBOX(address)) {
      InternetAddressMailbox *mailbox = INTERNET_ADDRESS_MAILBOX(address);
      const gchar *name    = internet_address_get_name(address);
      const gchar *address = internet_address_mailbox_get_addr(mailbox);
      Address *addr = new_address(address, name);
      addresses_list_add(addr_list, addr);
    }
  }
}
Пример #7
0
int
accept_backend_arg(struct Backend *backend, const char *arg) {
    if (backend->pattern == NULL) {
        backend->pattern = strdup(arg);
        if (backend->pattern == NULL) {
            err("strdup failed");
            return -1;
        }
    } else if (backend->address == NULL) {

        backend->address = new_address(arg);
        if (backend->address == NULL) {
            err("invalid address: %s", arg);
            return -1;
        }
#ifndef HAVE_LIBUDNS
        if (!address_is_sockaddr(backend->address)) {
            err("Only socket address backends are permitted when compiled without libudns");
            return -1;
        }
#endif
    } else if (address_port(backend->address) == 0 && is_numeric(arg)) {
        address_set_port(backend->address, atoi(arg));
    } else {
        err("Unexpected table backend argument: %s", arg);
        return -1;
    }

    return 1;
}
Пример #8
0
int
accept_backend_arg(struct Backend *backend, char *arg) {
    if (backend->hostname == NULL) {
        backend->hostname = strdup(arg);
        if (backend->hostname == NULL) {
            err("strdup failed");
            return -1;
        }
    } else if (backend->address == NULL) {
        /* Store address in lower case */
        for (char *c = arg; *c == '\0'; c++)
            *c = tolower(*c);

        backend->address = new_address(arg);
        if (backend->address == NULL) {
            err("invalid address: %s\n", arg);
            return -1;
        }
    } else if (address_port(backend->address) == 0 && is_numeric(arg)) {
        address_set_port(backend->address, atoi(arg));
    } else {
        err("Unexpected table backend argument: %s\n", arg);
        return -1;
    }

    return 1;
}
Пример #9
0
static void process_or(ast_node node){
  quad or_quad = create_quad(or);
  add_quad(node, or_quad); 

  // the value of the OR will be stored here: 
  char * or_address = new_address(); 
  node->location = or_address; 

  char * left = process_left(node); 
  char * right = process_right(node); 

  // add the code for the left child
  add_quad_list(node, node->left_child->code); 

  // if the left child is false, go to test for right child
  quad if_false = create_quad(ifFalse); 
  char * loc = strdup(left); 
  if_false->address1 = loc; 
  add_quad(node, if_false); 

  // unconditional jump (short circuiting)
  quad short_circuit = create_quad(jumpTo); 
  add_quad(node, short_circuit); 

  // add the code for the right child - if_false jumps here!
  add_quad_list(node, node->left_child->right_sibling->code);
  int if_false_jumps_here = node->left_child->right_sibling->code->first->num; 
  char * buffer = malloc(10); 
  sprintf(buffer, "%d", if_false_jumps_here); 
  if_false->address2 = buffer; 

  // OR gets the value of the right child
  quad assign_from_right = create_quad(assn); 
  assign_from_right->address1 = or_address; 
  assign_from_right->address2 = right; 
  add_quad(node, assign_from_right); 

  // unconditional jump (done) 
  quad done_jump = create_quad(jumpTo); 
  add_quad(node, done_jump); 

  // OR gets the value of the left child - short circuit jumps here!
  quad assign_from_left = create_quad(assn); 
  assign_from_left->address1 = or_address; 
  assign_from_left->address2 = left; 
  add_quad(node, assign_from_left); 
  
  // backpatch short_circuit
  buffer = malloc(10); 
  sprintf(buffer, "%d", assign_from_left->num); 
  short_circuit->address1 = buffer; 

  // backpatch done_jump (goes to next generated quad)
  buffer = malloc(10); 
  sprintf(buffer, "%d", num_quads); 
  done_jump->address1 = buffer; 

  quad end_or_quad = create_quad(end_or); 
  add_quad(node, end_or_quad); 
}
Пример #10
0
int
accept_backend_arg(struct Backend *backend, char *arg) {
    if (backend->name == NULL) {
        backend->name = strdup(arg);
        if (backend->name == NULL) {
            err("strdup failed");
            return -1;
        }
    } else if (backend->address == NULL) {
        /* Store address in lower case */
        for (char *c = arg; *c != '\0'; c++)
            *c = tolower(*c);

        backend->address = new_address(arg);
        if (backend->address == NULL) {
            err("invalid address: %s", arg);
            return -1;
        }
#ifndef HAVE_LIBUDNS
        if (!address_is_sockaddr(backend->address)) {
            err("Only socket address backends are permitted when compiled without libudns");
            return -1;
        }
#endif
    } else if (address_port(backend->address) == 0 && is_numeric(arg)) {
        address_set_port(backend->address, atoi(arg));
    } else {
        err("Unexpected table backend argument: %s", arg);
        return -1;
    }

    return 1;
}
Пример #11
0
struct Address *
listener_lookup_server_address(const struct Listener *listener,
        const char *name, size_t name_len) {
    struct Address *new_addr = NULL;
    short set_to_fallback = 0;
    const struct Address *addr =
        table_lookup_server_address(listener->table, name, name_len);

    if (addr == NULL)
        addr = listener->fallback_address;

    if (addr == NULL)
        return NULL;

    int port = address_port(addr);

    if (address_is_wildcard(addr)) {
        new_addr = new_address(name);
        if (new_addr == NULL) {
            warn("Invalid hostname %.*s in client request",
                    (int)name_len, name);
            set_to_fallback = 1;
        } else if (address_is_sockaddr(new_addr)) {
            warn("Refusing to proxy to socket address literal %.*s in request",
                    (int)name_len, name);
            set_to_fallback = 1;
        }

        if (!set_to_fallback && port != 0)
            address_set_port(new_addr, port);
    } else {
        size_t len = address_len(addr);
        new_addr = malloc(len);
        if (new_addr == NULL) {
            err("%s: malloc", __func__);
            set_to_fallback = 1;
        }

        memcpy(new_addr, addr, len);
    }

    if (set_to_fallback) {
        size_t len = address_len(listener->fallback_address);
        new_addr = malloc(len);
        if (new_addr == NULL) {
            err("%s: malloc", __func__);
            return NULL;
        }
        memcpy(new_addr, listener->fallback_address, len);
    }
    
    if (!set_to_fallback && port == 0)
        address_set_port(new_addr, address_port(listener->address));

    return new_addr;
}
Пример #12
0
// Format: (array_lkup, target, name, index)
static void process_array(ast_node node){
  quad array_quad = create_quad(array_lkup);

  // where you'll put value of array once you look it up                                                                         
  array_quad->address1 = new_address();

  array_quad->address2 = process_left(node);
  array_quad->address3 = process_right(node);
  add_quad(node, array_quad);
  node->location = array_quad->address1;
}
Пример #13
0
static void process_and(ast_node node){
  quad and_quad = create_quad(and); 
  add_quad(node, and_quad); 

  // address the value of the and will be stored here: 
  char * and_address = new_address(); 
  node->location = and_address; 

  char * left = process_left(node); 
  char * right = process_right(node); 

  // do the code for the left child
  add_quad_list(node, node->left_child->code); 
  
  // if the left child is false, short circuit
  quad if_false = create_quad(ifFalse); 
  char * loc = strdup(left); 
  if_false->address1 = loc; 
  add_quad(node, if_false); 

  // do the code for the right child
  add_quad_list(node, node->left_child->right_sibling->code); 
  quad assign = create_quad(assn); 
  assign->address1 = and_address; 
  assign->address2 = right;
  add_quad(node, assign); 

  // unconditional jump to code after the and
  quad jump_to = create_quad(jumpTo); 
  add_quad(node, jump_to); 

  // first was false, so the value is false (short circuited)
  quad assign2 = create_quad(assn); 
  assign2->address1 = and_address; 
  assign2->address2 = left;
  add_quad(node, assign2); 
  int short_circuit = assign2->num; 

  // backpatch the unconditional jump:
  char * buffer = malloc(10); 
  sprintf(buffer, "%d", num_quads); 
  jump_to->address1 = buffer; 

  // backpatch the short circuit
  buffer = malloc(10); 
  sprintf(buffer, "%d", short_circuit); 
  if_false->address2 = buffer; 

  quad end_and_quad = create_quad(end_and); 
  add_quad(node, end_and_quad); 
}
Пример #14
0
// process float math
static void process_float_math(ast_node node){
  quad new_quad = NULL; 

  switch (node->node_type){
  case OP_PLUS:
    new_quad = create_quad(f_add);
    break;
  case OP_MINUS: 
    new_quad = create_quad(f_sub); 
    break; 
  case OP_TIMES: 
    new_quad = create_quad(f_mult); 
    break;
  case OP_DIVIDE:
    new_quad = create_quad(f_divide); 
    break;
  case OP_EQUALS: 
    new_quad = create_quad(f_eq); 
    break;
  case OP_NEQUALS: 
    new_quad = create_quad(f_neq); 
    break;
  case OP_LT: 
    new_quad = create_quad(f_lt); 
    break;
  case OP_LEQ: 
    new_quad = create_quad(f_leq); 
    break;
  case OP_GT: 
    new_quad = create_quad(f_gt); 
    break;
  case OP_GEQ: 
    new_quad = create_quad(f_geq); 
    break;
  }

  // location being assigned to is new!
  char *target = new_address(); 
  char * left = process_left(node); 
  char *right = process_right(node); 

  if (new_quad != NULL && target != NULL && left != NULL && right != NULL){
    build_code(node, new_quad, target, left, right);
  }
  else {
    destroy_quad(new_quad);
    error("process_float_math");
  }
}
Пример #15
0
static void process_negate(ast_node node){
  quad new_quad = create_quad(mult); 
  char * target = new_address(); 

  char * value = process_left(node);
  char * multby = strdup("-1"); 
  
  if (value != NULL){
    build_code(node, new_quad, target, value, multby); 
  }
  else{
    destroy_quad(new_quad); 
    error("process_negate"); 
  }
}
Пример #16
0
/* processes a call 
 * 1. push the params onto the stack
 * 2. goto_sub the function (location will be stored in symbol table maybe?) 
 * 3. get the return value (will be in a register) 
 */ 
static void process_call(ast_node node){
  // 1. push the params onto the stack in reverse order
  ast_node args = node->left_child->right_sibling; 


  quad goto_sub_quad = create_quad(goto_sub);
  goto_sub_quad->address1 = node->left_child->value.string;
  add_quad(node, goto_sub_quad);
   

  ast_node curr; 
  for (curr = args->left_child; curr != NULL; curr = curr->right_sibling){
    quad push_quad = create_quad(push); 
    push_quad->address1 = curr->location;
    
    // it's a literal!
    if (push_quad->address1 == NULL){
      char buffer[MAX_LEN];
      char *val; 
      if (curr->type == Int){
	snprintf(buffer, MAX_LEN, "%d", curr->value.int_value);
        val = strdup(buffer);
	push_quad->address1 = val;
      }
      else{
	snprintf(buffer, MAX_LEN, "%f", curr->value.double_value); 
	val = strdup(buffer); 
	push_quad->address1 = val; 
      }
    }
 
    add_quad_to_beginning(node, push_quad); 
    add_quad_list_to_beginning(node, curr->code); 
    //add_quad_list(node, curr->code); 
  }

  // 2. jump to the function's subroutine
  /* quad goto_sub_quad = create_quad(goto_sub); 
  goto_sub_quad->address1 = node->left_child->value.string; 
  add_quad(node, goto_sub_quad); 
  */
  // 3. get the return value 
  quad get_return = create_quad(get_rtrn); 
  get_return->address1 = new_address(); 
  node->location = get_return->address1; 
  add_quad(node, get_return); 
} 
Пример #17
0
struct Address *
listener_lookup_server_address(const struct Listener *listener,
        const char *name, size_t name_len) {
    struct Address *new_addr = NULL;
    const struct Address *addr =
        table_lookup_server_address(listener->table, name, name_len);

    if (addr == NULL)
        addr = listener->fallback_address;

    if (addr == NULL)
        return NULL;

    int port = address_port(addr);

    if (address_is_wildcard(addr)) {
        new_addr = new_address(name);
        if (new_addr == NULL) {
            warn("Invalid hostname %.*s", (int)name_len, name);

            return listener->fallback_address;
        }

        if (port != 0)
            address_set_port(new_addr, port);
    } else {
        size_t len = address_len(addr);
        new_addr = malloc(len);
        if (new_addr == NULL) {
            err("%s: malloc", __func__);

            return listener->fallback_address;
        }

        memcpy(new_addr, addr, len);
    }

    if (port == 0)
        address_set_port(new_addr, address_port(listener->address));

    return new_addr;
}
Пример #18
0
int
accept_listener_fallback_address(struct Listener *listener, char *fallback) {
    if (listener->fallback_address != NULL) {
        fprintf(stderr, "Duplicate fallback address: %s\n", fallback);
        return 0;
    }
    listener->fallback_address = new_address(fallback);
    if (listener->fallback_address == NULL) {
        fprintf(stderr, "Unable to parse fallback address: %s\n", fallback);
        return 0;
    }
    if (address_is_wildcard(listener->fallback_address)) {
        free(listener->fallback_address);
        listener->fallback_address = NULL;
        /* The wildcard functionality requires successfully parsing the
         * hostname from the client's request, if we couldn't find the
         * hostname and are using a fallback address it doesn't make
         * much sense to configure it as a wildcard. */
        fprintf(stderr, "Wildcard address prohibited as fallback address\n");
        return 0;
    }

    return 1;
}
Пример #19
0
int
accept_listener_fallback_address(struct Listener *listener, char *fallback) {
    if (listener->fallback_address != NULL) {
        err("Duplicate fallback address: %s", fallback);
        return 0;
    }
    struct Address *fallback_address = new_address(fallback);
    if (fallback_address == NULL) {
        err("Unable to parse fallback address: %s", fallback);
        return 0;
    } else if (address_is_sockaddr(fallback_address)) {
        listener->fallback_address = fallback_address;
        return 1;
    } else if (address_is_hostname(fallback_address)) {
#ifndef HAVE_LIBUDNS
        err("Only fallback socket addresses permitted when compiled without libudns");
        free(fallback_address);
        return 0;
#else
        warn("Using hostname as fallback address is strongly discouraged");
        listener->fallback_address = fallback_address;
        return 1;
#endif
    } else if (address_is_wildcard(fallback_address)) {
        /* The wildcard functionality requires successfully parsing the
         * hostname from the client's request, if we couldn't find the
         * hostname and are using a fallback address it doesn't make
         * much sense to configure it as a wildcard. */
        err("Wildcard address prohibited as fallback address");
        free(fallback_address);
        return 0;
    } else {
        fatal("Unexpected fallback address type");
        return 0;
    }
}
Пример #20
0
// The address book is not practical enough yet to be of much use
// Leave all this code commented until it gets improved
address_book::address_book (QWidget *parent) : QWidget(parent)
{
  m_is_modified = false;
  Q3BoxLayout* top_layout = new Q3VBoxLayout (this);
  top_layout->setMargin (4);
  top_layout->setSpacing (4);
  Q3HBox* hb = new Q3HBox (this);
  hb->setSpacing (6);
  top_layout->addWidget (hb);

  Q3VBox* box_left = new Q3VBox (hb);
  Q3VBox* box_right = new Q3VBox (hb);

  // left pane: search criteria and results
  Q3GroupBox* search_box = new Q3GroupBox (3, Qt::Horizontal, tr("Search"), box_left);
  Q3VBox* labels_box = new Q3VBox(search_box);
  Q3VBox* fields_box = new Q3VBox(search_box);
  m_email_search_w = new QLineEdit (fields_box);
  (void)new QLabel (tr("Address"), labels_box);

  m_name_search_w = new QLineEdit (fields_box);
  (void)new QLabel (tr("Name"), labels_box);

  m_nick_search_w = new QLineEdit (fields_box);
  (void)new QLabel (tr("Alias"), labels_box);

  QPushButton* button_search = new QPushButton (tr("Search"), search_box);
  connect (button_search, SIGNAL(clicked()), this, SLOT(search()));

  Q3GroupBox* result_box = new Q3GroupBox (1, Qt::Vertical, tr("Results"), box_left);
  m_result_list_w = new Q3ListView (result_box);
  m_result_list_w->addColumn (tr("Email address"));
  m_result_list_w->addColumn (tr("# msgs"), 50);
  connect(m_result_list_w, SIGNAL(selectionChanged()),
	  this, SLOT(address_selected()));

  // right pane: properties of the selected address
  Q3GroupBox* prop_box = new Q3GroupBox (tr("Properties"), box_right);
  Q3GridLayout *grid_layout = new Q3GridLayout (prop_box, 6, 2);
  grid_layout->setSpacing (4);
  // set a marging big enough for the QGroupBox title not being overwritten
  grid_layout->setMargin (15);
  int g_row = 0;		// grid row

  m_email_w = new QLineEdit (prop_box);
  grid_layout->addWidget (new QLabel (tr("Address:"), prop_box),g_row,0);
  grid_layout->addWidget (m_email_w, g_row, 1);

  g_row++;
  m_name_w = new QLineEdit (prop_box);
  grid_layout->addWidget (new QLabel (tr("Name:"), prop_box), g_row, 0);
  grid_layout->addWidget (m_name_w, g_row, 1);

  g_row++;
  m_nick_w = new QLineEdit (prop_box);
  grid_layout->addWidget (new QLabel (tr("Alias:"), prop_box), g_row, 0);
  grid_layout->addWidget (m_nick_w, g_row, 1);

  g_row++;
  m_notes_w = new Q3MultiLineEdit (prop_box);
  grid_layout->addWidget (new QLabel (tr("Notes:"), prop_box), g_row, 0);
  grid_layout->addWidget (m_notes_w, g_row, 1);

  g_row++;
  m_invalid_w = new QCheckBox (prop_box);
  grid_layout->addWidget (new QLabel (tr("Invalid:"), prop_box), g_row, 0);
  grid_layout->addWidget (m_invalid_w, g_row, 1);

  g_row++;
  QPushButton* button_aliases = new QPushButton(tr("Other addresses..."), prop_box);
  grid_layout->addWidget (button_aliases, 5, 1);
  connect (button_aliases, SIGNAL(clicked()), this, SLOT(aliases()));

  // buttons at the bottom of the window
  Q3HBox* buttons_box = new Q3HBox (this);
  buttons_box->setSpacing (4);
  top_layout->addWidget (buttons_box);

  new Q3HBox (buttons_box);	// takes the left space
  QPushButton* b1 = new QPushButton (tr("New"), buttons_box);
  connect (b1, SIGNAL(clicked()), this, SLOT(new_address()));
  QPushButton* b2 = new QPushButton (tr("Apply"), buttons_box);
  connect (b2, SIGNAL(clicked()), this, SLOT(apply()));
  QPushButton* b3 = new QPushButton (tr("OK"), buttons_box);
  connect (b3, SIGNAL(clicked()), this, SLOT(OK()));
  QPushButton* b4 = new QPushButton (tr("Cancel"), buttons_box);
  connect (b4, SIGNAL(clicked()), this, SLOT(cancel()));
}
Пример #21
0
int main() {
    /* using volatile variables so we can example core dumps */
    for (volatile unsigned int i = 0; i < sizeof(good) / sizeof(struct Test); i++) {
        int port;
        char buffer[255];
        struct Address *addr = new_address(good[i].input);

        assert(addr != NULL);
        assert(address_compare(addr, addr) == 0);
        assert(address_compare(NULL, addr) < 0);
        assert(address_compare(addr, NULL) > 0);
        assert(address_len(addr) > 0);

        if (good[i].expected_type & TYPE_HOSTNAME) {
            assert(address_is_hostname(addr));
            assert(!address_is_sockaddr(addr));
            assert(!address_is_wildcard(addr));
            assert(address_hostname(addr) != NULL);
            assert(address_sa(addr) == NULL);
            assert(address_sa_len(addr) == 0);
        } else if (good[i].expected_type & TYPE_SOCKADDR) {
            assert(!address_is_hostname(addr));
            assert(address_is_sockaddr(addr));
            assert(!address_is_wildcard(addr));
            assert(address_hostname(addr) == NULL);
            assert(address_sa(addr) != NULL);
            assert(address_sa_len(addr) > 0);
        } else if (good[i].expected_type & TYPE_WILDCARD) {
            assert(!address_is_hostname(addr));
            assert(!address_is_sockaddr(addr));
            assert(address_is_wildcard(addr));
            assert(address_hostname(addr) == NULL);
            assert(address_sa(addr) == NULL);
            assert(address_sa_len(addr) == 0);
        }

        display_address(addr, buffer, sizeof(buffer));

        if (strcmp(buffer, good[i].output)) {
            fprintf(stderr, "display_address(%p) returned \"%s\", expected \"%s\"\n", addr, buffer, good[i].output);
            return 1;
        }

        assert(display_address(addr, NULL, 0) == NULL);

        port = address_port(addr);

        if (good[i].port != port) {
            fprintf(stderr, "address_port(%p) return %d, expected %d\n", addr, port, good[i].port);
            return 1;
        }

        address_set_port(addr, port);

        if (good[i].port != port) {
            fprintf(stderr, "address_port(%p) return %d, expected %d\n", addr, port, good[i].port);
            return 1;
        }

        free(addr);
    }

    for (volatile unsigned int i = 0; i < sizeof(bad) / sizeof(const char *); i++) {
        struct Address *addr = new_address(bad[i]);

        if (addr != NULL) {
            fprintf(stderr, "Accepted bad hostname \"%s\"\n", bad[i]);
            return 1;
        }
    }

    assert(compare_address_strings("unix:/dev/log", "127.0.0.1") < 0);
    assert(compare_address_strings("unix:/dev/log", "unix:/dev/logsocket") < 0);
    assert(compare_address_strings("0.0.0.0", "127.0.0.1") < 0);
    assert(compare_address_strings("127.0.0.1", "0.0.0.0") > 0);
    assert(compare_address_strings("127.0.0.1", "127.0.0.1") == 0);
    assert(compare_address_strings("127.0.0.1:80", "127.0.0.1:81") < 0);
    assert(compare_address_strings("*:80", "*:81") < 0);
    assert(compare_address_strings("*:81", "*:80") > 0);
    assert(compare_address_strings("example.com", "example.net") < 0);
    assert(compare_address_strings("example.net", "example.com") > 0);
    assert(compare_address_strings("example.com", "example.com.net") < 0);
    assert(compare_address_strings("example.com.net", "example.com") > 0);
    assert(compare_address_strings("example.com", "example.com:80") < 0);
    assert(compare_address_strings("example.com:80", "example.com") > 0);
    assert(compare_address_strings(NULL, "example.com") < 0);
    assert(compare_address_strings("example.com", NULL) > 0);
    assert(compare_address_strings("example.com", "::") < 0);
    assert(compare_address_strings("::", "example.com") > 0);
    assert(compare_address_strings("0.0.0.0", "*") < 0);
    assert(compare_address_strings("*", "0.0.0.0") > 0);

    do {
        struct Address *addr = new_address("*");

        assert(addr != NULL);
        assert(address_len(addr) > 0);

        free(addr);
    } while (0);

    return 0;
}
Пример #22
0
/* Handles mathy operations (all the same pattern)
 * Format: (operation, target location, left argument, right argument)
 */ 
static void process_math(ast_node node){
  // if its a float - process float math
  if (node->type == Double){
    process_float_math(node); 
    return;
  }

  quad new_quad = NULL;   

  if (node->node_type == OP_PLUS){
    new_quad = create_quad(add);       
  }                         
  else if (node->node_type == OP_MINUS){  
    new_quad = create_quad(sub);     
  }                     
  else if (node->node_type == OP_TIMES){  
    new_quad = create_quad(mult);      
  }                       
  else if (node->node_type == OP_DIVIDE){
    new_quad = create_quad(divide);  
  }         
  else if (node->node_type == OP_MOD){
    new_quad = create_quad(mod); 
  }
  else if (node->node_type == OP_EQUALS){
    new_quad = create_quad(eq); 
  }
  else if (node->node_type == OP_NEQUALS){
    new_quad = create_quad(neq); 
  }
  else if (node->node_type == OP_LT){
    new_quad = create_quad(lt); 
  }
  else if (node->node_type == OP_LEQ){
    new_quad = create_quad(leq); 
  }
  else if (node->node_type == OP_GT){
    new_quad = create_quad(gt); 
  }
  else if (node->node_type == OP_GEQ){
    new_quad = create_quad(geq); 
  }
  else if (node->node_type == OP_NOT){
    new_quad = create_quad(not); 
  }
   
  // location being assigned to is new!   
  char * target = new_address();
       
  // get left argument     
  char * left = process_left(node);  
  
  // get right argument (if it's not OP_NOT)
  char * right = NULL; 
  if (node->node_type != OP_NOT)
    right = process_right(node);
  
  if (new_quad != NULL && target != NULL && left != NULL){                
    build_code(node, new_quad, target, left, right);  
  }            
  else {  
    destroy_quad(new_quad);        
    error("process math");                 
  }          
}