Hi All,
I am using jsvc to daemonize my java application, which runs on a Linux box. I get an error java.net.BindException: Permission denied. I get this only for ports < 1024 and I understand on linux to bind to any ports which are below 1024, you require root permission. Therefore I am launching my application as root. However I still am not able to get the privileges required. My JSVC arguments are as follows. jsvc.exec -debug -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8008 -jvm server -user root -home $JAVA_HOME -outfile /var/opt/myfile.out -pidfile /var/run/myfile.pid -errfile '&1' I am launching as root user and also in jsvc arguments I have specified "-user root", but am at a loss as to why I am still getting this exception, when I launch my jetty server. When I tried to launch it normally outside jsvc, it works fine. I have searched on the net, and also came across this message thread http://markmail.org/message/3mw6r2dievxvviu3#query:jsvc%20java.net.BindException%3A%20Permission%20denied+page:1+mid:j2w4dpzp4aaypun6+state:results where it suggested, that some system call had been modified and it worked thereafter, but did not find the details. Have run strace, but could not find any errors. On starting in debug mode, I see the following messages, 10/12/2008 18:55:30 6349 jsvc debug: user changed to 'root' 10/12/2008 18:55:30 6348 jsvc debug: User 'root' validated and I also don't see any errors. I was able to get past this problem, but this required me to modify jsvc source code and recompile and build. The problem is that in native/jsvc-unix.c before starting the service, the capability CAP_NET_BIND_SERVICE is being disabled for the controlled process, due to which my process is not able to bind to privileged ports 0 to 1024. To quote from the code, #ifdef OS_LINUX if (set_caps(0)!=0) log_debug("set_caps (0) failed"); return(4); #else I had to comment out this part and rebuild jsvc in order to ensure that my process is able to bind to privileged ports. I was wondering if there is any runtime option for jsvc to allow binding to privileged ports, but could not find any. As part of our project, we run our daemon with root user privileges and also require to be flexible to allow the user to specify any ports he wishes to. Since the project is newly supporting linux platforms it is turning out to be a blocker. We are left with the option of repackaging jsvc with the change. I understand that we do not want to allow non-root users to bind to privileged ports, but on linux devices if the controlled process is being run as superuser / root, can we do away with set_caps(0), like say. #ifdef OS_LINUX if(jsvc_user != SUPER_USER) if (set_caps(0)!=0) log_debug("set_caps (0) failed"); return(4); Please let me know if anyone on the list is aware of any other option. Also it would also be beneficial if i could know what the security issues are with making this change. From the commons user list, I came to know that there was a bug raised for the same. https://issues.apache.org/jira/browse/DAEMON-12 but could not find a resolution in that. Thanks, Srijith.