From c02036e1ad759fca228a2201f1c4752670ad59bd Mon Sep 17 00:00:00 2001 From: "Dr. David von Oheimb" Date: Mon, 18 Jul 2022 20:26:57 +0200 Subject: Rename the "timing" program to "timing_load_creds" and integrate it with test/build.info Reviewed-by: Dmitry Belyavskiy Reviewed-by: Paul Dale Reviewed-by: David von Oheimb (Merged from https://github.com/openssl/openssl/pull/18821) --- test/build.info | 9 ++- test/certs/timing-cert.pem | 19 ++++++ test/certs/timing-key.pem | 29 ++++++++ test/timing-cert.pem | 19 ------ test/timing-key.pem | 29 -------- test/timing.c | 166 --------------------------------------------- test/timing_load_creds.c | 163 ++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 219 insertions(+), 215 deletions(-) create mode 100644 test/certs/timing-cert.pem create mode 100644 test/certs/timing-key.pem delete mode 100644 test/timing-cert.pem delete mode 100644 test/timing-key.pem delete mode 100644 test/timing.c create mode 100644 test/timing_load_creds.c (limited to 'test') diff --git a/test/build.info b/test/build.info index 500999ca34..a74dd36de2 100644 --- a/test/build.info +++ b/test/build.info @@ -37,7 +37,7 @@ IF[{- !$disabled{tests} -}] sanitytest rsa_complex exdatatest bntest \ ecstresstest gmdifftest pbelutest \ destest mdc2test sha_test \ - exptest pbetest localetest evp_pkey_ctx_new_from_name\ + exptest pbetest localetest evp_pkey_ctx_new_from_name \ evp_pkey_provided_test evp_test evp_extra_test evp_extra_test2 \ evp_fetch_prov_test evp_libctx_test ossl_store_test \ v3nametest v3ext \ @@ -956,6 +956,13 @@ ENDIF INCLUDE[build_wincrypt_test]=../include DEPEND[build_wincrypt_test]=../libssl ../libcrypto + IF[{- !$disabled{shared} -}] + PROGRAMS{noinst}=timing_load_creds + SOURCE[timing_load_creds]=timing_load_creds.c + INCLUDE[timing_load_creds]=../include + DEPEND[timing_load_creds]=../libcrypto.a + ENDIF + IF[{- !$disabled{'quic'} -}] PROGRAMS{noinst}=quicapitest quic_wire_test ENDIF diff --git a/test/certs/timing-cert.pem b/test/certs/timing-cert.pem new file mode 100644 index 0000000000..cc17d3ffab --- /dev/null +++ b/test/certs/timing-cert.pem @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdSb290 +IENBMCAXDTE2MDExNDIyMjk0NloYDzIxMTYwMTE1MjIyOTQ2WjAZMRcwFQYDVQQD +DA5zZXJ2ZXIuZXhhbXBsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANVdYGrf/GHuSKqMEUhDpW22Ul2qmEmxYZI1sfw6BCUMbXn/tNXJ6VwcO+Crs7h9 +o95tveDd11q/FEcRQl6mgtBhwX/dE0bmCYUHDvLU/Bpk0gqtIKsga5bwrczEGVNV +3AEdpLPvirRJU12KBRzx3OFEv8XX4ncZV1yXC3XuiENxD8pswbSyUKd3RmxYDxG/ +8XYkWq45QrdRZynh0FUwbxfkkeqt+CjCQ2+iZKn7nZiSYkg+6w1PgkqK/z9y7pa1 +rqHBmLrvfZB1bf9aUp6r9cB+0IdD24UHBw99OHr90dPuZR3T6jlqhzfuStPgDW71 +cKzCvfFu85KVXqnwoWWVk40CAwEAAaN9MHswHQYDVR0OBBYEFMDnhL/oWSczELBS +T1FSLwbWwHrNMB8GA1UdIwQYMBaAFHB/Lq6DaFmYBCMqzes+F80k3QFJMAkGA1Ud +EwQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwGQYDVR0RBBIwEIIOc2VydmVyLmV4 +YW1wbGUwDQYJKoZIhvcNAQELBQADggEBAHvTBEN1ig8RrsT716Ginv4gGNX0LzGI +RrZ1jO7lm5emuaPNYJpGw0iX5Zdo91qGNXPZaZ75X3S55pQTActq3OPEBOll2pyk +iyjz+Zp/v5cfRZLlBbFW5gv2R94eibYr4U3fSn4B0yPcl4xH/l/HzJhGDsSDW8qK +8VIJvmvsPwmL0JMCv+FR59F+NFYZdND/KCXet59WUpF9ICmFCoBEX3EyJXEPwhbi +X2sdPzJbCjx0HLli8e0HUKNttLQxCsBTRGo6iISLLamwN47mGDa9miBADwGSiz2q +YeeuLO02zToHhnQ6KbPXOrQAqcL1kngO4g+j/ru+4AZThFkdkGnltvk= +-----END CERTIFICATE----- diff --git a/test/certs/timing-key.pem b/test/certs/timing-key.pem new file mode 100644 index 0000000000..a0b8e8dab2 --- /dev/null +++ b/test/certs/timing-key.pem @@ -0,0 +1,29 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDVXWBq3/xh7kiq +jBFIQ6VttlJdqphJsWGSNbH8OgQlDG15/7TVyelcHDvgq7O4faPebb3g3ddavxRH +EUJepoLQYcF/3RNG5gmFBw7y1PwaZNIKrSCrIGuW8K3MxBlTVdwBHaSz74q0SVNd +igUc8dzhRL/F1+J3GVdclwt17ohDcQ/KbMG0slCnd0ZsWA8Rv/F2JFquOUK3UWcp +4dBVMG8X5JHqrfgowkNvomSp+52YkmJIPusNT4JKiv8/cu6Wta6hwZi6732QdW3/ +WlKeq/XAftCHQ9uFBwcPfTh6/dHT7mUd0+o5aoc37krT4A1u9XCswr3xbvOSlV6p +8KFllZONAgMBAAECggEADLTt7A+A2Vg2jamf0dztejY0e42QWjstI2b9PZc67fXq +gyx+WYkX07t+uWegYWliG/oPJ9guXiIpE/5sJHToL37S5kmFP2CtynVcJ4wVo4DD +nY0n9+kLX0bgIuS+2V6wpoRcbbbjXM9NHrH8kfe5ftT4UtEDlLI2qLX6IcDd7p4u +OYjILChR8GSGTw96yIy2Ws/1Uq9PMw64JoT4RcK5QqnkcPMDFRH1SeLOL+zXP2c4 +nEl9yOy3HauZKxwl/Ry/XK1s3DdjopIAU29ut+hAuMiTb06kzZnumL9NoplKoZtU +otw/gVcCKhT+Ep+p6i8InLF0XEME8A0qUR0niWebgQKBgQD6vkxR49B8ZZQrzjw4 +XKs1lI9cP7cgPiuWlDHMNjYou3WbOaGrMeScvbB1Ldh9A8pjAhxlw8AaV/xs4qcA +trmVmSISVMVyc1wSGlJXWi2nUzTNs9OE3vj22SyStihf8UUZtWwX2b5Y4JrYhA/V ++ThGGqHR03oLNLShNLtJc2c7YQKBgQDZ1nkibEyrepexw/fnwkw61IJKq9wRIh1G +PREakhbe9wU5ie0knuf9razt7awzQiwFmlixmWqsM7UEtLuXNnNPciwdrKhhbvrd +vD/rkbIEHEPllIhFlDtOzn3hRBWTzWmXFjpou/2LvHTSbVis4IYVZymTp2jb1ZLs +7VbiG9JTrQKBgQDc6n75g1szzpdehQT/r33U5j/syeJBUSU8NPMu9fB/sLHsgjlT +SNEf2+y1QSBE/Or6kmiMrIv7advn30W+Vj9qc5HWTsPrk4HiHTjA553jl2alebN5 +lK4LZspjtIQcC8mS3goPdXPEgJdM/gWpwzr2YQ6DfOxBJT2j7n64NyoT4QKBgH7/ +yx+GhCx1DHtXBPDZFhg2TL+78lEK0oZgk9gp06up2CHzh44SFq6O0oLkTcCUk5Ww +poTkLIy4mJBlzfgahp+KsK2cO46SZS9g0ONFzcMXt33hWpE2Gl2XhUwPpYTF/QlY +rDTjZK5S8Mi9dzVSsNlJi7PJphiEK2R1+nFYRwcBAoGBANWoIG85jpXAOnq/Kcgx +Rl3YivR0Ke6r1tFlP58rT7X3EkiboXyQl5vLIFCAwUte6RGrLl1dy3Qyh80B9ySL +Jx6vj42CK7vgv6A96TuVYhnXTnEI6ZvwAQ2VGaw4BizhjALs/kdSE/og9aSCs3ws +KQypwAFz0tbHxaNag/bSAN0J +-----END PRIVATE KEY----- + diff --git a/test/timing-cert.pem b/test/timing-cert.pem deleted file mode 100644 index cc17d3ffab..0000000000 --- a/test/timing-cert.pem +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdSb290 -IENBMCAXDTE2MDExNDIyMjk0NloYDzIxMTYwMTE1MjIyOTQ2WjAZMRcwFQYDVQQD -DA5zZXJ2ZXIuZXhhbXBsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANVdYGrf/GHuSKqMEUhDpW22Ul2qmEmxYZI1sfw6BCUMbXn/tNXJ6VwcO+Crs7h9 -o95tveDd11q/FEcRQl6mgtBhwX/dE0bmCYUHDvLU/Bpk0gqtIKsga5bwrczEGVNV -3AEdpLPvirRJU12KBRzx3OFEv8XX4ncZV1yXC3XuiENxD8pswbSyUKd3RmxYDxG/ -8XYkWq45QrdRZynh0FUwbxfkkeqt+CjCQ2+iZKn7nZiSYkg+6w1PgkqK/z9y7pa1 -rqHBmLrvfZB1bf9aUp6r9cB+0IdD24UHBw99OHr90dPuZR3T6jlqhzfuStPgDW71 -cKzCvfFu85KVXqnwoWWVk40CAwEAAaN9MHswHQYDVR0OBBYEFMDnhL/oWSczELBS -T1FSLwbWwHrNMB8GA1UdIwQYMBaAFHB/Lq6DaFmYBCMqzes+F80k3QFJMAkGA1Ud -EwQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwGQYDVR0RBBIwEIIOc2VydmVyLmV4 -YW1wbGUwDQYJKoZIhvcNAQELBQADggEBAHvTBEN1ig8RrsT716Ginv4gGNX0LzGI -RrZ1jO7lm5emuaPNYJpGw0iX5Zdo91qGNXPZaZ75X3S55pQTActq3OPEBOll2pyk -iyjz+Zp/v5cfRZLlBbFW5gv2R94eibYr4U3fSn4B0yPcl4xH/l/HzJhGDsSDW8qK -8VIJvmvsPwmL0JMCv+FR59F+NFYZdND/KCXet59WUpF9ICmFCoBEX3EyJXEPwhbi -X2sdPzJbCjx0HLli8e0HUKNttLQxCsBTRGo6iISLLamwN47mGDa9miBADwGSiz2q -YeeuLO02zToHhnQ6KbPXOrQAqcL1kngO4g+j/ru+4AZThFkdkGnltvk= ------END CERTIFICATE----- diff --git a/test/timing-key.pem b/test/timing-key.pem deleted file mode 100644 index a0b8e8dab2..0000000000 --- a/test/timing-key.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDVXWBq3/xh7kiq -jBFIQ6VttlJdqphJsWGSNbH8OgQlDG15/7TVyelcHDvgq7O4faPebb3g3ddavxRH -EUJepoLQYcF/3RNG5gmFBw7y1PwaZNIKrSCrIGuW8K3MxBlTVdwBHaSz74q0SVNd -igUc8dzhRL/F1+J3GVdclwt17ohDcQ/KbMG0slCnd0ZsWA8Rv/F2JFquOUK3UWcp -4dBVMG8X5JHqrfgowkNvomSp+52YkmJIPusNT4JKiv8/cu6Wta6hwZi6732QdW3/ -WlKeq/XAftCHQ9uFBwcPfTh6/dHT7mUd0+o5aoc37krT4A1u9XCswr3xbvOSlV6p -8KFllZONAgMBAAECggEADLTt7A+A2Vg2jamf0dztejY0e42QWjstI2b9PZc67fXq -gyx+WYkX07t+uWegYWliG/oPJ9guXiIpE/5sJHToL37S5kmFP2CtynVcJ4wVo4DD -nY0n9+kLX0bgIuS+2V6wpoRcbbbjXM9NHrH8kfe5ftT4UtEDlLI2qLX6IcDd7p4u -OYjILChR8GSGTw96yIy2Ws/1Uq9PMw64JoT4RcK5QqnkcPMDFRH1SeLOL+zXP2c4 -nEl9yOy3HauZKxwl/Ry/XK1s3DdjopIAU29ut+hAuMiTb06kzZnumL9NoplKoZtU -otw/gVcCKhT+Ep+p6i8InLF0XEME8A0qUR0niWebgQKBgQD6vkxR49B8ZZQrzjw4 -XKs1lI9cP7cgPiuWlDHMNjYou3WbOaGrMeScvbB1Ldh9A8pjAhxlw8AaV/xs4qcA -trmVmSISVMVyc1wSGlJXWi2nUzTNs9OE3vj22SyStihf8UUZtWwX2b5Y4JrYhA/V -+ThGGqHR03oLNLShNLtJc2c7YQKBgQDZ1nkibEyrepexw/fnwkw61IJKq9wRIh1G -PREakhbe9wU5ie0knuf9razt7awzQiwFmlixmWqsM7UEtLuXNnNPciwdrKhhbvrd -vD/rkbIEHEPllIhFlDtOzn3hRBWTzWmXFjpou/2LvHTSbVis4IYVZymTp2jb1ZLs -7VbiG9JTrQKBgQDc6n75g1szzpdehQT/r33U5j/syeJBUSU8NPMu9fB/sLHsgjlT -SNEf2+y1QSBE/Or6kmiMrIv7advn30W+Vj9qc5HWTsPrk4HiHTjA553jl2alebN5 -lK4LZspjtIQcC8mS3goPdXPEgJdM/gWpwzr2YQ6DfOxBJT2j7n64NyoT4QKBgH7/ -yx+GhCx1DHtXBPDZFhg2TL+78lEK0oZgk9gp06up2CHzh44SFq6O0oLkTcCUk5Ww -poTkLIy4mJBlzfgahp+KsK2cO46SZS9g0ONFzcMXt33hWpE2Gl2XhUwPpYTF/QlY -rDTjZK5S8Mi9dzVSsNlJi7PJphiEK2R1+nFYRwcBAoGBANWoIG85jpXAOnq/Kcgx -Rl3YivR0Ke6r1tFlP58rT7X3EkiboXyQl5vLIFCAwUte6RGrLl1dy3Qyh80B9ySL -Jx6vj42CK7vgv6A96TuVYhnXTnEI6ZvwAQ2VGaw4BizhjALs/kdSE/og9aSCs3ws -KQypwAFz0tbHxaNag/bSAN0J ------END PRIVATE KEY----- - diff --git a/test/timing.c b/test/timing.c deleted file mode 100644 index 9c3ada97e7..0000000000 --- a/test/timing.c +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - * - * I compiled this in the source tree this way: - * gcc -g -Iinclude a.c libcrypto.a -ldl -lpthread - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static char *prog = "./a.out"; - -static void readx509(const char *contents, int size) -{ - X509 *x = NULL; - BIO *b = BIO_new_mem_buf(contents, size); - - if (b == NULL) - ERR_print_errors_fp(stderr), exit(1); - PEM_read_bio_X509(b, &x, 0, NULL); - if (x == NULL) - ERR_print_errors_fp(stderr), exit(1); - X509_free(x); - BIO_free(b); -} - -static void readpkey(const char *contents, int size) -{ - BIO *b = BIO_new_mem_buf(contents, size); - EVP_PKEY *pkey; - - if (b == NULL) - ERR_print_errors_fp(stderr), exit(1); - pkey = PEM_read_bio_PrivateKey(b, NULL, NULL, NULL); - if (pkey == NULL) - ERR_print_errors_fp(stderr), exit(1); - - EVP_PKEY_free(pkey); - BIO_free(b); -} - - -static void print(const char *what, struct timeval *tp) -{ - printf("%s %ld sec %ld microsec\n", what, tp->tv_sec, tp->tv_usec); -} - -static void usage(void) -{ - fprintf(stderr, "Usage: %s [flags] pem-file\n", prog); - fprintf(stderr, "Flags:\n"); - fprintf(stderr, " -c # Repeat count\n"); - fprintf(stderr, " -d Debugging output (minimal)\n"); - fprintf(stderr, " -w C What to load C is a single character:\n"); - fprintf(stderr, " c for cert (default)\n"); - fprintf(stderr, " p for private key\n"); - exit(1); -} - -int main(int ac, char **av) -{ - int i, debug = 0, count = 100, what = 'c'; - struct stat sb; - FILE *fp; - char *contents; - struct rusage now, start, end, elapsed; - struct timeval e_start, e_end, e_elapsed; - - /* Parse JCL. */ - prog = av[0]; - while ((i = getopt(ac, av, "c:dw:")) != EOF) { - switch (i) { - default: - usage(); - case 'c': - if ((count = atoi(optarg)) < 0) - usage(); - break; - case 'd': - debug = 1; - break; - case 'w': - if (optarg[1] != '\0') - usage; - switch (*optarg) { - default: - usage(); - case 'c': - case 'p': - what = *optarg; - break; - } - break; - } - } - ac -= optind; - av += optind; - - /* Read input file. */ - if (av[0] == NULL) - usage(); - if (stat(av[0], &sb) < 0) - perror(av[0]), exit(1); - contents = malloc(sb.st_size + 1); - if (contents == NULL) - perror("malloc"), exit(1); - fp = fopen(av[0], "r"); - if (fread(contents, 1, sb.st_size, fp) != sb.st_size) - perror("fread"), exit(1); - contents[sb.st_size] = '\0'; - fclose(fp); - if (debug) - printf(">%s<\n", contents); - - /* Try to prep system cache, etc. */ - for (i = 10; --i >= 0; ) { - switch (what) { - case 'c': - readx509(contents, (int)sb.st_size); - break; - case 'p': - readpkey(contents, (int)sb.st_size); - break; - } - } - - if (gettimeofday(&e_start, NULL) < 0) - perror("elapsed start"), exit(1); - if (getrusage(RUSAGE_SELF, &start) < 0) - perror("start"), exit(1); - for (i = count; --i >= 0; ) { - switch (what) { - case 'c': - readx509(contents, (int)sb.st_size); - break; - case 'p': - readpkey(contents, (int)sb.st_size); - break; - } - } - if (getrusage(RUSAGE_SELF, &end) < 0) - perror("end"), exit(1); - if (gettimeofday(&e_end, NULL) < 0) - perror("end"), exit(1); - - timersub(&end.ru_utime, &start.ru_stime, &elapsed.ru_stime); - timersub(&end.ru_utime, &start.ru_utime, &elapsed.ru_utime); - timersub(&e_end, &e_start, &e_elapsed); - print("user ", &elapsed.ru_utime); - print("sys ", &elapsed.ru_stime); - if (debug) - print("elapsed??", &e_elapsed); - return 0; -} diff --git a/test/timing_load_creds.c b/test/timing_load_creds.c new file mode 100644 index 0000000000..5189dfec67 --- /dev/null +++ b/test/timing_load_creds.c @@ -0,0 +1,163 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static char *prog; + +static void readx509(const char *contents, int size) +{ + X509 *x = NULL; + BIO *b = BIO_new_mem_buf(contents, size); + + if (b == NULL) + ERR_print_errors_fp(stderr), exit(1); + PEM_read_bio_X509(b, &x, 0, NULL); + if (x == NULL) + ERR_print_errors_fp(stderr), exit(1); + X509_free(x); + BIO_free(b); +} + +static void readpkey(const char *contents, int size) +{ + BIO *b = BIO_new_mem_buf(contents, size); + EVP_PKEY *pkey; + + if (b == NULL) + ERR_print_errors_fp(stderr), exit(1); + pkey = PEM_read_bio_PrivateKey(b, NULL, NULL, NULL); + if (pkey == NULL) + ERR_print_errors_fp(stderr), exit(1); + + EVP_PKEY_free(pkey); + BIO_free(b); +} + + +static void print(const char *what, struct timeval *tp) +{ + printf("%s %ld sec %ld microsec\n", what, tp->tv_sec, tp->tv_usec); +} + +static void usage(void) +{ + fprintf(stderr, "Usage: %s [flags] pem-file\n", prog); + fprintf(stderr, "Flags:\n"); + fprintf(stderr, " -c # Repeat count\n"); + fprintf(stderr, " -d Debugging output (minimal)\n"); + fprintf(stderr, " -w C What to load C is a single character:\n"); + fprintf(stderr, " c for cert (default)\n"); + fprintf(stderr, " p for private key\n"); + exit(1); +} + +int main(int ac, char **av) +{ + int i, debug = 0, count = 100, what = 'c'; + struct stat sb; + FILE *fp; + char *contents; + struct rusage now, start, end, elapsed; + struct timeval e_start, e_end, e_elapsed; + + /* Parse JCL. */ + prog = av[0]; + while ((i = getopt(ac, av, "c:dw:")) != EOF) { + switch (i) { + default: + usage(); + case 'c': + if ((count = atoi(optarg)) < 0) + usage(); + break; + case 'd': + debug = 1; + break; + case 'w': + if (optarg[1] != '\0') + usage; + switch (*optarg) { + default: + usage(); + case 'c': + case 'p': + what = *optarg; + break; + } + break; + } + } + ac -= optind; + av += optind; + + /* Read input file. */ + if (av[0] == NULL) + usage(); + if (stat(av[0], &sb) < 0) + perror(av[0]), exit(1); + contents = malloc(sb.st_size + 1); + if (contents == NULL) + perror("malloc"), exit(1); + fp = fopen(av[0], "r"); + if (fread(contents, 1, sb.st_size, fp) != sb.st_size) + perror("fread"), exit(1); + contents[sb.st_size] = '\0'; + fclose(fp); + if (debug) + printf(">%s<\n", contents); + + /* Try to prep system cache, etc. */ + for (i = 10; --i >= 0; ) { + switch (what) { + case 'c': + readx509(contents, (int)sb.st_size); + break; + case 'p': + readpkey(contents, (int)sb.st_size); + break; + } + } + + if (gettimeofday(&e_start, NULL) < 0) + perror("elapsed start"), exit(1); + if (getrusage(RUSAGE_SELF, &start) < 0) + perror("start"), exit(1); + for (i = count; --i >= 0; ) { + switch (what) { + case 'c': + readx509(contents, (int)sb.st_size); + break; + case 'p': + readpkey(contents, (int)sb.st_size); + break; + } + } + if (getrusage(RUSAGE_SELF, &end) < 0) + perror("end"), exit(1); + if (gettimeofday(&e_end, NULL) < 0) + perror("end"), exit(1); + + timersub(&end.ru_utime, &start.ru_stime, &elapsed.ru_stime); + timersub(&end.ru_utime, &start.ru_utime, &elapsed.ru_utime); + timersub(&e_end, &e_start, &e_elapsed); + print("user ", &elapsed.ru_utime); + print("sys ", &elapsed.ru_stime); + if (debug) + print("elapsed??", &e_elapsed); + return 0; +} -- cgit v1.2.1