コード例 #1
0
ファイル: posixsem.c プロジェクト: edgar-pek/PerspicuOS
/*
 * Fork off a child process.  The child will open the semaphore via
 * the same name.  The child will then block on the semaphore waiting
 * for the parent to post it.
 */
static int
wait_twoproc_child(void *arg)
{
	semid_t id;

	if (ksem_open(&id, TEST_PATH, 0, 0, 0) < 0)
		return (CSTAT(1, errno));
	if (ksem_wait(id) < 0)
		return (CSTAT(2, errno));
	if (ksem_close(id) < 0)
		return (CSTAT(3, errno));
	return (CSTAT(0, 0));
}
コード例 #2
0
ファイル: posixsem.c プロジェクト: edgar-pek/PerspicuOS
static int
fdlimit_set(void *arg)
{
	struct rlimit rlim;
	int max;

	max = (intptr_t)arg;
	if (getrlimit(RLIMIT_NOFILE, &rlim) < 0)
		return (CSTAT(3, errno));
	rlim.rlim_cur = max;
	if (setrlimit(RLIMIT_NOFILE, &rlim) < 0)
		return (CSTAT(4, errno));
	return (0);
}
コード例 #3
0
ファイル: posixsem.c プロジェクト: edgar-pek/PerspicuOS
static int
exhaust_unnamed_child(void *arg)
{
	semid_t id;
	int i, max;

	max = (intptr_t)arg;
	for (i = 0; i < max + 1; i++) {
		if (ksem_init(&id, 1) < 0) {
			if (errno == ENOSPC)
				return (CSTAT(0, 0));
			return (CSTAT(1, errno));
		}
	}
	return (CSTAT(2, 0));
}
コード例 #4
0
ファイル: posixsem.c プロジェクト: edgar-pek/PerspicuOS
static int
exhaust_named_child(void *arg)
{
	char buffer[64];
	semid_t id;
	int i, max;

	max = (intptr_t)arg;
	for (i = 0; i < max + 1; i++) {
		snprintf(buffer, sizeof(buffer), "%s%d", TEST_PATH, i);
		if (ksem_open(&id, buffer, O_CREAT, 0777, 1) < 0) {
			if (errno == ENOSPC || errno == EMFILE ||
			    errno == ENFILE)
				return (CSTAT(0, 0));
			return (CSTAT(1, errno));
		}
	}
	return (CSTAT(2, errno));
}
コード例 #5
0
int
noit_check_etc_hosts_cache_refresh(eventer_t e, int mask, void *closure,
                                   struct timeval *now) {
  static struct stat last_stat;
  struct stat sb;
  struct hostent *ent;
  int reload = 0;

  memset(&sb, 0, sizeof(sb));
  stat("/etc/hosts", &sb);
#define CSTAT(f) (sb.f == last_stat.f)
  reload = ! (CSTAT(st_dev) && CSTAT(st_ino) && CSTAT(st_mode) && CSTAT(st_uid) &&
              CSTAT(st_gid) && CSTAT(st_size) && CSTAT(st_mtime));
  memcpy(&last_stat, &sb, sizeof(sb));

  if(reload) {
    mtev_hash_delete_all(&etc_hosts_cache, free, free);
    while(NULL != (ent = gethostent())) {
      int i = 0;
      char *name = ent->h_name;
      while(name) {
        void *vnode;
        static_host_node *node;
        if(!mtev_hash_retrieve(&etc_hosts_cache, name, strlen(name), &vnode)) {
          vnode = node = calloc(1, sizeof(*node));
          node->target = strdup(name);
          mtev_hash_store(&etc_hosts_cache, node->target, strlen(node->target), node);
        }
        node = vnode;
  
        if(ent->h_addrtype == AF_INET) {
          node->has_ip4 = 1;
          memcpy(&node->ip4, ent->h_addr_list[0], ent->h_length);
        }
        if(ent->h_addrtype == AF_INET6) {
          node->has_ip6 = 1;
          memcpy(&node->ip6, ent->h_addr_list[0], ent->h_length);
        }
        
        name = ent->h_aliases[i++];
      }
    }
    endhostent();
    mtevL(noit_debug, "reloaded %d /etc/hosts targets\n", mtev_hash_size(&etc_hosts_cache));
  }

  eventer_add_in_s_us(noit_check_etc_hosts_cache_refresh, NULL, 1, 0);
  return 0;
}
コード例 #6
0
ファイル: arp.c プロジェクト: shidaoxuan/l2tpns
void sendarp(int ifr_idx, const unsigned char* mac, in_addr_t ip)
{
	int fd;
	struct sockaddr_ll sll;
	struct arp_buf buf;

	CSTAT(sendarp);
	STAT(arp_sent);

	/* Ethernet */
	memset(buf.eth.ether_dhost, 0xFF, ETH_ALEN);
	memcpy(buf.eth.ether_shost, mac, ETH_ALEN);
	buf.eth.ether_type = htons(ETHERTYPE_ARP);

	/* ARP */
	buf.arp.ar_hrd = htons(ARPHRD_ETHER);
	buf.arp.ar_pro = htons(ETHERTYPE_IP);
	buf.arp.ar_hln = ETH_ALEN;
	buf.arp.ar_pln = 4; //IPPROTO_ADDR_LEN;
	buf.arp.ar_op = htons(ARPOP_REQUEST);

	/* Data */
	memcpy(buf.ar_sha, mac, ETH_ALEN);
	memcpy(&buf.ar_sip, &ip, sizeof(ip));
	memcpy(buf.ar_tha, mac, ETH_ALEN);
	memcpy(&buf.ar_tip, &ip, sizeof(ip));

	/* Now actually send the thing */
	fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_RARP));

	memset(&sll, 0, sizeof(sll));
	sll.sll_family = AF_PACKET;
	memcpy(sll.sll_addr, mac, sizeof(sll.sll_addr) - 1);
	sll.sll_halen = ETH_ALEN;
	sll.sll_ifindex = ifr_idx;

	sendto(fd, &buf, sizeof(buf), 0, (struct sockaddr*)&sll, sizeof(sll));
	close(fd);
}