1 | /***************************************
2 | $Revision: 1.11 $
3 |
4 | Protocol whois module (pw). Whois protocol.
5 |
6 | Status: NOT REVUED, NOT TESTED
7 |
8 | ******************/ /******************
9 | Filename : protocol_whois.c
10 | Author : ottrey@ripe.net
11 | OSs Tested : Solaris
12 | ******************/ /******************
13 | Copyright (c) 1999 RIPE NCC
14 |
15 | All Rights Reserved
16 |
17 | Permission to use, copy, modify, and distribute this software and its
18 | documentation for any purpose and without fee is hereby granted,
19 | provided that the above copyright notice appear in all copies and that
20 | both that copyright notice and this permission notice appear in
21 | supporting documentation, and that the name of the author not be
22 | used in advertising or publicity pertaining to distribution of the
23 | software without specific, written prior permission.
24 |
25 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
26 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
27 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
28 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
29 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
30 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
31 | ***************************************/
32 | #include <stdio.h>
33 | #include <glib.h>
34 |
35 | #include "NAME"
36 |
37 | #include "protocol_whois.h"
38 | #include "mysql_driver.h"
39 | #include "query_command.h"
40 | #include "query_instructions.h"
41 | #include "constants.h"
42 | #include "objects.h"
43 |
44 | /* PW_interact() */
45 | /*++++++++++++++++++++++++++++++++++++++
46 | Interact with the client.
47 |
48 | int sock Socket that client is connected to.
49 |
50 | More:
51 | +html+ <PRE>
52 | Authors:
53 | ottrey
54 |
55 | +html+ </PRE><DL COMPACT>
56 | +html+ <DT>Online References:
57 | +html+ <DD><UL>
58 | +html+ </UL></DL>
59 |
60 | ++++++++++++++++++++++++++++++++++++++*/
61 | void PW_interact(int sock) {
62 | char input[MAX_INPUT_SIZE];
63 | int connected = 1;
64 | int read_result;
65 | char *welcome=NULL;
66 | int input_length;
67 | int k_flag;
68 | char *str=NULL;
69 |
70 | Query_command *qc=NULL;
71 | Query_instructions *qis=NULL;
72 |
73 | /* Initialize the flag that instructs to keep the connection open. */
74 | k_flag = 0;
75 |
76 | while ((connected == 1) && (CO_get_whois_suspended() == 0)) {
77 | /* Read input */
78 | read_result = SK_gets(sock, input, MAX_INPUT_SIZE);
79 | if (read_result == -1) {
80 | connected = 0;
81 | }
82 | else if (read_result == -2) {
83 | printf("Thread received a control-c\n");
84 | connected = 0;
85 | }
86 |
87 | /* Default to process the whois query */
88 | input_length = strlen(input);
89 | if (input_length > 0) {
90 | SK_puts(sock, CVS_NAME);
91 | printf("whois %s\n", input);
92 | /* XXX NB. This will change as the WQ module changes. -- Sigh. */
93 | QC_free(qc);
94 | qc = QC_new(input, sock);
95 | /*
96 | QC_environ_update(qc);
97 | */
98 |
99 | /* Don't do a query if there are no keys. */
100 | if (qc->keys != NULL) {
101 | if (strcmp(qc->keys, "") != 0) {
102 | QI_free(qis);
103 | qis = QI_new(qc, sock);
104 | g_list_foreach(qc->sources_list, QI_execute, qis);
105 | }
106 | else {
107 | if (qc->t != 0) {
108 | str = OB_attribute_i_to_string(qc->t, 0);
109 | if (str != NULL) {
110 | SK_puts(sock, str);
111 | SK_puts(sock, "\n");
112 | free(str);
113 | }
114 | else {
115 | SK_puts(sock, "Not an object.\n");
116 | SK_puts(sock, USAGE);
117 | }
118 | }
119 | if (qc->v != 0) {
120 | str = OB_attribute_i_to_string(qc->v, 1);
121 | if (str != NULL) {
122 | SK_puts(sock, str);
123 | free(str);
124 | }
125 | else {
126 | SK_puts(sock, "Not an object.\n");
127 | SK_puts(sock, USAGE);
128 | }
129 | }
130 | }
131 | }
132 |
133 | /* Put a newline at the end of the query. */
134 | SK_puts(sock, "\n");
135 |
136 | /* This is a tricky XOR operation.... ;-)
137 | State transition for k_flag:
138 | 0 -> 0 then k_flag = 0, connected = 0
139 | 0 -> 1 then k_flag = 1, connected = 1
140 | 1 -> 0 then k_flag = 1, connected = 1
141 | 1 -> 1 then k_flag = 0, connected = 0
142 | */
143 | k_flag = k_flag ^ qc->k;
144 | connected = k_flag;
145 | }
146 | else {
147 | printf("whois WHAT???\n");
148 | SK_puts(sock, "whois WHAT???\n");
149 | connected = 0;
150 | }
151 | }
152 |
153 | SK_close(sock);
154 |
155 |
156 | } /* PW_interact() */