int main(void) { int fd1, fd2; struct stat *stat; changedir("/testdir/test"); { safe_mkdir("/testdir/test/dir0/"); assert(mkdir("testfile") != 0 && mkdir("../test/dir0/") != 0); assert(mkdir("dir0/dir1/dir2") != 0); safe_mkdir("dir0/dir1/"); fd1 = safe_open("file1", O_CREAT | O_RDWR | O_EXCL); fd2 = safe_open("file1", O_CREAT | O_RDWR); stat = safe_fstat(fd1); assert(stat->st_nlinks == 1); stat = safe_fstat(fd2); assert(stat->st_nlinks == 1); assert(open("file1", O_CREAT | O_EXCL) < 0); changedir("."); safe_link("file1", "dir0/dir1/file2"); changedir("."); stat = safe_fstat(fd1); assert(stat->st_nlinks == 2); } changedir("dir0/dir1"); { assert(unlink("dir0/dir1") != 0); safe_unlink("/testdir/test/dir0/dir1/file2"); safe_unlink("/testdir/test/dir0/dir1"); stat = safe_fstat(fd1); assert(stat->st_nlinks == 1); } changedir("/testdir/test/dir0"); { safe_unlink("../file1"); safe_unlink("../dir0"); } changedir("/testdir/test"); printf("sfs_dirtest2 pass.\n"); return 0; }
static int mkdir_p(const char *path, int mask) { int res; char *ptok; char pt[PATH_MAX]; char bp[PATH_MAX]; if (!path || strlen(path) == 0) { errno = EINVAL; return -1; } if (strlen(path) > PATH_MAX) { errno = E2BIG; return -1; } res = 0; pt[0] = bp[0] = '\0'; strcpy(bp, path); ptok = strtok(bp, "/"); if (ptok == NULL) return safe_mkdir(path, mask); do { if (ptok != bp) strcat(pt, "/"); strcat(pt, ptok); res = safe_mkdir(pt, mask); if (res != 0) return res; } while ((ptok = strtok(NULL, "/")) != NULL); return 0; }
void os_mkdir(const char *path0) { char path[FILENAME_MAX] = {'\0'}; unsigned int len; char *p; len = snprintf(path, sizeof(path), "%s", path0); if (len >= sizeof(path)) ERR("Path is too long: %s", path0); if (len == 0) ERR("empty path"); if (path[len-1] == SEP) path[len-1] = END; for (p = path; *p != END; ++p) { if (*p == SEP) { *p = END; UC(safe_mkdir(path)); *p = SEP; } } UC(safe_mkdir(path)); }
void plugin_exec(void) { CFileBrowser fileBrowser; CFileFilter fileFilter; CMoviePlayerGui tmpMoviePlayerGui; fileFilter.addFilter("vob"); fileBrowser.Filter = &fileFilter; fileBrowser.Multi_Select = true; fileBrowser.Dirs_Selectable = false; std::string Path_dvd = "/mnt/dvd"; // create mount path safe_mkdir((char *)Path_dvd.c_str()); // mount selected iso image char cmd[128]; sprintf(cmd, "mount -o loop /media/hdd/dvd.iso %s", (char *)Path_dvd.c_str()); system(cmd); DVD_BROWSER: if(fileBrowser.exec(Path_dvd.c_str())) { Path_dvd = fileBrowser.getCurrentDir(); CFileList::const_iterator files = fileBrowser.getSelectedFiles().begin(); for(; files != fileBrowser.getSelectedFiles().end(); files++) { CFile file; file.Name = files->Name; tmpMoviePlayerGui.addToPlaylist(file); } tmpMoviePlayerGui.exec(NULL, "urlplayback"); neutrino_msg_t msg; neutrino_msg_data_t data; g_RCInput->getMsg_ms(&msg, &data, 10); if (msg != CRCInput::RC_home) { goto DVD_BROWSER; } } }
void SaveServices(bool tocopy) { transponder_id_t tpid = 0; FILE * fd = 0; bool updated = 0; tallchans_iterator ccI; tallchans_iterator dI; transponder_list_t::iterator tI; char tpstr[256]; bool tpdone = 0; bool satdone = 0; int processed = 0; sat_iterator_t spos_it; updated = 0; dprintf(DEBUG_INFO, "total channels: %d\n", allchans.size()); fd = fopen(SERVICES_TMP, "w"); if(!fd) { perror(SERVICES_TMP); return; } // headers fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<zapit api=\"3\">\n"); // loop througth satpos for (spos_it = satellitePositions.begin(); spos_it != satellitePositions.end(); spos_it++) { satdone = 0; // loop througth TPs for(tI = transponders.begin(); tI != transponders.end(); tI++) { t_satellite_position satpos = GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first) & 0xFFF; tpdone = 0; if(GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first) & 0xF000) satpos = -satpos; if(satpos != spos_it->first) { dprintf(DEBUG_DEBUG, "Sat position %d not found !!\n", satpos); continue; } switch(spos_it->second.type) { case DVB_S: sprintf(tpstr, "\t\t<TS id=\"%04x\" on=\"%04x\" frq=\"%u\" inv=\"%hu\" sr=\"%u\" fec=\"%hu\" pol=\"%hu\">\n", tI->second.transport_stream_id, tI->second.original_network_id, tI->second.feparams.frequency, tI->second.feparams.inversion, tI->second.feparams.u.qpsk.symbol_rate, tI->second.feparams.u.qpsk.fec_inner, tI->second.polarization); break; case DVB_C: sprintf(tpstr, "\t\t<TS id=\"%04x\" on=\"%04x\" frq=\"%u\" inv=\"%hu\" sr=\"%u\" fec=\"%hu\" mod=\"%hu\">\n", tI->second.transport_stream_id, tI->second.original_network_id, tI->second.feparams.frequency, tI->second.feparams.inversion, tI->second.feparams.u.qam.symbol_rate, tI->second.feparams.u.qam.fec_inner, tI->second.feparams.u.qam.modulation); break; case DVB_T: sprintf(tpstr, "\t\t<TS id=\"%04x\" on=\"%04x\" frq=\"%u\" inv=\"%hu\" band=\"%hu\" HP=\"%hu\" LP=\"%hu\" const=\"%hu\" trans=\"%hu\" guard=\"%hu\" hierarchy=\"%hu\">\n", tI->second.transport_stream_id, tI->second.original_network_id, tI->second.feparams.frequency, tI->second.feparams.inversion, tI->second.feparams.u.ofdm.bandwidth, tI->second.feparams.u.ofdm.code_rate_HP, tI->second.feparams.u.ofdm.code_rate_LP, tI->second.feparams.u.ofdm.constellation,tI->second.feparams.u.ofdm.transmission_mode, tI->second.feparams.u.ofdm.guard_interval, tI->second.feparams.u.ofdm.hierarchy_information); break; default: break; } tpid = tI->first; // loop througth channels for (ccI = allchans.begin(); ccI != allchans.end(); ccI++) { if(ccI->second.getTransponderId() == tpid) { if(!satdone) { switch(spos_it->second.type) { case DVB_S: { fprintf(fd, "\t<sat name=\"%s\" position=\"%hd\" diseqc=\"%hd\" uncommited=\"%hd\">\n",spos_it->second.name.c_str(), spos_it->first, spos_it->second.diseqc, spos_it->second.uncommited); } break; case DVB_C: { fprintf(fd, "\t<cable name=\"%s\">\n", spos_it->second.name.c_str()); } break; case DVB_T: { fprintf(fd, "\t<terrestrial name=\"%s\">\n", spos_it->second.name.c_str()); } break; default: break; } satdone = 1; } if(!tpdone) { fprintf(fd, "%s", tpstr); tpdone = 1; } if(ccI->second.getPidsFlag()) { fprintf(fd, "\t\t\t<S i=\"%04x\" n=\"%s\" v=\"%x\" a=\"%x\" p=\"%x\" pmt=\"%x\" tx=\"%x\" t=\"%x\" vt=\"%d\" s=\"%d\"/>\n", ccI->second.getServiceId(), convert_UTF8_To_UTF8_XML(ccI->second.getName().c_str()).c_str(), ccI->second.getVideoPid(), ccI->second.getPreAudioPid(), ccI->second.getPcrPid(), ccI->second.getPmtPid(), ccI->second.getTeletextPid(), ccI->second.getServiceType(true), ccI->second.videoType, ccI->second.scrambled); } else { fprintf(fd, "\t\t\t<S i=\"%04x\" n=\"%s\" t=\"%x\" s=\"%d\"/>\n", ccI->second.getServiceId(), convert_UTF8_To_UTF8_XML(ccI->second.getName().c_str()).c_str(), ccI->second.getServiceType(true), ccI->second.scrambled); } processed++; } } if(tpdone) fprintf(fd, "\t\t</TS>\n"); } if(satdone) { switch(spos_it->second.type) { case DVB_S: fprintf(fd, "\t</sat>\n"); break; case DVB_C: fprintf(fd, "\t</cable>\n"); break; case DVB_T: fprintf(fd, "\t</terrestrial>\n"); break; default: break; } } } fprintf(fd, "</zapit>\n"); fclose(fd); // create zapit ordner if missed struct stat statInfo; int res = stat(CONFIGDIR "/zapit", &statInfo); if (res == -1) { if (errno == ENOENT) { res = safe_mkdir((char *)CONFIGDIR "/zapit"); if (res != 0) perror("[getservices] mkdir"); } else { perror("[getservices] stat"); } } if(tocopy) { zapit_cp((char *) SERVICES_TMP, (char *) SERVICES_XML); unlink(SERVICES_TMP); } dprintf(DEBUG_INFO, "processed channels: %d\n", processed); }
int CRecordSetup::exec(CMenuTarget* parent, const std::string &actionKey) { dprintf(DEBUG_DEBUG, "init record setup\n"); int res = menu_return::RETURN_REPAINT; std::string timeshiftDir; if (parent) { parent->hide(); } if(actionKey=="recording") { CNeutrinoApp::getInstance()->setupRecordingDevice(); return res; } else if(actionKey == "help_recording") { ShowMsg(LOCALE_SETTINGS_HELP, LOCALE_RECORDINGMENU_HELP, CMessageBox::mbrBack, CMessageBox::mbBack); return res; } else if(actionKey == "recordingdir") { //parent->hide(); const char *action_str = "recordingdir"; if(chooserDir(g_settings.network_nfs_recordingdir, true, action_str)){ printf("New recordingdir: %s (timeshift %s)\n", g_settings.network_nfs_recordingdir.c_str(), g_settings.timeshiftdir.c_str()); if(g_settings.timeshiftdir.empty()) { timeshiftDir = g_settings.network_nfs_recordingdir + "/.timeshift"; safe_mkdir(timeshiftDir.c_str()); printf("New timeshift dir: %s\n", timeshiftDir.c_str()); CRecordManager::getInstance()->SetTimeshiftDirectory(timeshiftDir); } cHddStat::getInstance()->setDir(g_settings.network_nfs_recordingdir); } return res; } else if(actionKey == "timeshiftdir") { //parent->hide(); CFileBrowser b; b.Dir_Mode=true; if (b.exec(g_settings.timeshiftdir.c_str())) { const char * newdir = b.getSelectedFile()->Name.c_str(); printf("New timeshift: selected %s\n", newdir); if(check_dir(newdir)) printf("Wrong/unsupported recording dir %s\n", newdir); else { printf("New timeshift dir: old %s (record %s)\n", g_settings.timeshiftdir.c_str(), g_settings.network_nfs_recordingdir.c_str()); if(newdir != g_settings.network_nfs_recordingdir) { printf("New timeshift != rec dir\n"); g_settings.timeshiftdir = b.getSelectedFile()->Name; timeshiftDir = g_settings.timeshiftdir; } else { timeshiftDir = g_settings.network_nfs_recordingdir + "/.timeshift"; g_settings.timeshiftdir = newdir; safe_mkdir(timeshiftDir.c_str()); printf("New timeshift == rec dir\n"); } printf("New timeshift dir: %s\n", timeshiftDir.c_str()); CRecordManager::getInstance()->SetTimeshiftDirectory(timeshiftDir); } } return res; } #if 0 if (CNeutrinoApp::getInstance()->recordingstatus) DisplayInfoMessage(g_Locale->getText(LOCALE_RECORDINGMENU_RECORD_IS_RUNNING)); else #endif res = showRecordSetup(); return res; }
void CVCRControl::Screenshot(const t_channel_id channel_id, char * fname) { char filename[512]; // UTF-8 char cmd[512]; std::string channel_name; CEPGData epgData; event_id_t epgid = 0; unsigned int pos; if(!fname) { if(safe_mkdir((char *) "/hdd/screenshots/")) return; strcpy(filename, "/hdd/screenshots/"); pos = strlen(filename); channel_name = g_Zapit->getChannelName(channel_id); if (!(channel_name.empty())) { strcpy(&(filename[pos]), UTF8_TO_FILESYSTEM_ENCODING(channel_name.c_str())); char * p_act = &(filename[pos]); do { p_act += strcspn(p_act, "/ \"%&-\t`'´!,:;"); if (*p_act) { *p_act++ = '_'; } } while (*p_act); strcat(filename, "_"); } pos = strlen(filename); //if (g_Sectionsd->getActualEPGServiceKey(channel_id&0xFFFFFFFFFFFFULL, &epgData)) if(sectionsd_getActualEPGServiceKey(channel_id&0xFFFFFFFFFFFFULL, &epgData)); epgid = epgData.eventID; if(epgid != 0) { CShortEPGData epgdata; //if (g_Sectionsd->getEPGidShort(epgid, &epgdata)) { if(sectionsd_getEPGidShort(epgid, &epgdata)) { if (!(epgdata.title.empty())) { strcpy(&(filename[pos]), epgdata.title.c_str()); char * p_act = &(filename[pos]); do { p_act += strcspn(p_act, "/ \"%&-\t`'~<>!,:;?^°$\\=*#@¤|"); if (*p_act) { *p_act++ = '_'; } } while (*p_act); } } } pos = strlen(filename); time_t t = time(NULL); strftime(&(filename[pos]), sizeof(filename) - pos - 1, "%Y%m%d_%H%M%S", localtime(&t)); strcat(filename, ".bmp"); } else strcpy(filename, fname); sprintf(cmd, "grab -v %s", filename); printf("Executing %s\n", cmd); CHintBox * hintBox = new CHintBox(LOCALE_MESSAGEBOX_INFO, "Saving screenshot.."); hintBox->paint(); system(cmd); hintBox->hide(); delete hintBox; }
bool CVCRControl::CFileDevice::Record(const t_channel_id channel_id, int mode, const event_id_t epgid, const std::string& epgTitle, unsigned char apids, const time_t epg_time) { printf("Record channel_id: " PRINTF_CHANNEL_ID_TYPE_NO_LEADING_ZEROS " epg: %llx, apids 0x%X mode %d\n", channel_id, epgid, apids, mode); CutBackNeutrino(channel_id, mode); #define MAXPIDS 64 unsigned short pids[MAXPIDS]; unsigned int numpids; unsigned int pos; CZapitClient::CCurrentServiceInfo si = g_Zapit->getCurrentServiceInfo(); numpids = 0; if (si.vpid != 0) transfer_pids(si.vpid, si.vtype ? EN_TYPE_AVC : EN_TYPE_VIDEO, 0); APIDList apid_list; getAPIDs(apids,apid_list); for(APIDList::iterator it = apid_list.begin(); it != apid_list.end(); it++) { pids[numpids++] = it->apid; transfer_pids(it->apid, EN_TYPE_AUDIO, it->ac3 ? 1 : 0); } #if 0 // FIXME : why this needed ? if(!apid_list.empty()) g_Zapit->setAudioChannel(apid_list.begin()->index); #endif CZapitClient::responseGetPIDs allpids; g_Zapit->getPIDS(allpids); if ((StreamVTxtPid) && (si.vtxtpid != 0)) { pids[numpids++] = si.vtxtpid; } if ((StreamPmtPid) && (si.pmtpid != 0)) { pids[numpids++] = si.pmtpid; } char filename[512]; // UTF-8 // Create filename for recording pos = Directory.size(); strcpy(filename, Directory.c_str()); if ((pos == 0) || (filename[pos - 1] != '/')) { filename[pos] = '/'; pos++; filename[pos] = '\0'; } pos = strlen(filename); #if 0 time_t t = time(NULL); strftime(&(filename[pos]), sizeof(filename) - pos - 1, "%Y%m%d_%H%M%S", localtime(&t)); strcat(filename, "_"); pos = strlen(filename); #endif ext_channel_name = g_Zapit->getChannelName(channel_id); if (!(ext_channel_name.empty())) { strcpy(&(filename[pos]), UTF8_TO_FILESYSTEM_ENCODING(ext_channel_name.c_str())); char * p_act = &(filename[pos]); do { p_act += strcspn(p_act, "/ \"%&-\t`'´!,:;"); if (*p_act) { *p_act++ = '_'; } } while (*p_act); if (!autoshift && g_settings.recording_save_in_channeldir) { struct stat statInfo; int res = stat(filename,&statInfo); if (res == -1) { if (errno == ENOENT) { //res = mkdir(filename,0755); res = safe_mkdir(filename); if (res == 0) { strcat(filename,"/"); } else { perror("[vcrcontrol] mkdir"); } } else { perror("[vcrcontrol] stat"); } } else { // directory exists strcat(filename,"/"); } } else strcat(filename, "_"); } pos = strlen(filename); if (g_settings.recording_epg_for_filename) { if(epgid != 0) { CShortEPGData epgdata; //if (g_Sectionsd->getEPGidShort(epgid, &epgdata)) if(sectionsd_getEPGidShort(epgid, &epgdata)) { if (!(epgdata.title.empty())) { strcpy(&(filename[pos]), epgdata.title.c_str()); char * p_act = &(filename[pos]); do { p_act += strcspn(p_act, "/ \"%&-\t`'~<>!,:;?^°$\\=*#@¤|"); if (*p_act) { *p_act++ = '_'; } } while (*p_act); } } } else if (!epgTitle.empty()) { strcpy(&(filename[pos]), epgTitle.c_str()); char * p_act = &(filename[pos]); do { p_act += strcspn(p_act, "/ \"%&-\t`'~<>!,:;?^°$\\=*#@¤|"); if (*p_act) { *p_act++ = '_'; } } while (*p_act); } } #if 1 pos = strlen(filename); time_t t = time(NULL); strftime(&(filename[pos]), sizeof(filename) - pos - 1, "%Y%m%d_%H%M%S", localtime(&t)); //pos = strlen(filename); #endif start_time = time(0); stream2file_error_msg_t error_msg = ::start_recording(filename, getMovieInfoString(CMD_VCR_RECORD, channel_id, epgid, epgTitle, apid_list, epg_time).c_str(), si.vpid, pids, numpids); if (error_msg == STREAM2FILE_OK) { deviceState = CMD_VCR_RECORD; return true; } else { RestoreNeutrino(); printf("[vcrcontrol] stream2file error code: %d\n", error_msg); #warning FIXME: Use better error message DisplayErrorMessage(g_Locale->getText( error_msg == STREAM2FILE_BUSY ? LOCALE_STREAMING_BUSY : error_msg == STREAM2FILE_INVALID_DIRECTORY ? LOCALE_STREAMING_DIR_NOT_WRITABLE : LOCALE_STREAMINGSERVER_NOCONNECT )); // UTF-8 return false; } }
int CHDDFmtExec::exec(CMenuTarget* parent, const std::string& key) { char cmd[100]; CHintBox * hintbox; int res; FILE * f; char src[128], dst[128]; CProgressWindow * progress; bool idone; sprintf(src, "/dev/%s1", key.c_str()); sprintf(dst, "/media/%s1", key.c_str()); printf("CHDDFmtExec: key %s\n", key.c_str()); res = ShowMsgUTF ( LOCALE_HDD_FORMAT, g_Locale->getText(LOCALE_HDD_FORMAT_WARN), CMessageBox::mbrNo, CMessageBox::mbYes | CMessageBox::mbNo ); if(res != CMessageBox::mbrYes) return 0; bool srun = system("killall -9 smbd"); //res = check_and_umount(dst); res = check_and_umount(src, dst); printf("CHDDFmtExec: umount res %d\n", res); if(res) { hintbox = new CHintBox(LOCALE_HDD_FORMAT, g_Locale->getText(LOCALE_HDD_UMOUNT_WARN)); hintbox->paint(); sleep(2); delete hintbox; goto _return; } f = fopen("/proc/sys/kernel/hotplug", "w"); if(f) { fprintf(f, "none\n"); fclose(f); } progress = new CProgressWindow(); progress->setTitle(LOCALE_HDD_FORMAT); progress->exec(NULL,""); progress->showStatusMessageUTF("Executing fdisk"); progress->showGlobalStatus(0); sprintf(cmd, "/sbin/sfdisk -f -uM /dev/%s", key.c_str()); printf("CHDDFmtExec: executing %s\n", cmd); f=popen(cmd, "w"); if (!f) { hintbox = new CHintBox(LOCALE_HDD_FORMAT, g_Locale->getText(LOCALE_HDD_FORMAT_FAILED)); hintbox->paint(); sleep(2); delete hintbox; goto _remount; } fprintf(f, "0,\n;\n;\n;\ny\n"); pclose(f); //sleep(1); switch(g_settings.hdd_fs) { case 0: sprintf(cmd, "/sbin/mkfs.ext3 -L RECORD -T largefile -j -m0 %s", src); break; case 1: sprintf(cmd, "/sbin/mkfs.ext2 -L RECORD -T largefile -m0 %s", src); break; case 2: sprintf(cmd, "/sbin/mkreiserfs -f -f %s", src); break; default: return 0; } printf("CHDDFmtExec: executing %s\n", cmd); f=popen(cmd, "r"); if (!f) { hintbox = new CHintBox(LOCALE_HDD_FORMAT, g_Locale->getText(LOCALE_HDD_FORMAT_FAILED)); hintbox->paint(); sleep(2); delete hintbox; goto _remount; } char buf[256]; idone = false; while(fgets(buf, 255, f) != NULL) { printf("%s", buf); if(!idone && strncmp(buf, "Writing inode", 13)) { idone = true; buf[21] = 0; progress->showGlobalStatus(20); progress->showStatusMessageUTF(buf); } else if(strncmp(buf, "Creating", 8)) { progress->showGlobalStatus(40); progress->showStatusMessageUTF(buf); } else if(strncmp(buf, "Writing superblocks", 19)) { progress->showGlobalStatus(60); progress->showStatusMessageUTF(buf); } } pclose(f); progress->showGlobalStatus(100); sleep(2); sprintf(cmd, "/sbin/tune2fs -r 0 -c 0 -i 0 %s", src); printf("CHDDFmtExec: executing %s\n", cmd); system(cmd); _remount: progress->hide(); delete progress; switch(g_settings.hdd_fs) { case 0: res = mount(src, dst, "ext3", 0, NULL); break; case 1: res = mount(src, dst, "ext2", 0, NULL); break; case 2: res = mount(src, dst, "reiserfs", 0, NULL); break; default: break; } f = fopen("/proc/sys/kernel/hotplug", "w"); if(f) { fprintf(f, "/sbin/hotplug\n"); fclose(f); } if(!res) { sprintf(cmd, "%s/movies", dst); safe_mkdir((char *) cmd); sprintf(cmd, "%s/pictures", dst); safe_mkdir((char *) cmd); sprintf(cmd, "%s/epg", dst); safe_mkdir((char *) cmd); sprintf(cmd, "%s/music", dst); safe_mkdir((char *) cmd); sync(); } _return: if(!srun) system("smbd"); return menu_return::RETURN_REPAINT; }
int CHDDChkExec::exec(CMenuTarget* /*parent*/, const std::string& key) { char cmd[100]; CHintBox * hintbox; int res; char src[128], dst[128]; FILE * f; CProgressWindow * progress; int oldpass = 0, pass, step, total; int percent = 0, opercent = 0; snprintf(src, sizeof(src), "/dev/%s1", key.c_str()); snprintf(dst, sizeof(dst), "/media/%s1", key.c_str()); printf("CHDDChkExec: key %s\n", key.c_str()); bool srun = my_system(3, "killall", "-9", "smbd"); //res = check_and_umount(dst); res = check_and_umount(src, dst); printf("CHDDChkExec: umount res %d\n", res); if(res) { hintbox = new CHintBox(LOCALE_HDD_CHECK, g_Locale->getText(LOCALE_HDD_UMOUNT_WARN)); hintbox->paint(); sleep(2); delete hintbox; return menu_return::RETURN_REPAINT; } switch(g_settings.hdd_fs) { case 0: snprintf(cmd, sizeof(cmd), "/sbin/fsck.ext3 -C 1 -f -y %s", src); break; case 1: snprintf(cmd, sizeof(cmd), "/sbin/reiserfsck --fix-fixable %s", src); break; default: return 0; } printf("CHDDChkExec: Executing %s\n", cmd); f=popen(cmd, "r"); if(!f) { hintbox = new CHintBox(LOCALE_HDD_CHECK, g_Locale->getText(LOCALE_HDD_CHECK_FAILED)); hintbox->paint(); sleep(2); delete hintbox; goto ret1; } progress = new CProgressWindow(); progress->setTitle(LOCALE_HDD_CHECK); progress->exec(NULL,""); char buf[256]; while(fgets(buf, 255, f) != NULL) { if(isdigit(buf[0])) { sscanf(buf, "%d %d %d\n", &pass, &step, &total); if(total == 0) total = 1; if(oldpass != pass) { oldpass = pass; progress->showGlobalStatus(pass > 0 ? (pass-1)*20: 0); } percent = (step * 100) / total; if(opercent != percent) { opercent = percent; //printf("CHDDChkExec: pass %d : %d\n", pass, percent); progress->showLocalStatus(percent); } } else if(!strncmp(buf, "Pass", 4)) { char *t = strrchr(buf, '\n'); if (t) *t = 0; progress->showStatusMessageUTF(buf); } } //printf("CHDDChkExec: %s\n", buf); pclose(f); progress->showGlobalStatus(100); progress->showStatusMessageUTF(buf); sleep(2); progress->hide(); delete progress; ret1: switch(g_settings.hdd_fs) { case 0: safe_mkdir(dst); res = mount(src, dst, "ext3", 0, NULL); break; case 1: safe_mkdir(dst); res = mount(src, dst, "reiserfs", 0, NULL); break; default: break; } printf("CHDDChkExec: mount res %d\n", res); if (!srun) my_system(1, "smbd"); return menu_return::RETURN_REPAINT; }
int CHDDFmtExec::exec(CMenuTarget* /*parent*/, const std::string& key) { char cmd[100]; char cmd2[100]; CHintBox * hintbox; int res; FILE * f; char src[128], dst[128]; CProgressWindow * progress; snprintf(src, sizeof(src), "/dev/%s1", key.c_str()); snprintf(dst, sizeof(dst), "/media/%s1", key.c_str()); printf("CHDDFmtExec: key %s\n", key.c_str()); res = ShowMsg ( LOCALE_HDD_FORMAT, g_Locale->getText(LOCALE_HDD_FORMAT_WARN), CMessageBox::mbrNo, CMessageBox::mbYes | CMessageBox::mbNo ); if(res != CMessageBox::mbrYes) return 0; bool srun = my_system(3, "killall", "-9", "smbd"); //res = check_and_umount(dst); res = check_and_umount(src, dst); printf("CHDDFmtExec: umount res %d\n", res); if(res) { hintbox = new CHintBox(LOCALE_HDD_FORMAT, g_Locale->getText(LOCALE_HDD_UMOUNT_WARN)); hintbox->paint(); sleep(2); delete hintbox; goto _return; } f = fopen("/proc/sys/kernel/hotplug", "w"); if(f) { fprintf(f, "none\n"); fclose(f); } progress = new CProgressWindow(); progress->setTitle(LOCALE_HDD_FORMAT); progress->exec(NULL,""); progress->showStatusMessageUTF("Executing fdisk"); progress->showGlobalStatus(0); if (access("/sbin/sfdisk", X_OK) == 0) { snprintf(cmd, sizeof(cmd), "/sbin/sfdisk -f -uM /dev/%s", key.c_str()); strcpy(cmd2, "0,\n;\n;\n;\ny\n"); } else { snprintf(cmd, sizeof(cmd), "/sbin/fdisk /dev/%s", key.c_str()); strcpy(cmd2, "o\nn\np\n1\n\n\nw\n"); } printf("CHDDFmtExec: executing %s\n", cmd); f=popen(cmd, "w"); if (!f) { hintbox = new CHintBox(LOCALE_HDD_FORMAT, g_Locale->getText(LOCALE_HDD_FORMAT_FAILED)); hintbox->paint(); sleep(2); delete hintbox; goto _remount; } fprintf(f, "%s", cmd2); pclose(f); //sleep(1); switch(g_settings.hdd_fs) { case 0: snprintf(cmd, sizeof(cmd), "/sbin/mkfs.ext3 -T largefile -m0 %s", src); break; case 1: snprintf(cmd, sizeof(cmd), "/sbin/mkreiserfs -f -f %s", src); break; default: return 0; } printf("CHDDFmtExec: executing %s\n", cmd); f=popen(cmd, "r"); if (!f) { hintbox = new CHintBox(LOCALE_HDD_FORMAT, g_Locale->getText(LOCALE_HDD_FORMAT_FAILED)); hintbox->paint(); sleep(2); delete hintbox; goto _remount; } char buf[256]; setbuf(f, NULL); int n, t, in, pos, stage; pos = 0; stage = 0; while (true) { in = fgetc(f); if (in == EOF) break; buf[pos] = (char)in; pos++; buf[pos] = 0; if (in == '\b' || in == '\n') pos = 0; /* start a new line */ //printf("%s", buf); switch (stage) { case 0: if (strcmp(buf, "Writing inode tables:") == 0) { stage++; progress->showGlobalStatus(20); progress->showStatusMessageUTF(buf); } break; case 1: if (in == '\b' && sscanf(buf, "%d/%d\b", &n, &t) == 2) { int percent = 100 * n / t; progress->showLocalStatus(percent); progress->showGlobalStatus(20 + percent / 5); } if (strstr(buf, "done")) { stage++; pos = 0; } break; case 2: if (strstr(buf, "blocks):") && sscanf(buf, "Creating journal (%d blocks):", &n) == 1) { progress->showLocalStatus(0); progress->showGlobalStatus(60); progress->showStatusMessageUTF(buf); pos = 0; } if (strstr(buf, "done")) { stage++; pos = 0; } break; case 3: if (strcmp(buf, "Writing superblocks and filesystem accounting information:") == 0) { progress->showGlobalStatus(80); progress->showStatusMessageUTF(buf); pos = 0; } break; default: // printf("unknown stage! %d \n\t", stage); break; } } progress->showLocalStatus(100); pclose(f); progress->showGlobalStatus(100); sleep(2); printf("CHDDFmtExec: executing %s %s\n","/sbin/tune2fs -r 0 -c 0 -i 0", src); my_system(8, "/sbin/tune2fs", "-r", "0", "-c", "0", "-i", "0", src); _remount: progress->hide(); delete progress; switch(g_settings.hdd_fs) { case 0: safe_mkdir(dst); res = mount(src, dst, "ext3", 0, NULL); break; case 1: safe_mkdir(dst); res = mount(src, dst, "reiserfs", 0, NULL); break; default: break; } f = fopen("/proc/sys/kernel/hotplug", "w"); if(f) { #ifdef ASSUME_MDEV fprintf(f, "/sbin/mdev\n"); #else fprintf(f, "/sbin/hotplug\n"); #endif fclose(f); } if(!res) { snprintf(cmd, sizeof(cmd), "%s/movies", dst); safe_mkdir(cmd); snprintf(cmd, sizeof(cmd), "%s/pictures", dst); safe_mkdir(cmd); snprintf(cmd, sizeof(cmd), "%s/epg", dst); safe_mkdir(cmd); snprintf(cmd, sizeof(cmd), "%s/music", dst); safe_mkdir(cmd); snprintf(cmd, sizeof(cmd), "%s/logos", dst); safe_mkdir(cmd); snprintf(cmd, sizeof(cmd), "%s/plugins", dst); safe_mkdir(cmd); sync(); } _return: if (!srun) my_system(1, "smbd"); return menu_return::RETURN_REPAINT; }
int CHDDFmtExec::exec(CMenuTarget* /*parent*/, const std::string& key) { char cmd[100]; char cmd2[100]; CHintBox * hintbox; int res; FILE * f; char src[128], dst[128]; CProgressWindow * progress; snprintf(src, sizeof(src), "/dev/%s1", key.c_str()); snprintf(dst, sizeof(dst), "/media/%s1", key.c_str()); printf("CHDDFmtExec: key %s\n", key.c_str()); res = ShowMsgUTF ( LOCALE_HDD_FORMAT, g_Locale->getText(LOCALE_HDD_FORMAT_WARN), CMessageBox::mbrNo, CMessageBox::mbYes | CMessageBox::mbNo ); if(res != CMessageBox::mbrYes) return 0; bool srun = system("killall -9 smbd"); //res = check_and_umount(dst); res = check_and_umount(src, dst); printf("CHDDFmtExec: umount res %d\n", res); if(res) { hintbox = new CHintBox(LOCALE_HDD_FORMAT, g_Locale->getText(LOCALE_HDD_UMOUNT_WARN)); hintbox->paint(); sleep(2); delete hintbox; goto _return; } f = fopen("/proc/sys/kernel/hotplug", "w"); if(f) { fprintf(f, "none\n"); fclose(f); } progress = new CProgressWindow(); progress->setTitle(LOCALE_HDD_FORMAT); progress->exec(NULL,""); progress->showStatusMessageUTF("Executing fdisk"); progress->showGlobalStatus(0); if (access("/sbin/sfdisk", X_OK) == 0) { snprintf(cmd, sizeof(cmd), "/sbin/sfdisk -f -uM /dev/%s", key.c_str()); strcpy(cmd2, "0,\n;\n;\n;\ny\n"); } else { snprintf(cmd, sizeof(cmd), "/sbin/fdisk /dev/%s", key.c_str()); strcpy(cmd2, "o\nn\np\n1\n\n\nw\n"); } printf("CHDDFmtExec: executing %s\n", cmd); f=popen(cmd, "w"); if (!f) { hintbox = new CHintBox(LOCALE_HDD_FORMAT, g_Locale->getText(LOCALE_HDD_FORMAT_FAILED)); hintbox->paint(); sleep(2); delete hintbox; goto _remount; } fprintf(f, "%s", cmd2); pclose(f); //sleep(1); switch(g_settings.hdd_fs) { case 0: snprintf(cmd, sizeof(cmd), "/sbin/mkfs.ext3 -T largefile -m0 %s", src); break; case 1: snprintf(cmd, sizeof(cmd), "/sbin/mkreiserfs -f -f %s", src); break; default: return 0; } printf("CHDDFmtExec: executing %s\n", cmd); f=popen(cmd, "r"); if (!f) { hintbox = new CHintBox(LOCALE_HDD_FORMAT, g_Locale->getText(LOCALE_HDD_FORMAT_FAILED)); hintbox->paint(); sleep(2); delete hintbox; goto _remount; } char buf[256]; setbuf(f, NULL); int n, t, in, pos, stage; pos = 0; stage = 0; while (true) { in = fgetc(f); if (in == EOF) break; buf[pos] = (char)in; pos++; buf[pos] = 0; if (in == '\b' || in == '\n') pos = 0; /* start a new line */ //printf("%s", buf); switch (stage) { case 0: if (strcmp(buf, "Writing inode tables:") == 0) { stage++; progress->showGlobalStatus(20); progress->showStatusMessageUTF(buf); } break; case 1: if (in == '\b' && sscanf(buf, "%d/%d\b", &n, &t) == 2) { int percent = 100 * n / t; progress->showLocalStatus(percent); progress->showGlobalStatus(20 + percent / 5); } if (strstr(buf, "done")) { stage++; pos = 0; } break; case 2: if (strstr(buf, "blocks):") && sscanf(buf, "Creating journal (%d blocks):", &n) == 1) { progress->showLocalStatus(0); progress->showGlobalStatus(60); progress->showStatusMessageUTF(buf); pos = 0; } if (strstr(buf, "done")) { stage++; pos = 0; } break; case 3: if (strcmp(buf, "Writing superblocks and filesystem accounting information:") == 0) { progress->showGlobalStatus(80); progress->showStatusMessageUTF(buf); pos = 0; } break; default: // printf("unknown stage! %d \n\t", stage); break; } } progress->showLocalStatus(100); pclose(f); progress->showGlobalStatus(100); sleep(2); snprintf(cmd, sizeof(cmd), "/sbin/tune2fs -r 0 -c 0 -i 0 %s", src); printf("CHDDFmtExec: executing %s\n", cmd); system(cmd); _remount: progress->hide(); delete progress; switch(g_settings.hdd_fs) { case 0: safe_mkdir(dst); res = mount(src, dst, "ext3", 0, NULL); break; case 1: safe_mkdir(dst); res = mount(src, dst, "reiserfs", 0, NULL); break; default: break; } f = fopen("/proc/sys/kernel/hotplug", "w"); if(f) { fprintf(f, "/sbin/hotplug\n"); fclose(f); } if(!res) { snprintf(cmd, sizeof(cmd), "%s/movies", dst); safe_mkdir((char *) cmd); snprintf(cmd, sizeof(cmd), "%s/pictures", dst); safe_mkdir((char *) cmd); snprintf(cmd, sizeof(cmd), "%s/epg", dst); safe_mkdir((char *) cmd); snprintf(cmd, sizeof(cmd), "%s/music", dst); safe_mkdir((char *) cmd); sync(); #if HAVE_TRIPLEDRAGON /* on the tripledragon, we mount via fstab, so we need to add an fstab entry for dst */ FILE *g; char *line = NULL; unlink("/etc/fstab.new"); g = fopen("/etc/fstab.new", "w"); f = fopen("/etc/fstab", "r"); if (!g) perror("open /etc/fstab.new"); else { if (f) { int ret; while (true) { size_t dummy; ret = getline(&line, &dummy, f); if (ret < 0) break; /* remove lines that start with the same disk we formatted src is "/dev/xda1", we only compare "/dev/xda" */ if (strncmp(line, src, strlen(src)-1) != 0) fprintf(g, "%s", line); } free(line); fclose(f); } /* now add our new entry */ fprintf(g, "%s %s auto defaults 0 0\n", src, dst); fclose(g); rename("/etc/fstab", "/etc/fstab.old"); rename("/etc/fstab.new", "/etc/fstab"); } #endif } _return: if(!srun) system("smbd"); return menu_return::RETURN_REPAINT; }