@@ -42,22 +42,99 @@ enum Transport_Types {
42
42
43
43
/***********************************************************************
44
44
**
45
- */ static void Ret_Query_Net (REBSER * port , REBREQ * sock , REBVAL * ret )
45
+ */ static REBOOL Set_Net_Mode_Value (REBREQ * sock , REBCNT mode , REBVAL * ret )
46
+ /*
47
+ ** Set a value with net data according specified mode
48
+ **
49
+ ***********************************************************************/
50
+ {
51
+ switch (mode ) {
52
+ case SYM_REMOTE_IP :
53
+ Set_Tuple (ret , (REBYTE * )& sock -> net .remote_ip , 4 );
54
+ break ;
55
+ case SYM_REMOTE_PORT :
56
+ SET_INTEGER (ret , sock -> net .remote_port );
57
+ break ;
58
+ case SYM_LOCAL_IP :
59
+ Set_Tuple (ret , (REBYTE * )& sock -> net .local_ip , 4 );
60
+ break ;
61
+ case SYM_LOCAL_PORT :
62
+ SET_INTEGER (ret , sock -> net .local_port );
63
+ break ;
64
+ default :
65
+ return FALSE;
66
+ }
67
+ return TRUE;
68
+ }
69
+
70
+ /***********************************************************************
71
+ **
72
+ */ static void Ret_Query_Net (REBSER * port , REBREQ * sock , REBVAL * ret , REBVAL * info )
46
73
/*
47
74
***********************************************************************/
48
75
{
49
- REBVAL * info = In_Object (port , STD_PORT_SCHEME , STD_SCHEME_INFO , 0 );
50
76
REBSER * obj ;
77
+ REBVAL * val ;
78
+
79
+ if (IS_WORD (info )) {
80
+ if (!Set_Net_Mode_Value (sock , VAL_WORD_CANON (info ), ret ))
81
+ Trap1 (RE_INVALID_ARG , info );
82
+ }
83
+ else if (IS_BLOCK (info )) {
84
+ // example:
85
+ // query/mode port [remote-ip remote-port] ;== [127.0.0.1 1234]
86
+ // or:
87
+ // query/mode port [remote-ip: remote-port:] ;== [remote-ip: 127.0.0.1 remote-port: 1234]
88
+ // or combined:
89
+ // query/mode file [remote-ip: remote-port] ;== [remote-ip: 127.0.0.1 1234]
90
+ // When not supported word is used, if will throw an error
91
+
92
+ REBSER * values = Make_Block (2 * BLK_LEN (VAL_SERIES (info )));
93
+ REBVAL * word = VAL_BLK_DATA (info );
94
+ for (; NOT_END (word ); word ++ ) {
95
+ if (ANY_WORD (word )) {
96
+ if (IS_SET_WORD (word )) {
97
+ // keep the set-word in result
98
+ val = Append_Value (values );
99
+ * val = * word ;
100
+ VAL_SET_LINE (val );
101
+ }
102
+ val = Append_Value (values );
103
+ if (!Set_Net_Mode_Value (sock , VAL_WORD_CANON (word ), val ))
104
+ Trap1 (RE_INVALID_ARG , word );
105
+ }
106
+ else Trap1 (RE_INVALID_ARG , word );
107
+ }
108
+ Set_Series (REB_BLOCK , ret , values );
109
+ }
110
+ else {
111
+ //@@ oldes: is returning object really still needed?
112
+ info = In_Object (port , STD_PORT_SCHEME , STD_SCHEME_INFO , 0 );
51
113
52
- if (!info || !IS_OBJECT (info )) Trap_Port (RE_INVALID_SPEC , port , -10 );
114
+ if (!info || !IS_OBJECT (info )) {
115
+ Trap_Port (RE_INVALID_SPEC , port , -10 );
116
+ return ; // prevents compiler's warning
117
+ }
53
118
54
- obj = CLONE_OBJECT (VAL_OBJ_FRAME (info ));
119
+ obj = CLONE_OBJECT (VAL_OBJ_FRAME (info ));
55
120
56
- SET_OBJECT (ret , obj );
57
- Set_Tuple (OFV (obj , STD_NET_INFO_LOCAL_IP ), (REBYTE * )& sock -> net .local_ip , 4 );
58
- Set_Tuple (OFV (obj , STD_NET_INFO_REMOTE_IP ), (REBYTE * )& sock -> net .remote_ip , 4 );
59
- SET_INTEGER (OFV (obj , STD_NET_INFO_LOCAL_PORT ), sock -> net .local_port );
60
- SET_INTEGER (OFV (obj , STD_NET_INFO_REMOTE_PORT ), sock -> net .remote_port );
121
+ SET_OBJECT (ret , obj );
122
+ Set_Tuple (OFV (obj , STD_NET_INFO_LOCAL_IP ), (REBYTE * )& sock -> net .local_ip , 4 );
123
+ Set_Tuple (OFV (obj , STD_NET_INFO_REMOTE_IP ), (REBYTE * )& sock -> net .remote_ip , 4 );
124
+ SET_INTEGER (OFV (obj , STD_NET_INFO_LOCAL_PORT ), sock -> net .local_port );
125
+ SET_INTEGER (OFV (obj , STD_NET_INFO_REMOTE_PORT ), sock -> net .remote_port );
126
+ }
127
+ }
128
+
129
+ /***********************************************************************
130
+ **
131
+ */ void Ret_Net_Modes (REBSER * port , REBVAL * ret )
132
+ /*
133
+ ** Sets value with block of possible net mode names
134
+ **
135
+ ***********************************************************************/
136
+ {
137
+ Set_Block (ret , Get_Object_Words (In_Object (port , STD_PORT_SCHEME , STD_SCHEME_INFO , 0 )));
61
138
}
62
139
63
140
@@ -264,7 +341,12 @@ enum Transport_Types {
264
341
case A_QUERY :
265
342
// Get specific information - the scheme's info object.
266
343
// Special notation allows just getting part of the info.
267
- Ret_Query_Net (port , sock , D_RET );
344
+ refs = Find_Refines (ds , ALL_QUERY_REFS );
345
+ if ((refs & AM_QUERY_MODE ) && IS_NONE (D_ARG (ARG_QUERY_FIELD ))) {
346
+ Ret_Net_Modes (port , D_RET );
347
+ return R_RET ;
348
+ }
349
+ Ret_Query_Net (port , sock , D_RET , D_ARG (ARG_QUERY_FIELD ));
268
350
break ;
269
351
270
352
case A_OPENQ :
0 commit comments