Пример #1
0
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);
}
Пример #2
0
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;
}
Пример #3
0
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;
}