This source file includes following definitions.
- getloadavg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79 #include <config.h>
80
81
82 #include <stdlib.h>
83
84 #include <errno.h>
85 #include <stdbool.h>
86 #include <stdio.h>
87
88 # include <sys/types.h>
89
90 # if HAVE_SYS_PARAM_H
91 # include <sys/param.h>
92 # endif
93
94 # include "intprops.h"
95
96 # if defined _WIN32 && ! defined __CYGWIN__ && ! defined WINDOWS32
97 # define WINDOWS32
98 # endif
99
100 # ifdef NeXT
101
102
103
104 # undef BSD
105
106
107
108 # undef FSCALE
109 # endif
110
111
112 # ifdef __GNU__
113 # undef BSD
114 # undef FSCALE
115 # endif
116
117
118
119
120
121
122
123 # if defined (HPUX) && !defined (hpux)
124 # define hpux
125 # endif
126
127 # if defined (__hpux) && !defined (hpux)
128 # define hpux
129 # endif
130
131 # if defined (__sun) && !defined (sun)
132 # define sun
133 # endif
134
135 # if defined (hp300) && !defined (hpux)
136 # define MORE_BSD
137 # endif
138
139 # if defined (__SVR4) && !defined (SVR4)
140 # define SVR4
141 # endif
142
143 # if (defined (sun) && defined (SVR4)) || defined (SOLARIS2)
144 # define SUNOS_5
145 # endif
146
147 # if defined (__osf__) && (defined (__alpha) || defined (__alpha__))
148 # define OSF_ALPHA
149 # include <sys/mbuf.h>
150 # include <sys/socket.h>
151 # include <net/route.h>
152 # include <sys/table.h>
153
154 # undef sys
155 # endif
156
157 # if defined (__osf__) && (defined (mips) || defined (__mips__))
158 # define OSF_MIPS
159 # include <sys/table.h>
160 # endif
161
162
163
164 # ifndef LOAD_AVE_TYPE
165
166 # ifdef MORE_BSD
167 # define LOAD_AVE_TYPE long
168 # endif
169
170 # ifdef sun
171 # define LOAD_AVE_TYPE long
172 # endif
173
174 # ifdef sgi
175 # define LOAD_AVE_TYPE long
176 # endif
177
178 # ifdef SVR4
179 # define LOAD_AVE_TYPE long
180 # endif
181
182 # ifdef OSF_ALPHA
183 # define LOAD_AVE_TYPE long
184 # endif
185
186 # if defined _AIX && ! defined HAVE_LIBPERFSTAT
187 # define LOAD_AVE_TYPE long
188 # endif
189
190 # endif
191
192 # ifdef OSF_ALPHA
193
194
195 # undef FSCALE
196 # define FSCALE 1024.0
197 # endif
198
199
200 # ifndef FSCALE
201
202
203
204 # ifdef MORE_BSD
205 # define FSCALE 2048.0
206 # endif
207
208 # if defined (MIPS) || defined (SVR4)
209 # define FSCALE 256
210 # endif
211
212 # if defined (sgi)
213
214
215 # undef FSCALE
216 # define FSCALE 1000.0
217 # endif
218
219 # if defined _AIX && !defined HAVE_LIBPERFSTAT
220 # define FSCALE 65536.0
221 # endif
222
223 # endif
224
225 # if !defined (LDAV_CVT) && defined (FSCALE)
226 # define LDAV_CVT(n) (((double) (n)) / FSCALE)
227 # endif
228
229 # ifndef NLIST_STRUCT
230 # if HAVE_NLIST_H
231 # define NLIST_STRUCT
232 # endif
233 # endif
234
235 # if defined (sgi) || (defined (mips) && !defined (BSD))
236 # define FIXUP_KERNEL_SYMBOL_ADDR(nl) ((nl)[0].n_value &= ~(1 << 31))
237 # endif
238
239
240 # if !defined (KERNEL_FILE) && defined (hpux)
241 # define KERNEL_FILE "/hp-ux"
242 # endif
243
244 # if !defined (KERNEL_FILE) && (defined (MIPS) || defined (SVR4) || defined (ISC) || defined (sgi))
245 # define KERNEL_FILE "/unix"
246 # endif
247
248
249 # if !defined (LDAV_SYMBOL) && (defined (hpux) || defined (SVR4) || defined (ISC) || defined (sgi) || (defined (_AIX) && !defined(HAVE_LIBPERFSTAT)))
250 # define LDAV_SYMBOL "avenrun"
251 # endif
252
253 # ifdef HAVE_UNISTD_H
254 # include <unistd.h>
255 # endif
256
257
258
259 # if !defined (LOAD_AVE_TYPE) && (defined (BSD) || defined (LDAV_CVT) || defined (KERNEL_FILE) || defined (LDAV_SYMBOL))
260 # define LOAD_AVE_TYPE double
261 # endif
262
263 # ifdef LOAD_AVE_TYPE
264
265 # ifndef __VMS
266 # if !(defined __linux__ || defined __ANDROID__)
267 # ifndef NLIST_STRUCT
268 # include <a.out.h>
269 # else
270 # include <nlist.h>
271 # endif
272
273 # ifdef SUNOS_5
274 # include <kvm.h>
275 # include <kstat.h>
276 # endif
277
278 # if defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC)
279 # include <sys/pstat.h>
280 # endif
281
282 # ifndef KERNEL_FILE
283 # define KERNEL_FILE "/vmunix"
284 # endif
285
286 # ifndef LDAV_SYMBOL
287 # define LDAV_SYMBOL "_avenrun"
288 # endif
289 # endif
290
291 # else
292
293 # ifndef eunice
294 # include <iodef.h>
295 # include <descrip.h>
296 # else
297 # include <vms/iodef.h>
298 # endif
299 # endif
300
301 # ifndef LDAV_CVT
302 # define LDAV_CVT(n) ((double) (n))
303 # endif
304
305 # endif
306
307 # if defined HAVE_LIBPERFSTAT
308 # include <sys/protosw.h>
309 # include <libperfstat.h>
310 # include <sys/proc.h>
311 # ifndef SBITS
312 # define SBITS 16
313 # endif
314 # endif
315
316 # if defined (__GNU__) && !defined (NeXT)
317
318
319
320 # define NeXT
321 # define host_self mach_host_self
322 # endif
323
324 # ifdef NeXT
325 # ifdef HAVE_MACH_MACH_H
326 # include <mach/mach.h>
327 # else
328 # include <mach.h>
329 # endif
330 # endif
331
332 # ifdef sgi
333 # include <sys/sysmp.h>
334 # endif
335
336 # ifdef UMAX
337 # include <signal.h>
338 # include <sys/time.h>
339 # include <sys/wait.h>
340 # include <sys/syscall.h>
341
342 # ifdef UMAX_43
343 # include <machine/cpu.h>
344 # include <inq_stats/statistics.h>
345 # include <inq_stats/sysstats.h>
346 # include <inq_stats/cpustats.h>
347 # include <inq_stats/procstats.h>
348 # else
349 # include <sys/sysdefs.h>
350 # include <sys/statistics.h>
351 # include <sys/sysstats.h>
352 # include <sys/cpudefs.h>
353 # include <sys/cpustats.h>
354 # include <sys/procstats.h>
355 # endif
356 # endif
357
358 # ifdef DGUX
359 # include <sys/dg_sys_info.h>
360 # endif
361
362 # if (defined __linux__ || defined __ANDROID__ \
363 || defined __CYGWIN__ || defined SUNOS_5 \
364 || (defined LOAD_AVE_TYPE && ! defined __VMS))
365 # include <fcntl.h>
366 # endif
367
368
369
370 # ifdef NeXT
371 static processor_set_t default_set;
372 static bool getloadavg_initialized;
373 # endif
374
375 # ifdef UMAX
376 static unsigned int cpus = 0;
377 static unsigned int samples;
378 # endif
379
380 # ifdef DGUX
381 static struct dg_sys_info_load_info load_info;
382 # endif
383
384 # if !defined (HAVE_LIBKSTAT) && defined (LOAD_AVE_TYPE)
385
386 static int channel;
387
388 static bool getloadavg_initialized;
389
390 static long offset;
391
392 # if ! defined __VMS && ! defined sgi && ! (defined __linux__ || defined __ANDROID__)
393 static struct nlist name_list[2];
394 # endif
395
396 # ifdef SUNOS_5
397 static kvm_t *kd;
398 # endif
399
400 # endif
401
402
403
404
405
406
407 int
408 getloadavg (double loadavg[], int nelem)
409 {
410 int elem = 0;
411
412 # ifdef NO_GET_LOAD_AVG
413 # define LDAV_DONE
414 errno = ENOSYS;
415 elem = -1;
416 # endif
417
418 # if !defined (LDAV_DONE) && defined (HAVE_LIBKSTAT)
419
420 # define LDAV_DONE
421 kstat_ctl_t *kc;
422 kstat_t *ksp;
423 kstat_named_t *kn;
424 int saved_errno;
425
426 kc = kstat_open ();
427 if (kc == NULL)
428 return -1;
429 ksp = kstat_lookup (kc, "unix", 0, "system_misc");
430 if (ksp == NULL)
431 return -1;
432 if (kstat_read (kc, ksp, 0) == -1)
433 return -1;
434
435
436 kn = kstat_data_lookup (ksp, "avenrun_1min");
437 if (kn == NULL)
438 {
439
440 nelem = 0;
441 elem = -1;
442 }
443
444 if (nelem >= 1)
445 loadavg[elem++] = (double) kn->value.ul / FSCALE;
446
447 if (nelem >= 2)
448 {
449 kn = kstat_data_lookup (ksp, "avenrun_5min");
450 if (kn != NULL)
451 {
452 loadavg[elem++] = (double) kn->value.ul / FSCALE;
453
454 if (nelem >= 3)
455 {
456 kn = kstat_data_lookup (ksp, "avenrun_15min");
457 if (kn != NULL)
458 loadavg[elem++] = (double) kn->value.ul / FSCALE;
459 }
460 }
461 }
462
463 saved_errno = errno;
464 kstat_close (kc);
465 errno = saved_errno;
466 # endif
467
468 # if !defined (LDAV_DONE) && defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC)
469
470
471 # define LDAV_DONE
472 # undef LOAD_AVE_TYPE
473
474 struct pst_dynamic dyn_info;
475 if (pstat_getdynamic (&dyn_info, sizeof (dyn_info), 0, 0) < 0)
476 return -1;
477 if (nelem > 0)
478 loadavg[elem++] = dyn_info.psd_avg_1_min;
479 if (nelem > 1)
480 loadavg[elem++] = dyn_info.psd_avg_5_min;
481 if (nelem > 2)
482 loadavg[elem++] = dyn_info.psd_avg_15_min;
483
484 # endif
485
486 # if ! defined LDAV_DONE && defined HAVE_LIBPERFSTAT
487 # define LDAV_DONE
488 # undef LOAD_AVE_TYPE
489
490 {
491 perfstat_cpu_total_t cpu_stats;
492 int result = perfstat_cpu_total (NULL, &cpu_stats, sizeof cpu_stats, 1);
493 if (result == -1)
494 return result;
495 loadavg[0] = cpu_stats.loadavg[0] / (double)(1 << SBITS);
496 loadavg[1] = cpu_stats.loadavg[1] / (double)(1 << SBITS);
497 loadavg[2] = cpu_stats.loadavg[2] / (double)(1 << SBITS);
498 elem = 3;
499 }
500 # endif
501
502 # if !defined (LDAV_DONE) && (defined __linux__ || defined __ANDROID__ || defined __CYGWIN__)
503
504 # define LDAV_DONE
505 # undef LOAD_AVE_TYPE
506
507 # ifndef LINUX_LDAV_FILE
508 # define LINUX_LDAV_FILE "/proc/loadavg"
509 # endif
510
511 char ldavgbuf[3 * (INT_STRLEN_BOUND (int) + sizeof ".00 ")];
512 char const *ptr = ldavgbuf;
513 int fd, count, saved_errno;
514
515 fd = open (LINUX_LDAV_FILE, O_RDONLY | O_CLOEXEC);
516 if (fd == -1)
517 return -1;
518 count = read (fd, ldavgbuf, sizeof ldavgbuf - 1);
519 saved_errno = errno;
520 (void) close (fd);
521 errno = saved_errno;
522 if (count <= 0)
523 return -1;
524 ldavgbuf[count] = '\0';
525
526 for (elem = 0; elem < nelem; elem++)
527 {
528 double numerator = 0;
529 double denominator = 1;
530
531 while (*ptr == ' ')
532 ptr++;
533
534
535
536 if (! ('0' <= *ptr && *ptr <= '9'))
537 {
538 if (elem == 0)
539 {
540 errno = ENOTSUP;
541 return -1;
542 }
543 break;
544 }
545
546 while ('0' <= *ptr && *ptr <= '9')
547 numerator = 10 * numerator + (*ptr++ - '0');
548
549 if (*ptr == '.')
550 for (ptr++; '0' <= *ptr && *ptr <= '9'; ptr++)
551 numerator = 10 * numerator + (*ptr - '0'), denominator *= 10;
552
553 loadavg[elem] = numerator / denominator;
554 }
555
556 return elem;
557
558 # endif
559
560 # if !defined (LDAV_DONE) && defined (__NetBSD__)
561 # define LDAV_DONE
562 # undef LOAD_AVE_TYPE
563
564 # ifndef NETBSD_LDAV_FILE
565 # define NETBSD_LDAV_FILE "/kern/loadavg"
566 # endif
567
568 unsigned long int load_ave[3], scale;
569 int count;
570 char readbuf[4 * INT_BUFSIZE_BOUND (unsigned long int) + 1];
571 int fd = open (NETBSD_LDAV_FILE, O_RDONLY | O_CLOEXEC);
572 if (fd < 0)
573 return fd;
574 int nread = read (fd, readbuf, sizeof readbuf - 1);
575 int err = errno;
576 close (fd);
577 if (nread < 0)
578 {
579 errno = err;
580 return -1;
581 }
582 readbuf[nread] = '\0';
583 count = sscanf (readbuf, "%lu %lu %lu %lu\n",
584 &load_ave[0], &load_ave[1], &load_ave[2],
585 &scale);
586 if (count != 4)
587 {
588 errno = ENOTSUP;
589 return -1;
590 }
591
592 for (elem = 0; elem < nelem; elem++)
593 loadavg[elem] = (double) load_ave[elem] / (double) scale;
594
595 return elem;
596
597 # endif
598
599 # if !defined (LDAV_DONE) && defined (NeXT)
600 # define LDAV_DONE
601
602
603 host_t host;
604 struct processor_set_basic_info info;
605 unsigned int info_count;
606
607
608
609
610 if (!getloadavg_initialized)
611 {
612 if (processor_set_default (host_self (), &default_set) == KERN_SUCCESS)
613 getloadavg_initialized = true;
614 }
615
616 if (getloadavg_initialized)
617 {
618 info_count = PROCESSOR_SET_BASIC_INFO_COUNT;
619 if (processor_set_info (default_set, PROCESSOR_SET_BASIC_INFO, &host,
620 (processor_set_info_t) &info, &info_count)
621 != KERN_SUCCESS)
622 getloadavg_initialized = false;
623 else
624 {
625 if (nelem > 0)
626 loadavg[elem++] = (double) info.load_average / LOAD_SCALE;
627 }
628 }
629
630 if (!getloadavg_initialized)
631 {
632 errno = ENOTSUP;
633 return -1;
634 }
635 # endif
636
637 # if !defined (LDAV_DONE) && defined (UMAX)
638 # define LDAV_DONE
639
640
641
642
643
644 struct proc_summary proc_sum_data;
645 struct stat_descr proc_info;
646 double load;
647 register unsigned int i, j;
648
649 if (cpus == 0)
650 {
651 register unsigned int c, i;
652 struct cpu_config conf;
653 struct stat_descr desc;
654
655 desc.sd_next = 0;
656 desc.sd_subsys = SUBSYS_CPU;
657 desc.sd_type = CPUTYPE_CONFIG;
658 desc.sd_addr = (char *) &conf;
659 desc.sd_size = sizeof conf;
660
661 if (inq_stats (1, &desc))
662 return -1;
663
664 c = 0;
665 for (i = 0; i < conf.config_maxclass; ++i)
666 {
667 struct class_stats stats;
668 memset (&stats, 0, sizeof stats);
669
670 desc.sd_type = CPUTYPE_CLASS;
671 desc.sd_objid = i;
672 desc.sd_addr = (char *) &stats;
673 desc.sd_size = sizeof stats;
674
675 if (inq_stats (1, &desc))
676 return -1;
677
678 c += stats.class_numcpus;
679 }
680 cpus = c;
681 samples = cpus < 2 ? 3 : (2 * cpus / 3);
682 }
683
684 proc_info.sd_next = 0;
685 proc_info.sd_subsys = SUBSYS_PROC;
686 proc_info.sd_type = PROCTYPE_SUMMARY;
687 proc_info.sd_addr = (char *) &proc_sum_data;
688 proc_info.sd_size = sizeof (struct proc_summary);
689 proc_info.sd_sizeused = 0;
690
691 if (inq_stats (1, &proc_info) != 0)
692 return -1;
693
694 load = proc_sum_data.ps_nrunnable;
695 j = 0;
696 for (i = samples - 1; i > 0; --i)
697 {
698 load += proc_sum_data.ps_nrun[j];
699 if (j++ == PS_NRUNSIZE)
700 j = 0;
701 }
702
703 if (nelem > 0)
704 loadavg[elem++] = load / samples / cpus;
705 # endif
706
707 # if !defined (LDAV_DONE) && defined (DGUX)
708 # define LDAV_DONE
709
710
711
712 dg_sys_info ((long int *) &load_info,
713 DG_SYS_INFO_LOAD_INFO_TYPE,
714 DG_SYS_INFO_LOAD_VERSION_0);
715
716 if (nelem > 0)
717 loadavg[elem++] = load_info.one_minute;
718 if (nelem > 1)
719 loadavg[elem++] = load_info.five_minute;
720 if (nelem > 2)
721 loadavg[elem++] = load_info.fifteen_minute;
722 # endif
723
724 # if !defined (LDAV_DONE) && defined (apollo)
725 # define LDAV_DONE
726
727
728
729
730
731
732
733
734
735
736 extern void proc1_$get_loadav ();
737 unsigned long load_ave[3];
738
739 proc1_$get_loadav (load_ave);
740
741 if (nelem > 0)
742 loadavg[elem++] = load_ave[0] / 65536.0;
743 if (nelem > 1)
744 loadavg[elem++] = load_ave[1] / 65536.0;
745 if (nelem > 2)
746 loadavg[elem++] = load_ave[2] / 65536.0;
747 # endif
748
749 # if !defined (LDAV_DONE) && defined (OSF_MIPS)
750 # define LDAV_DONE
751
752 struct tbl_loadavg load_ave;
753 table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave));
754 loadavg[elem++]
755 = (load_ave.tl_lscale == 0
756 ? load_ave.tl_avenrun.d[0]
757 : (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale));
758 # endif
759
760 # if !defined (LDAV_DONE) && (defined (__MSDOS__) || defined (WINDOWS32))
761
762 # define LDAV_DONE
763
764
765 for ( ; elem < nelem; elem++)
766 {
767 loadavg[elem] = 0.0;
768 }
769 # endif
770
771 # if !defined (LDAV_DONE) && defined (OSF_ALPHA)
772 # define LDAV_DONE
773
774 struct tbl_loadavg load_ave;
775 table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave));
776 for (elem = 0; elem < nelem; elem++)
777 loadavg[elem]
778 = (load_ave.tl_lscale == 0
779 ? load_ave.tl_avenrun.d[elem]
780 : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale));
781 # endif
782
783 # if ! defined LDAV_DONE && defined __VMS
784
785
786 LOAD_AVE_TYPE load_ave[3];
787 static bool getloadavg_initialized;
788 # ifdef eunice
789 struct
790 {
791 int dsc$w_length;
792 char *dsc$a_pointer;
793 } descriptor;
794 # endif
795
796
797 if (!getloadavg_initialized)
798 {
799
800 # ifdef eunice
801 descriptor.dsc$w_length = 18;
802 descriptor.dsc$a_pointer = "$$VMS_LOAD_AVERAGE";
803 # else
804 $DESCRIPTOR (descriptor, "LAV0:");
805 # endif
806 if (sys$assign (&descriptor, &channel, 0, 0) & 1)
807 getloadavg_initialized = true;
808 }
809
810
811 if (getloadavg_initialized
812 && !(sys$qiow (0, channel, IO$_READVBLK, 0, 0, 0,
813 load_ave, 12, 0, 0, 0, 0) & 1))
814 {
815 sys$dassgn (channel);
816 getloadavg_initialized = false;
817 }
818
819 if (!getloadavg_initialized)
820 {
821 errno = ENOTSUP;
822 return -1;
823 }
824 # endif
825
826 # if ! defined LDAV_DONE && defined LOAD_AVE_TYPE && ! defined __VMS
827
828
829
830
831 # define LDAV_PRIVILEGED
832
833 LOAD_AVE_TYPE load_ave[3];
834
835
836 if (offset == 0)
837 {
838 # ifndef sgi
839 # if ! defined NLIST_STRUCT || ! defined N_NAME_POINTER
840 strcpy (name_list[0].n_name, LDAV_SYMBOL);
841 strcpy (name_list[1].n_name, "");
842 # else
843 # ifdef HAVE_STRUCT_NLIST_N_UN_N_NAME
844 name_list[0].n_un.n_name = LDAV_SYMBOL;
845 name_list[1].n_un.n_name = 0;
846 # else
847 name_list[0].n_name = LDAV_SYMBOL;
848 name_list[1].n_name = 0;
849 # endif
850 # endif
851
852 # ifndef SUNOS_5
853 if (
854 # if !defined (_AIX)
855 nlist (KERNEL_FILE, name_list)
856 # else
857 knlist (name_list, 1, sizeof (name_list[0]))
858 # endif
859 >= 0)
860
861 {
862 # ifdef FIXUP_KERNEL_SYMBOL_ADDR
863 FIXUP_KERNEL_SYMBOL_ADDR (name_list);
864 # endif
865 offset = name_list[0].n_value;
866 }
867 # endif
868 # else
869 ptrdiff_t ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN);
870 if (ldav_off != -1)
871 offset = (long int) ldav_off & 0x7fffffff;
872 # endif
873 }
874
875
876 if (!getloadavg_initialized)
877 {
878 # ifndef SUNOS_5
879 int fd = open ("/dev/kmem", O_RDONLY | O_CLOEXEC);
880 if (0 <= fd)
881 {
882 channel = fd;
883 getloadavg_initialized = true;
884 }
885 # else
886
887
888 kd = kvm_open (0, 0, 0, O_RDONLY, 0);
889 if (kd != NULL)
890 {
891
892 kvm_nlist (kd, name_list);
893 offset = name_list[0].n_value;
894 getloadavg_initialized = true;
895 }
896 # endif
897 }
898
899
900 if (offset && getloadavg_initialized)
901 {
902
903 # ifndef SUNOS_5
904 if (lseek (channel, offset, 0) == -1L
905 || read (channel, (char *) load_ave, sizeof (load_ave))
906 != sizeof (load_ave))
907 {
908 close (channel);
909 getloadavg_initialized = false;
910 }
911 # else
912 if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave))
913 != sizeof (load_ave))
914 {
915 kvm_close (kd);
916 getloadavg_initialized = false;
917 }
918 # endif
919 }
920
921 if (offset == 0 || !getloadavg_initialized)
922 {
923 errno = ENOTSUP;
924 return -1;
925 }
926 # endif
927
928 # if !defined (LDAV_DONE) && defined (LOAD_AVE_TYPE)
929 if (nelem > 0)
930 loadavg[elem++] = LDAV_CVT (load_ave[0]);
931 if (nelem > 1)
932 loadavg[elem++] = LDAV_CVT (load_ave[1]);
933 if (nelem > 2)
934 loadavg[elem++] = LDAV_CVT (load_ave[2]);
935
936 # define LDAV_DONE
937 # endif
938
939 # if !defined LDAV_DONE
940 errno = ENOSYS;
941 elem = -1;
942 # endif
943 return elem;
944 }