public int ClientRun(ClientInfo clientInfo, int pid, string[] args) { var options = clientInfo.Options; var ioStream = clientInfo.IoStream; FileList fList; List <FileStruct> fileList; WinRsync.SetupProtocol(clientInfo); if (options.ProtocolVersion >= 23 && !options.ReadBatch) { ioStream.IoStartMultiplexIn(); } if (options.AmSender) { ioStream.IoStartBufferingOut(); if (options.DeleteMode && !options.DeleteExcluded) { var excl = new Exclude(options); excl.SendExcludeList(ioStream); } if (options.Verbose > 3) { Log.Write("File list sent\n"); } ioStream.Flush(); fList = new FileList(options); fileList = fList.SendFileList(clientInfo, args); if (options.Verbose > 3) { Log.WriteLine("file list sent"); } ioStream.Flush(); var sender = new Sender(options); sender.SendFiles(fileList, clientInfo); ioStream.Flush(); ioStream.WriteInt(-1); return(-1); } options.Dir = args[0]; options.Dir = Path.GetFullPath(options.Dir ?? string.Empty); if (!options.ReadBatch) { var excl = new Exclude(options); excl.SendExcludeList(ioStream); } fList = new FileList(options); fileList = fList.ReceiveFileList(clientInfo); return(Daemon.DoReceive(clientInfo, fileList, null)); }
/// <summary> /// /// </summary> /// <param name="clientInfo"></param> /// <param name="moduleNumber"></param> /// <returns></returns> public static void RsyncModule(ClientInfo clientInfo, int moduleNumber) //@fixed Why return something if result not used? { var path = Daemon.Config.GetModule(moduleNumber).Path; var name = Daemon.Config.GetModuleName(moduleNumber); var ioStream = clientInfo.IoStream; var options = clientInfo.Options; var args = new string[Options.MaxArgs]; int argc = 0, maxArgs = Options.MaxArgs; var line = String.Empty; if (path[0] == '/') { path = path.Remove(0, 1); } path = path.Replace("\n", String.Empty); var ac = new Access(); if ( !ac.AllowAccess(options.RemoteAddr, options.RemoteHost, Daemon.Config.GetHostsAllow(moduleNumber), Daemon.Config.GetHostsDeny(moduleNumber))) { Log.Write("rsync denied on module " + name + " from " + options.RemoteHost + " (" + options.RemoteAddr + ")"); ioStream.IoPrintf("@ERROR: access denied to " + name + " from " + options.RemoteHost + " (" + options.RemoteAddr + ")\n"); return; } if (!Authentication.AuthorizeServer(clientInfo, moduleNumber, options.RemoteAddr, "@RSYNCD: AUTHREQD ")) { Log.Write("auth failed on module " + name + " from " + options.RemoteHost + " (" + options.RemoteAddr + ")\n"); ioStream.IoPrintf("@ERROR: auth failed on module " + name + "\n"); return; } // TODO: path length if (Directory.Exists(path)) { ioStream.IoPrintf("@RSYNCD: OK\n"); } else { try { // TODO: path length Directory.CreateDirectory(path); ioStream.IoPrintf("@RSYNCD: OK\n"); } catch (Exception) { ioStream.IoPrintf("@ERROR: Path not found\n"); WinRsync.Exit("@ERROR: Path not found: " + path, clientInfo); } } options.AmServer = true; //to fix error in SetupProtocol options.Dir = path; do { line = ioStream.ReadLine(); line = line.Substring(0, line.Length - 1); if (argc == maxArgs) { maxArgs += Options.MaxArgs; MapFile.ExtendArray(ref args, maxArgs); } args[argc++] = line; } while (!string.IsNullOrEmpty(line)); args[argc++] = path; options.Verbose = 0; var argsNotUsed = CommandLineParser.ParseArguments(args, options); if (argsNotUsed == -1) { WinRsync.Exit("Error parsing options", clientInfo); } var args2 = new string[argsNotUsed]; for (var i = 0; i < argsNotUsed; i++) { args2[i] = args[args.Length - argsNotUsed + i]; } WinRsync.SetupProtocol(clientInfo); ioStream.IoStartMultiplexOut(); Daemon.StartServer(clientInfo, args2); }