/* Test case by Horst von Brand <vonbrand@sleipnir.valparaiso.cl>
   and Ulrich Drepper <drepper@cygnus.com>.  */
#include <mntent.h>
#include <stdio.h>
#include <string.h>


int
main (int argc, char *argv[])
{
  int result = 0;
  struct mntent mef;
  struct mntent *mnt = &mef;
  FILE *fp;

  mef.mnt_fsname = strdupa ("/dev/hda1");
  mef.mnt_dir = strdupa ("/some dir");
  mef.mnt_type = strdupa ("ext2");
  mef.mnt_opts = strdupa ("defaults");
  mef.mnt_freq = 1;
  mef.mnt_passno = 2;

  if (hasmntopt (mnt, "defaults"))
    printf ("Found!\n");
  else
    {
      printf ("Didn't find it\n");
      result = 1;
    }

  fp = tmpfile ();
  if (fp == NULL)
    {
      printf ("Cannot open temporary file: %m\n");
      result = 1;
    }
  else
    {
      char buf[1024];

      /* Write the name entry.  */
      addmntent (fp, &mef);

      /* Prepare for reading.  */
      rewind (fp);

      /* First, read it raw.  */
      if (fgets (buf, sizeof (buf), fp) == NULL)
	{
	  printf ("Cannot read temporary file: %m");
	  result = 1;
	}
      else
	if (strcmp (buf, "/dev/hda1 /some\\040dir ext2 defaults 1 2\n") != 0)
	  {
	    puts ("Raw file data not correct");
	    result = 1;
	  }

      /* Prepare for reading, part II.  */
      rewind (fp);

      /* Now read it cooked.  */
      mnt = getmntent (fp);

      if (strcmp (mnt->mnt_fsname, "/dev/hda1") != 0
	  || strcmp (mnt->mnt_dir, "/some dir") != 0
	  || strcmp (mnt->mnt_type, "ext2") != 0
	  || strcmp (mnt->mnt_opts, "defaults") != 0
	  || mnt->mnt_freq != 1
	  || mnt->mnt_passno != 2)
	{
	  puts ("Error while reading written entry back in");
	  result = 1;
	}
    }

  return result;
}
