On 27 May 2010, at 11:52, Ken Thomases wrote:

>> I have a daemon that spawns NSTasks on request. A task is passed a number of 
>> paths to process. These paths are pased correctly to the task, and in the 
>> task I can correctly extract the path string from optarg.
> 
> No, they aren't and no you can't, according to what you write below.

Thanks so much for the elaborate and pertinent answer Ken. You are right. I was 
not passing the arguments correctly to the task.

I was creating the arguments like this:

    [args addObject:[NSString stringWithFormat:@"-f \"%...@\"", 
[[sourceDirectoryURL path] stringByAppendingPathComponent:sourceFileName]]];

Whereas, I now understand (hopefully correctly), I should have been creating 
them like this:

    [args addObject:[NSString stringWithFormat:@"-f%@", [[sourceDirectoryURL 
path] stringByAppendingPathComponent:sourceFileName]]];

> Why do you think the string is in Mac Roman encoding?  It probably isn't.  In 
> fact, I happen to know that NSTask converts all of its arguments to "file 
> system representation".  Even if I didn't know that, that's the only correct 
> thing to assume.  So, you should use the following to construct an NSString 
> from optarg:
> 
>       NSString* path = [[NSFileManager 
> defaultManager]stringWithFileSystemRepresentation:optarg 
> length:strlen(optarg)];

It's been a while since I wrote the original code for this, but if memory 
serves me correctly, I modelled this after some sample code, and since it 
worked, I did not question it. I have adjusted the path extraction to use the 
more correct stringWithFileSystemRepresentation: call instead. 

> You are almost certainly confused about the need to quote and escape things 
> for the shell.  The shell needs to take what it receives as a single command 
> string and break it up into its component parts.  That's what introduces the 
> need to quote whitespace and escape special characters  when working in the 
> shell.
> 
> By contrast, NSTask is handed its arguments already neatly separated out into 
> individual elements.  Plus, it doesn't have any special characters -- it just 
> treats all of its arguments literally. Thus, it does not require that its 
> arguments be quoted or escaped.  Indeed, if you try to do so, those 
> characters are just passed along to the new process.

Confused I was indeed (although I did not know it). This is new territory for 
me, so I'm not surprised I stumble a bit as I plod through it. :-)

> So, I guess that you have taken a file path string in the parent process and, 
> while attempting to pass it through to a subprocess verbatim, you've done 
> exactly the wrong thing.  You've modified it, putting quote marks around it 
> and, apparently, a space before it.  If you had done nothing with the string 
> but pass it in as one of the task's arguments, _that_ would have gotten it to 
> the subprocess verbatim.

Yes. Now that I pass the option's identifier with its parameter appended snugly 
to it (without quotes and separating space char) the URL is created correctly.

Kind regards,
António


----------------------------------------------------
Disapprove of sin but not of the sinner
----------------------------------------------------


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to