[PD-dev] [PD] Problem in os x 10.5.1?

Miller Puckette mpuckett at imusic1.ucsd.edu
Fri Feb 1 18:03:19 CET 2008


Aha, somehow I had persuaded myself that teh problem was when starting from
the "App" (in which case Tcl/TK fork/execs pd) but now I gather it's when
you start Pd from a shell so that it starts Tcl/Tk instead.  I'll go try
that and see if I can make it fail for me :)

M

On Fri, Feb 01, 2008 at 08:54:17AM -0600, Russell Bryant wrote:
> David Plans Casal wrote:
> > I can't quite tell why it's complaining (since we -do- call execl),  
> > but of course there is a whole lot of sprintf going on between the  
> > two, so...
> 
> It's extremely unlikely that any of the string handling is the problem.
> However, there are also a bunch of calls to stat() as well as a call to
> seteuid() which are more likely.
> 
> > Any suggestions, anyone?
> 
> Try the attached patch to see if moving building the sys_guicmd to before the
> fork fixes it.  If it doesn't, try commenting out the call to seteuid().
> Between those two, you should be able to find out what it's complaining about.
> 
> On a sidenote, the string handling here is not safe.  It will crash if the path
> to your home directory is a lot longer than usual ...
> 
> --
> Russell Bryant

> Index: s_inter.c
> ===================================================================
> RCS file: /cvsroot/pure-data/pd/src/s_inter.c,v
> retrieving revision 1.22
> diff -u -r1.22 s_inter.c
> --- s_inter.c	16 Jan 2008 21:54:11 -0000	1.22
> +++ s_inter.c	1 Feb 2008 14:43:37 -0000
> @@ -1018,6 +1018,73 @@
>  
>  
>  #ifdef UNISTD
> +        if (!sys_guicmd) {
> +#ifdef __APPLE__
> +            char *homedir = getenv("HOME"), filename[250];
> +            struct stat statbuf;
> +                /* first look for Wish bundled with and renamed "Pd" */
> +            sprintf(filename, "%s/../../MacOS/Pd", guidir);
> +            if (stat(filename, &statbuf) >= 0)
> +                goto foundit;
> +            if (!homedir || strlen(homedir) > 150)
> +                goto nohomedir;
> +                /* Look for Wish in user's Applications.  Might or might
> +                not be names "Wish Shell", and might or might not be
> +                in "Utilities" subdir. */
> +            sprintf(filename,
> +                "%s/Applications/Utilities/Wish shell.app/Contents/MacOS/Wish Shell",
> +                    homedir);
> +            if (stat(filename, &statbuf) >= 0)
> +                goto foundit;
> +            sprintf(filename,
> +                "%s/Applications/Utilities/Wish.app/Contents/MacOS/Wish",
> +                    homedir);
> +            if (stat(filename, &statbuf) >= 0)
> +                goto foundit;
> +            sprintf(filename,
> +                "%s/Applications/Wish shell.app/Contents/MacOS/Wish Shell",
> +                    homedir);
> +            if (stat(filename, &statbuf) >= 0)
> +                goto foundit;
> +            sprintf(filename,
> +                "%s/Applications/Wish.app/Contents/MacOS/Wish",
> +                    homedir);
> +            if (stat(filename, &statbuf) >= 0)
> +                goto foundit;
> +        nohomedir:
> +                /* Perform the same search among system applications. */
> +            strcpy(filename, 
> +                "/usr/bin/wish");
> +            if (stat(filename, &statbuf) >= 0)
> +                goto foundit;
> +            strcpy(filename, 
> +                "/Applications/Utilities/Wish Shell.app/Contents/MacOS/Wish Shell");
> +            if (stat(filename, &statbuf) >= 0)
> +                goto foundit;
> +            strcpy(filename, 
> +                "/Applications/Utilities/Wish.app/Contents/MacOS/Wish");
> +            if (stat(filename, &statbuf) >= 0)
> +                goto foundit;
> +            strcpy(filename, 
> +                "/Applications/Wish Shell.app/Contents/MacOS/Wish Shell");
> +            if (stat(filename, &statbuf) >= 0)
> +                goto foundit;
> +            strcpy(filename, 
> +                "/Applications/Wish.app/Contents/MacOS/Wish");
> +        foundit:
> +            sprintf(cmdbuf, "\"%s\" %s/pd.tk %d\n", filename, guidir, portno);
> +#else
> +            sprintf(cmdbuf,
> +                "TCL_LIBRARY=\"%s/tcl/library\" TK_LIBRARY=\"%s/tk/library\" \
> +                 \"%s/pd-gui\" %d\n",
> +                 sys_libdir->s_name, sys_libdir->s_name, guidir, portno);
> +#endif
> +            sys_guicmd = cmdbuf;
> +        }
> +
> +        if (sys_verbose) 
> +            fprintf(stderr, "%s", sys_guicmd);
> +
>          childpid = fork();
>          if (childpid < 0)
>          {
> @@ -1045,75 +1112,10 @@
>                  }
>              }
>  #endif
> -            if (!sys_guicmd)
> -            {
> -#ifdef __APPLE__
> -                char *homedir = getenv("HOME"), filename[250];
> -                struct stat statbuf;
> -                    /* first look for Wish bundled with and renamed "Pd" */
> -                sprintf(filename, "%s/../../MacOS/Pd", guidir);
> -                if (stat(filename, &statbuf) >= 0)
> -                    goto foundit;
> -                if (!homedir || strlen(homedir) > 150)
> -                    goto nohomedir;
> -                    /* Look for Wish in user's Applications.  Might or might
> -                    not be names "Wish Shell", and might or might not be
> -                    in "Utilities" subdir. */
> -                sprintf(filename,
> -                    "%s/Applications/Utilities/Wish shell.app/Contents/MacOS/Wish Shell",
> -                        homedir);
> -                if (stat(filename, &statbuf) >= 0)
> -                    goto foundit;
> -                sprintf(filename,
> -                    "%s/Applications/Utilities/Wish.app/Contents/MacOS/Wish",
> -                        homedir);
> -                if (stat(filename, &statbuf) >= 0)
> -                    goto foundit;
> -                sprintf(filename,
> -                    "%s/Applications/Wish shell.app/Contents/MacOS/Wish Shell",
> -                        homedir);
> -                if (stat(filename, &statbuf) >= 0)
> -                    goto foundit;
> -                sprintf(filename,
> -                    "%s/Applications/Wish.app/Contents/MacOS/Wish",
> -                        homedir);
> -                if (stat(filename, &statbuf) >= 0)
> -                    goto foundit;
> -            nohomedir:
> -                    /* Perform the same search among system applications. */
> -                strcpy(filename, 
> -                    "/usr/bin/wish");
> -                if (stat(filename, &statbuf) >= 0)
> -                    goto foundit;
> -                strcpy(filename, 
> -                    "/Applications/Utilities/Wish Shell.app/Contents/MacOS/Wish Shell");
> -                if (stat(filename, &statbuf) >= 0)
> -                    goto foundit;
> -                strcpy(filename, 
> -                    "/Applications/Utilities/Wish.app/Contents/MacOS/Wish");
> -                if (stat(filename, &statbuf) >= 0)
> -                    goto foundit;
> -                strcpy(filename, 
> -                    "/Applications/Wish Shell.app/Contents/MacOS/Wish Shell");
> -                if (stat(filename, &statbuf) >= 0)
> -                    goto foundit;
> -                strcpy(filename, 
> -                    "/Applications/Wish.app/Contents/MacOS/Wish");
> -            foundit:
> -                sprintf(cmdbuf, "\"%s\" %s/pd.tk %d\n", filename, guidir, portno);
> -#else
> -                sprintf(cmdbuf,
> -"TCL_LIBRARY=\"%s/tcl/library\" TK_LIBRARY=\"%s/tk/library\" \
> - \"%s/pd-gui\" %d\n",
> -                    sys_libdir->s_name, sys_libdir->s_name, guidir, portno);
> -#endif
> -                sys_guicmd = cmdbuf;
> -            }
> -            if (sys_verbose) fprintf(stderr, "%s", sys_guicmd);
>              execl("/bin/sh", "sh", "-c", sys_guicmd, (char*)0);
>              perror("pd: exec");
>              _exit(1);
> -        }
> +       }
>  #endif /* UNISTD */
>  
>  #ifdef MSW

> _______________________________________________
> PD-dev mailing list
> PD-dev at iem.at
> http://lists.puredata.info/listinfo/pd-dev





More information about the Pd-dev mailing list