def chooseUsbkey( notification ) oPanel = NSOpenPanel.openPanel [...] buttonClicked = oPanel.runModal if buttonClicked == NSOKButton files = oPanel.filenames @usbkey.setStringValue( files[ 0 ].to_s.gsub(/ /, ' ') ) end end
@usbkey est un NSTextField
oPanel.filenames retourne un tableau de NSString non ? Et si usbkey est un NSTextField, pourquoi faire un to_s ? De plus, le gsub est prématuré ici, l'utilisateur n'a pas à voir la cuisine interne. On va partir du principe qu'on en a pas besoin.
def getFolders( path ) fs = [ ] Dir.glob( "#{path}/*").each { |f| if FileTest.directory?(f) fs << File.basename(f) end } return fs end
La même chose en une ligne:
def getFolders(path) Dir.glob("#{path}/*").find_all { |f| File.directory?(f) } end
les excludes (éventuels) :
i.items.each {|ii| if ii.enabled == false excludes << "--exclude=#{ii.name}/" end }
En plus court et plus Ruby:
excludes = i.items.collect do |ii| "--exclude="#{ii.name}" unless ii.enabled end
La doc dit que "The arguments you pass in the arguments parameter are relayed to the new process's argv parameter" ce qui sous entendrait donc qu'il n'y a PAS besoin d'escaper les espaces...
if ( TYPE( RARRAY( args )->ptr[ i ] ) == T_STRING ) { cargs[ i ] = calloc( 255, 1 ); if( cargs[ i ] == NULL ) { [...] gestion d'une erreur } cargs[ i ] = strdup( RSTRING( RARRAY( args )->ptr[i] )->ptr ); }
man strdup:
"The strdup() function allocates sufficient memory for a copy of the string str, does the copy, and returns a pointer to it"
Ton cargs[ i ] = calloc( 255, 1 ) ne sert donc à rien et n'est qu'un gros leak.
int executeWithoutPrivileges( char *myToolPath, char **myArguments ) { FILE *comPipe = NULL; int i, fd; char *cmd;
Gné ? Et là il quoi il sert le strcpy ? Non seulement tu aimes bien faire des choses de la manière la plus compliquée possible, mais en plus tu aimes bien gaspiller la RAM ? :)
voilà, c'est tout ;-)
Eh ben y a du boulot... O:)
-- Luc Heinrich
unbewusst <yvon.thoraval@gmail.com> wrote:
def chooseUsbkey( notification )
oPanel = NSOpenPanel.openPanel
[...]
buttonClicked = oPanel.runModal
if buttonClicked == NSOKButton
files = oPanel.filenames
@usbkey.setStringValue( files[ 0 ].to_s.gsub(/ /, ' ') )
end
end
@usbkey est un NSTextField
oPanel.filenames retourne un tableau de NSString non ? Et si usbkey est
un NSTextField, pourquoi faire un to_s ? De plus, le gsub est prématuré
ici, l'utilisateur n'a pas à voir la cuisine interne. On va partir du
principe qu'on en a pas besoin.
def getFolders( path )
fs = [ ]
Dir.glob( "#{path}/*").each { |f|
if FileTest.directory?(f)
fs << File.basename(f)
end
}
return fs
end
La même chose en une ligne:
def getFolders(path)
Dir.glob("#{path}/*").find_all { |f| File.directory?(f) }
end
les excludes (éventuels) :
i.items.each {|ii|
if ii.enabled == false
excludes << "--exclude=#{ii.name}/"
end
}
En plus court et plus Ruby:
excludes = i.items.collect do |ii|
"--exclude="#{ii.name}" unless ii.enabled
end
La doc dit que "The arguments you pass in the arguments parameter are
relayed to the new process's argv parameter" ce qui sous entendrait donc
qu'il n'y a PAS besoin d'escaper les espaces...
if ( TYPE( RARRAY( args )->ptr[ i ] ) == T_STRING )
{
cargs[ i ] = calloc( 255, 1 );
if( cargs[ i ] == NULL )
{
[...] gestion d'une erreur
}
cargs[ i ] = strdup( RSTRING( RARRAY( args )->ptr[i] )->ptr );
}
man strdup:
"The strdup() function allocates sufficient memory for a copy of the
string str, does the copy, and returns a pointer to it"
Ton cargs[ i ] = calloc( 255, 1 ) ne sert donc à rien et n'est qu'un
gros leak.
int executeWithoutPrivileges( char *myToolPath, char **myArguments )
{
FILE *comPipe = NULL;
int i, fd;
char *cmd;
Gné ? Et là il quoi il sert le strcpy ? Non seulement tu aimes bien
faire des choses de la manière la plus compliquée possible, mais en plus
tu aimes bien gaspiller la RAM ? :)
def chooseUsbkey( notification ) oPanel = NSOpenPanel.openPanel [...] buttonClicked = oPanel.runModal if buttonClicked == NSOKButton files = oPanel.filenames @usbkey.setStringValue( files[ 0 ].to_s.gsub(/ /, ' ') ) end end
@usbkey est un NSTextField
oPanel.filenames retourne un tableau de NSString non ? Et si usbkey est un NSTextField, pourquoi faire un to_s ? De plus, le gsub est prématuré ici, l'utilisateur n'a pas à voir la cuisine interne. On va partir du principe qu'on en a pas besoin.
def getFolders( path ) fs = [ ] Dir.glob( "#{path}/*").each { |f| if FileTest.directory?(f) fs << File.basename(f) end } return fs end
La même chose en une ligne:
def getFolders(path) Dir.glob("#{path}/*").find_all { |f| File.directory?(f) } end
les excludes (éventuels) :
i.items.each {|ii| if ii.enabled == false excludes << "--exclude=#{ii.name}/" end }
En plus court et plus Ruby:
excludes = i.items.collect do |ii| "--exclude="#{ii.name}" unless ii.enabled end
La doc dit que "The arguments you pass in the arguments parameter are relayed to the new process's argv parameter" ce qui sous entendrait donc qu'il n'y a PAS besoin d'escaper les espaces...
if ( TYPE( RARRAY( args )->ptr[ i ] ) == T_STRING ) { cargs[ i ] = calloc( 255, 1 ); if( cargs[ i ] == NULL ) { [...] gestion d'une erreur } cargs[ i ] = strdup( RSTRING( RARRAY( args )->ptr[i] )->ptr ); }
man strdup:
"The strdup() function allocates sufficient memory for a copy of the string str, does the copy, and returns a pointer to it"
Ton cargs[ i ] = calloc( 255, 1 ) ne sert donc à rien et n'est qu'un gros leak.
int executeWithoutPrivileges( char *myToolPath, char **myArguments ) { FILE *comPipe = NULL; int i, fd; char *cmd;
Gné ? Et là il quoi il sert le strcpy ? Non seulement tu aimes bien faire des choses de la manière la plus compliquée possible, mais en plus tu aimes bien gaspiller la RAM ? :)
voilà, c'est tout ;-)
Eh ben y a du boulot... O:)
-- Luc Heinrich
unbewusst
On 10 sep, 10:45, (Luc Heinrich) wrote:
Eh ben y a du boulot... O:)
OK, yaduboulot )))
merci beaucoup, j'ai modifié ce que tu m'as donné dans ton précédent message, + une simplification perso :
dans mon fichier "rosxauth.c" (le fichier C ext to ruby) :
VALUE m_exec_without_priv( VALUE self, VALUE toolPath, VALUE args ) { char *cmd; int i, len, fd;
quand j'utilise les privileges root, pas de pb, tout se passe bien.
par contre quand je n'utilise pas les privilèges root, je reviens au pb de départ, rsync (la version Boyd) me dit :
link_stat "/Volumes/EMTEC" failed: No such file or directory
donc là, il y a bien un pb avec l'espace entre EMTEC et KEY...
Yvon
luc
unbewusst wrote:
par contre quand je n'utilise pas les privilèges root, je reviens au pb de départ...
Et pour cause.
man popen: "The command argument is a pointer to a null-terminated string containing a shell command line. This command is passed to /bin/sh using the -c flag; interpretation, if any, is performed by the shell."
Ce qui veut dire que dans ce cas tu *dois* escaper la commande et les paramètres ou les mettre entre "". Perso je ferais ça du coté Ruby, ton code C est toujours aussi dangeureux. Tu en fais beaucoup trop du coté C.
-- Luc Heinrich
unbewusst <yvon.thoraval@gmail.com> wrote:
par contre quand je n'utilise pas les privilèges root, je reviens au
pb de départ...
Et pour cause.
man popen:
"The command argument is a pointer to a null-terminated string
containing a shell command line. This command is passed to /bin/sh
using the -c flag; interpretation, if any, is performed by the shell."
Ce qui veut dire que dans ce cas tu *dois* escaper la commande et les
paramètres ou les mettre entre "". Perso je ferais ça du coté Ruby, ton
code C est toujours aussi dangeureux. Tu en fais beaucoup trop du coté
C.
par contre quand je n'utilise pas les privilèges root, je reviens au pb de départ...
Et pour cause.
man popen: "The command argument is a pointer to a null-terminated string containing a shell command line. This command is passed to /bin/sh using the -c flag; interpretation, if any, is performed by the shell."
Ce qui veut dire que dans ce cas tu *dois* escaper la commande et les paramètres ou les mettre entre "". Perso je ferais ça du coté Ruby, ton code C est toujours aussi dangeureux. Tu en fais beaucoup trop du coté C.