#### 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;
         }