#### 10.4.4 `wordexp` Example ¶

Here is an example of using `wordexp` to expand several strings and use the results to run a shell command. It also shows the use of `WRDE_APPEND` to concatenate the expansions and of `wordfree` to free the space allocated by `wordexp`.

    int
    expand_and_execute (const char *program, const char **options)
    {
      wordexp_t result;
      pid_t pid
      int status, i;

      /* Expand the string for the program to run.  */
      switch (wordexp (program, &result, 0))
        {
        case 0:			/* Successful.  */
          break;
        case WRDE_NOSPACE:
          /* If the error was WRDE_NOSPACE,
             then perhaps part of the result was allocated.  */
          wordfree (&result);
        default:                    /* Some other error.  */
          return -1;
        }

      /* Expand the strings specified for the arguments.  */
      for (i = 0; options[i] != NULL; i++)
        {
          if (wordexp (options[i], &result, WRDE_APPEND))
            {
              wordfree (&result);
              return -1;
            }
        }

      pid = fork ();
      if (pid == 0)
        {
          /* This is the child process.  Execute the command. */
          execv (result.we_wordv[0], result.we_wordv);
          exit (EXIT_FAILURE);
        }
      else if (pid < 0)
        /* The fork failed.  Report failure.  */
        status = -1;
      else
        /* This is the parent process.  Wait for the child to complete.  */
        if (waitpid (pid, &status, 0) != pid)
          status = -1;

      wordfree (&result);
      return status;
    }