hi, > WHAT?!?! You are trying to run *MYSQL CLIENT* from kernel?!?! yes, i know it's not a good idea! i've rewritten my code using Jan and Tetsuo replies and wrote a user-space wrapper that gets the data, assemble the SQL, and 'execve' mysql client it works fine! thanks for your help! toni > > I believe it does not like value of HOME='/', or lacks some other > environment vairalbe or somethig, or does not like being called without > stdin, stdout and stderr or something like that. > > > the code is: (connection is a global structure) > > > > static void my_call_usermodehelper(void *data) { > > int err; > > struct sendbuffer_t *sendbuffer = data; > > > > /* prepare data */ > > sendbuffer->argv[0] = "/usr/bin/mysql"; > > sendbuffer->argv[1] = "--host='localhost'"; > > sendbuffer->argv[2] = "--user='user'"; > > sendbuffer->argv[3] = "--password='passwd'"; > > sprintf(tmp, "--execute=\"USE pnvoip; INSERT INTO connections > > (id,src_ip,src_port,dst_ip,dst_port,bytes,packets,start_time,finish_time) VALUES ('%s',%u,%d,%u,%d,%d,%d,'%lu','%lu');\"",connection->id,connection->saddr,connection->sport,connection->daddr,connection->dport,connection->bytes,connection->packets,connection->first_seen,connection->last_seen); > > sendbuffer->argv[4] = tmp; > > sendbuffer->argv[5] = NULL; > > > > sendbuffer->envp[0] = "HOME=/"; > > sendbuffer->envp[1] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin"; > > sendbuffer->envp[2] = NULL; > > > > printk(KERN_INFO "call_usermodehelper(%s %s %s %s %s %s); > > \n",sendbuffer->argv[0],sendbuffer->argv[1],sendbuffer->argv[2],sendbuffer->argv[3],sendbuffer->argv[4], sendbuffer->argv[5]); > > > > if ((err = call_usermodehelper(sendbuffer->argv[0], sendbuffer->argv, > > sendbuffer->envp, 0)) < 0) > > printk(KERN_INFO "exec mysql failed (error = %d)!\n", err); > > } > > > > the /var/log/messages file prints out: > > > > Jan 4 14:12:28 localhost kernel: call_usermodehelper(/usr/bin/mysql > > --host='localhost' --user='pnvoip_user' --password='pnvoip_passwd' > > --execute="USE pnvoip; INSERT INTO connections > > (callid,src_ip,src_port,dst_ip,dst_port,bytes,packets,start_time,finish_time) VALUES ('RTP_192.168.0.1.53_192.168.0.23.32790',16820416,53,385919168,32790,13560,1,'1136380346','1136380346'); COMMIT;" <NULL>); > > > > (this command is correct, i've pasted on a termnal and it adds a row to > > my table) > > Then the command is *NOT* correct! Because from the terminal, the shell > strips the quotes. But direct call to execve passes the arguments > exactly. And you do use a lot of quotes in the command. > > > any idea to solve that? or what it's not working? > > Well, you shouldn't be directly calling mysql client anyway. You should > be calling some wrapper that would get the data and assemble the SQL. > Why should the name of the table be hardcoded or even known to kernel? > > Also if you call it often, you should instead create some communication > channel (/proc entry, device or netlink socket) and have the process > hang on there, reading data you send to it and doing the database work. > -- toni <agar9938@xxxxxxxxxxxxxxxxxx> -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/