1 //
2 // Mono.WebServer.ModMonoTCPWebSource
3 //
4 // Authors:
5 //	Gonzalo Paniagua Javier (gonzalo@ximian.com)
6 //
7 // (C) Copyright 2004 Novell, Inc. (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28 
29 using System;
30 using System.Net;
31 using System.Net.Sockets;
32 using Mono.WebServer.Log;
33 
34 namespace Mono.WebServer
35 {
36 	public class ModMonoTCPWebSource: ModMonoWebSource
37 	{
38 		IPEndPoint bindAddress;
39 
ModMonoTCPWebSource(IPAddress address, int port, string lockfile)40 		public ModMonoTCPWebSource (IPAddress address, int port, string lockfile)
41 			: base (lockfile)
42 		{
43 			SetListenAddress (address, port);
44 		}
45 
SetListenAddress(int port)46 		public void SetListenAddress (int port)
47 		{
48 			SetListenAddress (IPAddress.Any, port);
49 		}
50 
SetListenAddress(IPAddress address, int port)51 		public void SetListenAddress (IPAddress address, int port)
52 		{
53 			SetListenAddress (new IPEndPoint (address, port));
54 		}
55 
SetListenAddress(IPEndPoint bindAddress)56 		public void SetListenAddress (IPEndPoint bindAddress)
57 		{
58 			if (bindAddress == null)
59 				throw new ArgumentNullException ("bindAddress");
60 
61 			this.bindAddress = bindAddress;
62 		}
63 
GracefulShutdown()64 		public override bool GracefulShutdown ()
65 		{
66 			EndPoint ep = bindAddress;
67 			var sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
68 			try {
69 				sock.Connect (ep);
70 			} catch (Exception e) {
71 				Logger.Write (LogLevel.Error, "Cannot connect to {0}: {1}", ep, e.Message);
72 				return false;
73 			}
74 
75 			return SendShutdownCommandAndClose (sock);
76 		}
77 
CreateSocket()78 		public override Socket CreateSocket ()
79 		{
80 			if (bindAddress == null)
81 				throw new InvalidOperationException ("No address/port to listen");
82 
83 			var listen_socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
84 			listen_socket.Bind (bindAddress);
85 			return listen_socket;
86 		}
87 	}
88 }
89 
90