void CopyFile(const std::string &src, std::string dest, TFileOpCB cb, void *prvdata) { MakeOptDest(src, dest); if (src == dest) return; if (IsLink(src)) { if (FileExists(dest) && !IsDir(dest)) Unlink(dest.c_str()); SymLink(src, dest); return; } CFDWrapper in(Open(src.c_str(), O_RDONLY)); mode_t flags = O_WRONLY | (FileExists(dest) ? O_TRUNC : O_CREAT); CFDWrapper out(Open(dest.c_str(), flags)); char buffer[1024]; size_t size; while((size = Read(in, buffer, sizeof(buffer)))) { int b = Write(out, buffer, size); if (cb) cb(b, prvdata); } // Copy file permissions struct stat st; FStat(in, &st); // Disable umask temporary so we can normally copy permissions mode_t mask = umask(0); FChMod(out, st.st_mode); umask(mask); }
static int eject_impl(const char *_device, int device_len, int command, zend_bool use_proc_mount) { int status = 0; #ifdef PHP_WIN32 TCHAR device[128]; HANDLE fd; _stprintf_s(device, sizeof(device)/sizeof(TCHAR), _T("%s"), _device); fd = CreateFile(device, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (fd == INVALID_HANDLE_VALUE) { php_error(E_ERROR, "failed to open device\n"); return 0; } #else char *fullName; /* expanded name */ int ld = 6; /* symbolic link max depth */ char *linkName; /* name of device's symbolic link */ int mounted = 0; /* true if device is mounted */ char *mountName; /* name of device's mount point */ char *deviceName; /* name of device */ int mountable = 0; /* true if device is in /etc/fstab */ int fd; /* file descriptor for device */\ char *device = estrdup(_device); if (!device) { php_error(E_ERROR, "failed to allocate memory.\n"); return 0; } /* Strip any trailing slash from name in case user used bash/tcsh style filename completion (e.g. /mnt/cdrom/) */ if (device[device_len - 1] == '/') device[device_len - 1] = 0; /* figure out full device or mount point name */ fullName = FindDevice(device); if (!fullName) { php_error(E_WARNING, "unable to find or open device for: `%s'\n", device); return 0; } /* check for a symbolic link */ while ((linkName = SymLink(fullName)) && (ld > 0)) { efree(fullName); fullName = strdup(linkName); efree(linkName); linkName = 0; ld--; } /* handle max depth exceeded option */ if (ld <= 0) { php_error(E_WARNING, "maximum symbolic link depth exceeded: `%s'\n", fullName); return 0; } /* if mount point, get device name */ mounted = MountedDevice(fullName, &mountName, &deviceName, (int)use_proc_mount); if (!mounted) { deviceName = estrdup(fullName); } /* if not currently mounted, see if it is a possible mount point */ if (!mounted) { mountable = MountableDevice(fullName, &mountName, &deviceName); } fd = OpenDevice(deviceName); if (fd == -1) { php_error(E_WARNING, "unable to open `%s'\n", fullName); return 0; } #endif /* PHP_WIN32 */ switch (command) { case EJECT_COMMAND_CLOSE: status = CloseTray(fd); break; case EJECT_COMMAND_TOGGLE: status = ToggleTray(fd); break; default: status = 0; break; } #ifdef PHP_WIN32 if (fd != INVALID_HANDLE_VALUE) CloseHandle(fd); #else if (mountName) efree(mountName); if (deviceName) efree(deviceName); #endif /* PHP_WIN32 */ return status; }
BOOL TInstDlg::Install(void) { char buf[MAX_PATH_U8], setupDir[MAX_PATH_U8], setupPath[MAX_PATH_U8]; char installPath[MAX_PATH_U8]; BOOL extract_only = IsDlgButtonChecked(EXTRACT_CHECK); // 現在、起動中の ipmsg を終了 int st = extract_only ? 0 : TerminateIPMsg(); if (st == 1) return FALSE; // インストールパス設定 GetDlgItemTextU8(FILE_EDIT, setupDir, sizeof(setupDir)); if (IsWinVista() && !::IsUserAnAdmin() && TIsEnableUAC() && TIsVirtualizedDirW(U8toWs(setupDir))) { if (MessageBox(GetLoadStr(IDS_REQUIREADMIN), INSTALL_STR, MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) return FALSE; return RunAsAdmin(hWnd, TRUE); } CreateDirectoryU8(setupDir, NULL); DWORD attr = GetFileAttributesU8(setupDir); if (attr == 0xffffffff || (attr & FILE_ATTRIBUTE_DIRECTORY) == 0) return MessageBox(GetLoadStr(IDS_NOTCREATEDIR), INSTALL_STR), FALSE; MakePath(setupPath, setupDir, IPMSG_EXENAME); if (st == 2) { MessageBox(GetLoadStr(IDS_CANTTERMINATE), INSTALL_STR); return FALSE; } if (!runasImm && MessageBox(GetLoadStr(IDS_START), INSTALL_STR, MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) { return FALSE; } runasImm = FALSE; // ファイル生成 for (int i=0; SetupFiles[i]; i++) { MakePath(installPath, setupDir, SetupFiles[i]); CreateStatus cs = CreateFileBySelf(installPath, SetupFiles[i]); if (cs == CS_BROKEN) { MessageBox(GetLoadStr(IDS_BROKENARCHIVE), INSTALL_STR); return FALSE; } else if (cs == CS_ACCESS) { const char *msg = Fmt("%s\r\n%s", GetLoadStrU8(IDS_NOTCREATEFILE), installPath); MessageBoxU8(msg, INSTALL_STR); return FALSE; } } // 展開のみ if (extract_only) { ShellExecuteW(NULL, NULL, U8toWs(setupDir), 0, 0, SW_SHOW); return TRUE; } // スタートアップ&デスクトップに登録 TRegistry reg(HKEY_CURRENT_USER); if (reg.OpenKey(REGSTR_SHELLFOLDERS)) { char *regStr[] = { REGSTR_STARTUP, REGSTR_PROGRAMS, REGSTR_DESKTOP, NULL }; BOOL resId[] = { STARTUP_CHECK, PROGRAM_CHECK, DESKTOP_CHECK, NULL }; for (int i=0; regStr[i]; i++) { if (reg.GetStr(regStr[i], buf, sizeof(buf))) { if (i != 0 || !RemoveSameLink(buf, buf)) ::wsprintf(buf + strlen(buf), "\\%s", IPMSG_SHORTCUT_NAME); if (IsDlgButtonChecked(resId[i])) SymLink(setupPath, buf); else DeleteLink(buf); } } reg.CloseKey(); } // レジストリにアプリケーション情報を登録 reg.ChangeTopKey(HKEY_LOCAL_MACHINE); if (reg.OpenKey(REGSTR_PATH_APPPATHS)) { if (reg.CreateKey(IPMSG_EXENAME)) { reg.SetStr(NULL, setupPath); reg.SetStr(REGSTR_PATH, setupDir); reg.CloseKey(); } reg.CloseKey(); } // レジストリにアンインストール情報を登録 if (reg.OpenKey(REGSTR_PATH_UNINSTALL)) { if (reg.CreateKey(IPMSG_NAME)) { MakePath(buf, setupDir, SETUP_EXENAME); strcat(buf, " /r"); reg.SetStr(REGSTR_VAL_UNINSTALLER_DISPLAYNAME, IPMSG_FULLNAME); reg.SetStr(REGSTR_VAL_UNINSTALLER_COMMANDLINE, buf); reg.CloseKey(); } reg.CloseKey(); } // コピーしたアプリケーションを起動 const char *msg = GetLoadStr(IDS_SETUPCOMPLETE); int flg = MB_OKCANCEL|MB_ICONINFORMATION; // if (IsWinVista() && ::IsUserAnAdmin() && TIsEnableUAC()) { // msg = Fmt("%s%s", msg, GetLoadStr(IDS_COMPLETE_UACADD)); // flg |= MB_DEFBUTTON2; // } TLaunchDlg dlg(msg, this); if (dlg.Exec() == IDOK) { if (runasWnd) { Wstr wbuf(setupDir); if (::SendDlgItemMessageW(runasWnd, FILE_EDIT, WM_SETTEXT, 0, (LPARAM)wbuf.Buf())) { ::PostMessage(runasWnd, WM_IPMSG_QUIT, 1, 0); runasWnd = NULL; } } else { AppKick(); } } else { HWND hHelp = ShowHelpU8(0, setupDir, GetLoadStrU8(IDS_IPMSGHELP), "#history"); if (hHelp) { Show(SW_HIDE); while (::IsWindow(hHelp)) { this->Sleep(100); } } } if (runasWnd) { ::PostMessage(runasWnd, WM_IPMSG_QUIT, 0, 0); runasWnd = NULL; } // ShellExecuteU8(NULL, NULL, setupDir, 0, 0, SW_SHOW); ::PostQuitMessage(0); return TRUE; }