#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <fcntl.h>
#include <sys/openprom.h>
#include <sys/openpromio.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(int argc, char *argv[]) {
  int openprom;
  struct openpromio *property;
  int i;

  if ((property=(struct openpromio*)malloc(
				      sizeof(struct openpromio*) +
				      OPROMMAXPARAM))
      ==NULL) {
    fprintf(stderr, "%s cannot allocate mem.\n", argv[0]);
    exit(1);
  }
  memset(property->oprom_array, 0, OPROMMAXPARAM);
  property->oprom_size=OPROMMAXPARAM;

  fprintf(stderr,"%s: listing OpenPROM properties.\n",argv[0]);

  if ((openprom=open("/dev/openprom", O_RDWR)) == -1) {
    fprintf(stderr, "%s open: %s\n", argv[0], strerror(errno));
    exit(1);
  }
  for (i=-1;
       (property->oprom_size > 0) && (property->oprom_size=OPROMMAXPARAM);
       i++) {
    if (ioctl(openprom, OPROMNXTOPT, property)==-1) {
      fprintf(stderr, "%s ioctl(OPROMNXTOPT): %s\n", argv[0], strerror(errno));
      exit(1);
    }
    if (property->oprom_size != 0)
          puts(property->oprom_array);
  }
  close(openprom);

  fprintf(stderr, "%s: %d properties.\n", argv[0], i);

  return 0;
}
