diff --git a/src/driver/record.cpp b/src/driver/record.cpp index 2db21c4c0..b1b2a74ba 100644 --- a/src/driver/record.cpp +++ b/src/driver/record.cpp @@ -234,7 +234,7 @@ bool CRecordInstance::Stop(bool remove_event) if((autoshift && g_settings.auto_delete) /* || autoshift_delete*/) { snprintf(buf,sizeof(buf), "nice -n 20 rm -f \"%s.ts\" &", filename); - my_system("/bin/sh", "-c", buf); + my_system(3, "/bin/sh", "-c", buf); snprintf(buf,sizeof(buf), "%s.xml", filename); //autoshift_delete = false; unlink(buf); diff --git a/src/gui/hdd_menu.cpp b/src/gui/hdd_menu.cpp index 0609f067c..926cfba64 100644 --- a/src/gui/hdd_menu.cpp +++ b/src/gui/hdd_menu.cpp @@ -284,10 +284,10 @@ int CHDDDestExec::exec(CMenuTarget* /*parent*/, const std::string&) if(hdparm_link){ //hdparm -M is not included in busybox hdparm! - my_system(hdparm, S_opt, opt); + my_system(3, hdparm, S_opt, opt); }else{ snprintf(M_opt, sizeof(M_opt),"-M%d", g_settings.hdd_noise); - my_system(hdparm, M_opt, S_opt, opt); + my_system(4, hdparm, M_opt, S_opt, opt); } free(namelist[i]); } @@ -332,7 +332,7 @@ int CHDDFmtExec::exec(CMenuTarget* /*parent*/, const std::string& key) if(res != CMessageBox::mbrYes) return 0; - bool srun = my_system("killall", "-9", "smbd"); + bool srun = my_system(3, "killall", "-9", "smbd"); //res = check_and_umount(dst); res = check_and_umount(src, dst); @@ -468,7 +468,7 @@ int CHDDFmtExec::exec(CMenuTarget* /*parent*/, const std::string& key) sleep(2); printf("CHDDFmtExec: executing %s %s\n","/sbin/tune2fs -r 0 -c 0 -i 0", src); - my_system("/sbin/tune2fs", "-r 0", "-c 0", "-i 0", src); + my_system(5, "/sbin/tune2fs", "-r 0", "-c 0", "-i 0", src); _remount: progress->hide(); @@ -502,7 +502,7 @@ _remount: sync(); } _return: - if(!srun) my_system("smbd",NULL); + if (!srun) my_system(1, "smbd"); return menu_return::RETURN_REPAINT; } @@ -522,7 +522,7 @@ int CHDDChkExec::exec(CMenuTarget* /*parent*/, const std::string& key) printf("CHDDChkExec: key %s\n", key.c_str()); - bool srun = my_system("killall", "-9", "smbd"); + bool srun = my_system(3, "killall", "-9", "smbd"); //res = check_and_umount(dst); res = check_and_umount(src, dst); @@ -606,6 +606,6 @@ ret1: } printf("CHDDChkExec: mount res %d\n", res); - if(!srun) my_system("smbd",NULL); + if (!srun) my_system(1, "smbd"); return menu_return::RETURN_REPAINT; } diff --git a/src/gui/moviebrowser.cpp b/src/gui/moviebrowser.cpp index 7ef9bfef9..91a9b57ba 100644 --- a/src/gui/moviebrowser.cpp +++ b/src/gui/moviebrowser.cpp @@ -3628,7 +3628,7 @@ int CDirMenu::exec(CMenuTarget* parent, const std::string & actionKey) if(dirState[number] == DIR_STATE_SERVER_DOWN) { printf("try to start server: %s %s\n","ether-wake", g_settings.network_nfs_mac[dirNfsMountNr[number]]); - if(my_system("ether-wake", g_settings.network_nfs_mac[dirNfsMountNr[number]]) != 0) + if (my_system(2, "ether-wake", g_settings.network_nfs_mac[dirNfsMountNr[number]]) != 0) perror("ether-wake failed"); dirOptionText[number]="STARTE SERVER"; diff --git a/src/gui/network_service.cpp b/src/gui/network_service.cpp index b2971471e..9668f1e2e 100644 --- a/src/gui/network_service.cpp +++ b/src/gui/network_service.cpp @@ -74,7 +74,7 @@ void CNetworkService::Start() { std::string cmd = command + " " + options; printf("CNetworkService::Start: %s %s\n", command.c_str(), options.c_str()); - my_system("/bin/sh", "-c", cmd.c_str()); + my_system(3, "/bin/sh", "-c", cmd.c_str()); enabled = true; TouchFile(); } @@ -83,7 +83,7 @@ void CNetworkService::Stop() { const char killall []= "killall"; printf("CNetworkService::Stop: %s %s\n", killall, command.c_str()); - my_system(killall, command.c_str()); + my_system(2, killall, command.c_str()); enabled = false; TouchFile(); } diff --git a/src/gui/plugins.cpp b/src/gui/plugins.cpp index 2698ad2f7..32640b4eb 100644 --- a/src/gui/plugins.cpp +++ b/src/gui/plugins.cpp @@ -589,7 +589,7 @@ void CPlugins::startPlugin(int number,int /*param*/) g_RCInput->stopInput(); //frameBuffer->setMode(720, 576, 8 * sizeof(fb_pixel_t)); printf("Starting %s\n", plugin_list[number].pluginfile.c_str()); - my_system(plugin_list[number].pluginfile.c_str(), NULL, NULL); + my_system(2, plugin_list[number].pluginfile.c_str(), NULL); //frameBuffer->setMode(720, 576, 8 * sizeof(fb_pixel_t)); frameBuffer->paintBackground(); g_RCInput->restartInput(); diff --git a/src/gui/settings_manager.cpp b/src/gui/settings_manager.cpp index 9bb4f3c60..c4aa9f735 100644 --- a/src/gui/settings_manager.cpp +++ b/src/gui/settings_manager.cpp @@ -108,7 +108,7 @@ int CSettingsManager::exec(CMenuTarget* parent, const std::string &actionKey) { const char backup_sh[] = "/bin/backup.sh"; printf("backup: executing [%s %s]\n",backup_sh, fileBrowser.getSelectedFile()->Name.c_str()); - my_system( backup_sh, fileBrowser.getSelectedFile()->Name.c_str() ); + my_system(2, backup_sh, fileBrowser.getSelectedFile()->Name.c_str()); } else ShowMsgUTF(LOCALE_MESSAGEBOX_ERROR, g_Locale->getText(LOCALE_SETTINGS_BACKUP_FAILED),CMessageBox::mbrBack, CMessageBox::mbBack, NEUTRINO_ICON_ERROR); @@ -126,7 +126,7 @@ int CSettingsManager::exec(CMenuTarget* parent, const std::string &actionKey) { const char restore_sh[] = "/bin/restore.sh"; printf("restore: executing [%s %s]\n", restore_sh, fileBrowser.getSelectedFile()->Name.c_str()); - my_system( restore_sh, fileBrowser.getSelectedFile()->Name.c_str() ); + my_system(2, restore_sh, fileBrowser.getSelectedFile()->Name.c_str()); } } return res; diff --git a/src/gui/update.cpp b/src/gui/update.cpp index 51ed5e007..e41437d9d 100644 --- a/src/gui/update.cpp +++ b/src/gui/update.cpp @@ -512,7 +512,7 @@ int CFlashUpdate::exec(CMenuTarget* parent, const std::string &actionKey) printf("[update] calling %s %s %s\n",install_sh, g_settings.update_dir, filename.c_str() ); #else printf("[update] calling %s %s %s\n",install_sh, g_settings.update_dir, filename.c_str() ); - my_system( install_sh, g_settings.update_dir, filename.c_str() ); + my_system(3, install_sh, g_settings.update_dir, filename.c_str()); #endif showGlobalStatus(100); ShowHintUTF(LOCALE_MESSAGEBOX_INFO, g_Locale->getText(LOCALE_FLASHUPDATE_READY)); // UTF-8 diff --git a/src/gui/update_ext.cpp b/src/gui/update_ext.cpp index 601b11647..2b7d67824 100644 --- a/src/gui/update_ext.cpp +++ b/src/gui/update_ext.cpp @@ -107,7 +107,7 @@ bool CExtUpdate::ErrorReset(bool modus, const std::string & msg1, const std::str if (modus & RESET_UNLOAD) { umount(mountPkt.c_str()); - my_system("rmmod", mtdramDriver.c_str()); + my_system(2,"rmmod", mtdramDriver.c_str()); } if (modus & RESET_FD1) close(fd1); @@ -231,7 +231,7 @@ bool CExtUpdate::applySettings() // load mtdram driver snprintf(buf1, sizeof(buf1), "total_size=%d", mtdSize/1024); snprintf(buf2, sizeof(buf2), "erase_size=%d", mtdEraseSize/1024); - my_system("insmod", mtdramDriver.c_str(), buf1, buf2); + my_system(4, "insmod", mtdramDriver.c_str(), buf1, buf2); // check if mtdram driver is now loaded if (!isMtdramLoad()) return ErrorReset(0, "error load mtdram driver"); diff --git a/src/neutrino.cpp b/src/neutrino.cpp index e926926f4..bec73577e 100644 --- a/src/neutrino.cpp +++ b/src/neutrino.cpp @@ -1876,8 +1876,8 @@ TIMER_START(); #ifndef ASSUME_MDEV mkdir("/media/sda1", 0755); mkdir("/media/sdb1", 0755); - my_system("mount", "/dev/sda1", "/media/sda1"); - my_system("mount", "/dev/sdb1", "/media/sdb1"); + my_system(3, "mount", "/dev/sda1", "/media/sda1"); + my_system(3, "mount", "/dev/sdb1", "/media/sdb1"); #endif CFSMounter::automount(); @@ -2675,7 +2675,7 @@ _repeat: for(int i=0 ; i < NETWORK_NFS_NR_OF_ENTRIES ; i++) { if (strcmp(g_settings.network_nfs_local_dir[i],recordingDir) == 0) { printf("[neutrino] waking up %s (%s)\n",g_settings.network_nfs_ip[i].c_str(),recordingDir); - if(my_system("ether-wake",g_settings.network_nfs_mac[i]) != 0) + if (my_system(2, "ether-wake", g_settings.network_nfs_mac[i]) != 0) perror("ether-wake failed"); break; } @@ -2940,9 +2940,9 @@ void CNeutrinoApp::ExitRun(const bool /*write_si*/, int retcode) mode = mode_off; //CVFD::getInstance()->ShowText(g_Locale->getText(LOCALE_MAINMENU_SHUTDOWN)); - my_system("/etc/init.d/rcK"); + my_system(2,"/etc/init.d/rcK"); sync(); - my_system("/bin/umount", "-a"); + my_system(2,"/bin/umount", "-a"); sleep(1); { standby_data_t standby; diff --git a/src/system/configure_network.cpp b/src/system/configure_network.cpp index ff927a375..bcb086917 100644 --- a/src/system/configure_network.cpp +++ b/src/system/configure_network.cpp @@ -222,7 +222,7 @@ void CNetworkConfig::startNetwork(void) #ifdef DEBUG printf("CNetworkConfig::startNetwork: %s\n", cmd.c_str()); #endif - my_system("/bin/sh", "-c", cmd.c_str()); + my_system(3, "/bin/sh", "-c", cmd.c_str()); if (!inet_static) { init_vars(); @@ -236,7 +236,7 @@ void CNetworkConfig::stopNetwork(void) #ifdef DEBUG printf("CNetworkConfig::stopNetwork: %s\n", cmd.c_str()); #endif - my_system("/bin/sh", "-c", cmd.c_str()); + my_system(3, "/bin/sh", "-c", cmd.c_str()); } diff --git a/src/system/helpers.cpp b/src/system/helpers.cpp index 46f45cae9..3fa3c81d7 100644 --- a/src/system/helpers.cpp +++ b/src/system/helpers.cpp @@ -37,7 +37,7 @@ #include #include #include -#include +#include #include #include @@ -70,12 +70,32 @@ int my_system(const char * cmd) if (!file_exists(cmd)) return -1; - return my_system(cmd, NULL); + return my_system(1, cmd); } -int my_system(const char * cmd, const char * arg1, const char * arg2, const char * arg3, const char * arg4, const char * arg5, const char * arg6) +int my_system(int argc, const char *arg, ...) { - int i=0 ,ret=0, childExit=0; + int i = 0, ret = 0, childExit = 0; +#define ARGV_MAX 64 + /* static right now but could be made dynamic if necessary */ + int argv_max = ARGV_MAX; + const char *argv[ARGV_MAX]; + va_list args; + argv[0] = arg; + va_start(args, arg); + + while(++i < argc) + { + if (i == argv_max) + { + fprintf(stderr, "my_system: too many arguments!\n"); + return -1; + } + argv[i] = va_arg(args, const char *); + } + argv[i] = NULL; /* sentinel */ + //fprintf(stderr,"%s:", __func__);for(i=0;argv[i];i++)fprintf(stderr," '%s'",argv[i]);fprintf(stderr,"\n"); + pid_t pid; int maxfd = getdtablesize();// sysconf(_SC_OPEN_MAX); switch (pid = vfork()) @@ -88,9 +108,9 @@ int my_system(const char * cmd, const char * arg1, const char * arg2, const char close(i); if (setsid() == -1) perror("my_system setsid"); - if(execlp(cmd, cmd, arg1, arg2, arg3, arg4, arg5, arg6, (char*)NULL)) + if (execvp(argv[0], (char * const *)argv)) { - std::string txt = "ERROR: my_system \"" + (std::string) cmd + "\""; + std::string txt = "ERROR: my_system \"" + (std::string) argv[0] + "\""; perror(txt.c_str()); ret = -1; } @@ -101,6 +121,7 @@ int my_system(const char * cmd, const char * arg1, const char * arg2, const char waitpid(pid, &childExit, 0); if(childExit != 0) ret = childExit; + va_end(args); return ret; } diff --git a/src/system/helpers.h b/src/system/helpers.h index 59d04a8bb..c87adb71f 100644 --- a/src/system/helpers.h +++ b/src/system/helpers.h @@ -22,9 +22,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -int my_system(const char * cmd, const char * arg1, const char * arg2 = NULL, const char * arg3 = NULL, const char * arg4 = NULL, const char * arg5 = NULL, const char * arg6 = NULL); - int my_system(const char * cmd); +int my_system(int argc, const char *arg, ...); /* argc is number of arguments including command */ FILE* my_popen( pid_t& pid, const char *cmdstring, const char *type); int safe_mkdir(char * path); diff --git a/src/system/setting_helpers.cpp b/src/system/setting_helpers.cpp index 81d1418f8..8689d68f9 100644 --- a/src/system/setting_helpers.cpp +++ b/src/system/setting_helpers.cpp @@ -441,7 +441,7 @@ bool CTZChangeNotifier::changeNotify(const neutrino_locale_t, void * Data) printf("Timezone: %s -> %s\n", name.c_str(), zone.c_str()); std::string cmd = "cp /usr/share/zoneinfo/" + zone + " /etc/localtime"; printf("exec %s\n", cmd.c_str()); - my_system("/bin/sh", "-c", cmd.c_str()); + my_system(3,"/bin/sh", "-c", cmd.c_str()); cmd = ":" + zone; setenv("TZ", cmd.c_str(), 1); } @@ -464,7 +464,7 @@ int CDataResetNotifier::exec(CMenuTarget* /*parent*/, const std::string& actionK return true; if(delete_all) { - my_system("/bin/sh", "-c", "rm -f /var/tuxbox/config/zapit/*.conf"); + my_system(3, "/bin/sh", "-c", "rm -f /var/tuxbox/config/zapit/*.conf"); CServiceManager::getInstance()->SatelliteList().clear(); CZapit::getInstance()->LoadSettings(); CZapit::getInstance()->GetConfig(zapitCfg); @@ -484,7 +484,7 @@ int CDataResetNotifier::exec(CMenuTarget* /*parent*/, const std::string& actionK CFrameBuffer::getInstance()->Clear(); } if(delete_chan) { - my_system("/bin/sh", "-c", "rm -f /var/tuxbox/config/zapit/*.xml"); + my_system(3, "/bin/sh", "-c", "rm -f /var/tuxbox/config/zapit/*.xml"); g_Zapit->reinitChannels(); } return ret;