예제 #1
0
int shlogd_main(int argc, char **argv)
{
  int err;
  int fd;

#ifdef SHLOGD_APPLICATION
  daemon(0, 1);
#endif

  strncpy(process_path, argv[0], PATH_MAX);
  proc_peer = shapp_init(PROCESS_NAME, NULL, SHAPP_LOCAL);

  process_socket_port = PROCESS_PORT; 

  fd = shnet_sk();
  if (fd == -1) {
    perror("shsk");
    return;
  }
  
  err = shnet_bindsk(fd, NULL, process_socket_port);
  if (err) {
    perror("shbindport");
    shclose(fd);
    return (err);
  }

  process_socket_fd = fd;

  daemon_server(0);

  shpeer_free(&proc_peer);
}
예제 #2
0
void card_nat_fill(shcard_t *card, shadow_t *shadow)
{
  shpeer_t *peer;

  card->card_expire = shadow->sh_expire;
  card->card_acc = shadow->sh_uid;
  strcpy(card->card_type, CARDTYPE_NEONATURA);

  peer = shpeer();
  memcpy(&card->card_issuer, peer, sizeof(shpeer_t));
  shpeer_free(&peer);

}
예제 #3
0
파일: shsys_geo.c 프로젝트: neonatura/share
shdb_t *shgeodb_open(char *db_name)
{
  shdb_t *db;
  shpeer_t *peer;

  peer = shpeer_init(NULL, NULL); /* "libshare" partition */
  db = shdb_open_peer(db_name, peer);
  shpeer_free(&peer);
  if (!db)
    return (NULL);

  shgeodb_table_init(db, SHGEO_ZIPCODE);
  shgeodb_table_init(db, SHGEO_CITY);
  shgeodb_table_init(db, SHGEO_COMMON);
  shgeodb_table_init(db, SHGEO_NETWORK);
#if 0
  shgeodb_table_init(db, SHGEO_USER);
#endif

  return (db);
}
예제 #4
0
/**
 * @see shsig_shr_sign()
 */
int shcert_sign(shcert_t *cert, shcert_t *parent)
{
  shkey_t *key;
  unsigned char *enc_data;
  size_t enc_len;
  int err;

  if (!parent)
    return (SHERR_INVAL);

  if (!(parent->cert_flag & SHCERT_CERT_SIGN)) {
    /* parent certificate lacks ability to sign. */
    return (SHERR_INVAL);
  }

  /* assign issuer's 128-bit serial number (regardless of algorythm)  */
  memcpy(cert->cert_iss.ent_ser, parent->cert_sub.ent_ser, 16);

  if (cert->cert_sub.ent_sig.sig_key.alg == SHKEY_ALG_ECDSA) {
    shkey_t *pub_key = &cert->cert_sub.ent_sig.sig_key;
    shkey_t *priv_key;
    shkey_t *seed_key;
    shpeer_t *peer;
    char sig_r[256];
    char sig_s[256];
    char *hex_data;
    unsigned char data[256];
    int data_len;


    /* fill in parent signature */
    memcpy(&cert->cert_iss.ent_sig, &parent->cert_sub.ent_sig, sizeof(shsig_t));

    peer = shpeer_init(NULL, NULL);
    seed_key = shpeer_kpriv(peer);
    priv_key = shecdsa_key_priv(shkey_hex(seed_key));
    shpeer_free(&peer);

    pub_key = shecdsa_key_pub(priv_key);
    memcpy(&cert->cert_sub.ent_sig.sig_key, pub_key, sizeof(shkey_t));

    if ((parent->cert_flag & SHCERT_CERT_NONREPUDIATION)) {
      /* must be derived from owner to preserve authenticy. */
      if (!shkey_cmp(&cert->cert_sub.ent_sig.sig_key, 
            &cert->cert_iss.ent_sig.sig_key)) {
        return (SHERR_ACCESS);
      }
    }

    hex_data = shkey_hex(&cert->cert_iss.ent_sig.sig_key);
    data_len = strlen(hex_data) / 2;
    memset(data, 0, sizeof(data));
    hex2bin(data, hex_data, data_len);

    shecdsa_sign(priv_key, sig_r, sig_s, data, data_len);
    strcpy(cert->cert_sub.ent_sig.key.ecdsa.sig_r, sig_r);
    strcpy(cert->cert_sub.ent_sig.key.ecdsa.sig_s, sig_s);
    cert->cert_sub.ent_len = data_len;

    shkey_free(&pub_key);
    shkey_free(&priv_key);
  } else {
    err = shencode((char *)&parent->cert_sub.ent_sig.sig_key, sizeof(shkey_t),
      &enc_data, &enc_len, &parent->cert_iss.ent_sig.sig_key);
    if (err)
      return (err);

    key = shkey_bin(enc_data, enc_len);
    free(enc_data);
    memcpy(&cert->cert_sub.ent_sig.sig_key, key, sizeof(shkey_t));
    cert->cert_sub.ent_len = enc_len;
    shkey_free(&key);
  }

  cert->cert_flag |= SHCERT_CERT_CHAIN;
  cert->cert_flag |= parent->cert_flag; /* inherit parent's attributes */
  cert->cert_sub.ent_sig.sig_key.alg = parent->cert_sub.ent_sig.sig_key.alg;

  strcpy(cert->cert_iss.ent_name, parent->cert_sub.ent_name); 
  cert->cert_iss.ent_sig.sig_stamp = parent->cert_sub.ent_sig.sig_stamp;
  cert->cert_iss.ent_sig.sig_expire = parent->cert_sub.ent_sig.sig_expire;
  cert->cert_iss.ent_len = parent->cert_sub.ent_len;


  return (0);
}
예제 #5
0
int main(int argc, char **argv)
{
  shpeer_t *app_peer;
  time_t stime, etime;
  time_t now;
  char subcmd[256];
  char **args;
  char app_name[256];
  int i;

  signal(SIGHUP, SIG_IGN);
  signal(SIGPIPE, SIG_IGN);

  strncpy(process_path, argv[0], PATH_MAX);

  proc_mode = RUN_NONE;

  /* handle traditional arguments */
  for (i = 1; i < argc; i++) {
    if (0 == strcmp(argv[i], "--version") ||
        0 == strcmp(argv[i], "-v")) {
      print_process_version();
      return (0);
    }
    if (0 == strcmp(argv[i], "--help") ||
        0 == strcmp(argv[i], "-h")) {
      print_process_usage();
      return (0);
    }
  }


  memset(app_name, 0, sizeof(app_name));
  for (i = 1; i < argc; i++) {
    if (0 == strcmp(argv[i], "-f")) {
      proc_mode = RUN_TAIL;
      continue;
    }

    if (argv[i][0] == '-') {
      continue;
    }

    strncpy(app_name, argv[i], sizeof(app_name) - 1);
    if (proc_mode == RUN_NONE)
      proc_mode = RUN_LIST;
  }

  app_peer = shpeer_init(app_name, NULL);

  now = time(NULL);
  stime = etime = now;
  switch (proc_mode) {
    case RUN_NONE:
      print_process_usage();
      break;

    case RUN_LIST:
      sharelog_list(app_peer, stime, etime);
      break;

    case RUN_TAIL:
      sharelog_list(app_peer, now, now);
      sharelog_tail(app_peer);
      break;
  }

  shpeer_free(&app_peer);

	return (0);
}
예제 #6
0
int sharedaemon_bcast_send(void)
{
    struct ifaddrs *if_list;
    struct ifaddrs *dev;
    shpeer_t *peer;
    char hostname[NI_MAXHOST+1];
    int err;

    err = getifaddrs(&if_list);
    if (err)
        return (-errno);

    /* cycle through all non loop-back interfaces. */
    for (dev = if_list; dev; dev = dev->ifa_next) {
        if (dev->ifa_addr == NULL)
            continue;

        err = SHERR_OPNOTSUPP;

        memset(hostname, 0, sizeof(hostname));
        switch (dev->ifa_addr->sa_family) {
        case AF_INET:
            err = getnameinfo(dev->ifa_addr, sizeof(struct sockaddr_in),
                              hostname, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
            if (err)
                break;

            if (0 == strncmp(hostname, "127.0.0.", strlen("127.0.0."))) {
                /* local loop-back */
                err = SHERR_AGAIN;
                break;
            }

            fprintf(stderr, "DEBUG: found inet device '%s' with addr '%s'\n", dev->ifa_name, hostname);

            err = 0;
            break;

        case AF_INET6:
            err = getnameinfo(dev->ifa_addr, sizeof(struct sockaddr_in6),
                              hostname, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
            if (err)
                break;

            if (0 == strcmp(hostname, "::1")) {
                /* local loop-back */
                err = SHERR_AGAIN;
                break;
            }
            fprintf(stderr, "DEBUG: found inet6 device '%s' with addr '%s'\n", dev->ifa_name, hostname);


            err = 0;
            break;

        default:
            fprintf(stderr, "DEBUG: found unknown (fam %d) device '%s' with addr '%s'\n", dev->ifa_addr->sa_family, dev->ifa_name, hostname);
            break;
        }
        if (err) {
            /* .. */
            continue;
        }

        sprintf(hostname + strlen(hostname), " %d", server_port);
        peer = shpeer_init("shared", hostname);
        fprintf(stderr, "DEBUG: sharedaemon_bcast_send: %d = sharedaemon_bcast_send_peer(\"%s\")\n", err, hostname);
        err = sharedaemon_bcast_send_peer(peer);
        shpeer_free(&peer);
        if (err) {
            /* .. */
        }
    }

    return (0);
}