void
report_billing() {

  const float seconds_per_day = (float)(86400.0);

  int hours;   /* 0..23 */
  int minutes; /* 0..59 */
  int seconds; /* 0..59 */
  float elapsed_time;
  float billing_seconds;
  float billing_days;

  billing_seconds = timer_seconds(&end_time)
    - timer_seconds(&start_time);

  billing_days = timer_days(&end_date)
    - timer_days(&start_date);

  if (billing_seconds >= 0.0) {
    billing_time = (seconds_per_day * billing_days)
      + billing_seconds;
  }
  else {
    billing_time = (seconds_per_day * (billing_days - (float)(1.0)))
      + billing_seconds;
  }

  elapsed_time = billing_time;
  hours = (int)(elapsed_time / (float)(3600.0));
  elapsed_time = elapsed_time - (((float)(hours)) * (float)(3600.0));
  minutes = (int)(elapsed_time / 60.0);
  elapsed_time = elapsed_time - (((float)(minutes)) * (float)(60.0));
  seconds = (int)(elapsed_time);
  printf("Elapsed Time = %2.2d:%2.2d:%2.2d\n",
	 hours, minutes, seconds);
} /* report_billing */
Esempio n. 2
0
/*
 * Send trap, SNMP v1 (RFC 1157).
 * SEQUENCE {
 *	version: INTEGER [=0]
 *	community: STRING
 *	pdu: SEQUENCE [=TRAP] {
 *		enterprise: OBJECT IDENTIFIER
 *		agent-addr: NetworkAddress
 *		generic-trap: INTEGER
 *		specific-trap: INTEGER
 *		time-stamp: INTEGER
 *		varlist: SEQUENCE {
 *			var1: SEQUENCE {
 *				name: OID
 *				value: ...
 *			}
 *			...
 * }	}	}
 */
bool_t
snmp_trap_v1 (snmp_t *snmp, udp_socket_t *sock, unsigned char *local_ip,
	unsigned trap_type, asn_t *oid, asn_t *value)
{
	asn_t *pdu, *trap, *varlist, *var1;
	buf_t *pkt;
	unsigned char *output, status;
	unsigned long santisec;

	/*debug_printf ("snmp_trap(%#x)\n", traptype);*/
	if (oid) {
		var1 = asn_make_seq (snmp->pool, 2, ASN_SEQUENCE);
		if (! var1) {
			asn_free (oid);
			asn_free (value);
			return 0;
		}
		var1->seq.count = 2;
		var1->seq.arr[0] = oid;
		var1->seq.arr[1] = value;
	} else
		var1 = 0;

	/*
	 * List of variables.
	 */
	varlist = asn_make_seq (snmp->pool, 1, ASN_SEQUENCE);
	if (! varlist) {
		asn_free (var1);
		return 0;
	}
	varlist->seq.count = var1 ? 1 : 0;
	varlist->seq.arr[0] = var1;

	/*
	 * Protocol data unit.
	 */
	pdu = asn_make_seq (snmp->pool, 6, ASN_TRAP);
	if (! pdu) {
		asn_free (varlist);
		return 0;
	}
	pdu->seq.count = 6;
	pdu->seq.arr[5] = varlist;

	/* Enterprise */
	pdu->seq.arr[0] = asn_make_oid (snmp->pool, "1.3.6.1.4.1.20520");
	pdu->seq.arr[0]->oid.id[6] = snmp->enterprise;

	/* Agent IP address */
	pdu->seq.arr[1] = asn_make_int (snmp->pool,
		NTOHL (*(unsigned long*) local_ip), ASN_IP_ADDRESS);

	/* Generic trap code */
	pdu->seq.arr[2] = asn_make_int (snmp->pool, trap_type & 0xff,
		ASN_INTEGER);

	/* Specific trap code */
	pdu->seq.arr[3] = asn_make_int (snmp->pool, trap_type >> 8,
		ASN_INTEGER);

	/* Timestamp */
	santisec = 0;
	if (snmp->ip && snmp->ip->timer) {
		unsigned long msec;
		unsigned days = timer_days (snmp->ip->timer, &msec);
		santisec = msec / 10 + days * 24L * 60 * 60 * 100;
	}
	pdu->seq.arr[4] = asn_make_int (snmp->pool, santisec, ASN_TIME_TICKS);

	/*
	 * Trap.
	 */
	trap = asn_make_seq (snmp->pool, 3, ASN_SEQUENCE);
	if (! trap) {
		asn_free (pdu);
		return 0;
	}
	trap->seq.count = 3;
	trap->seq.arr[2] = pdu;

	/* Version */
	trap->seq.arr[0] = asn_make_int (snmp->pool, 0, ASN_INTEGER);

	/* Community */
	trap->seq.arr[1] = asn_make_string (snmp->pool, snmp->trap_community);

	/* Encode and send */
	status = 0;
	pkt = buf_alloc (snmp->pool, TRAP_PACKET_SIZE, 50);
	if (pkt) {
		output = asn_encode (trap, pkt->payload + pkt->len, pkt->len);
		if (! output) {
			buf_free (pkt);
		} else {
			/* Send */
			assert (output >= pkt->payload);
			buf_add_header (pkt, - (output - pkt->payload));
			/* debug_dump ("trap-v1", pkt->payload, pkt->len); */
			status = udp_sendto (sock, pkt, snmp->trap_addr, 162);
			++snmp->out_traps;
			++snmp->out_pkts;
		}
	}
	asn_free (trap);
	return status;
}