Annotation of OpenXM/doc/OpenXM-specs/OX-RFC-103.oxw, Revision 1.5
1.5 ! takayama 1: % $OpenXM: OpenXM/doc/OpenXM-specs/OX-RFC-103.oxw,v 1.4 2004/09/18 11:40:16 takayama Exp $
! 2: /*&C
! 3:
! 4: OX-RFC: 103 OpenXM committers
! 5:
! 6: December 9, 2003,
! 7: September 19, 2004
! 8:
! 9: */
! 10: //&en Supplement to OX-RFC-100
! 11: //&en --- Broadcasting in process trees and engine authentication
! 12: //&ja OX-RFC-100 $B$X$NDI2C5!G=(B
! 13: //&ja --- $B%W%m%;%9LZ9=B$$G$NF1Js$H%(%s%8%sG'>Z(B
! 14:
! 15: /*&C
! 16:
! 17: Status of this memo
! 18: This is an experimental specification.
! 19: Distribution of this memo is unlimited.
! 20:
! 21: Copyright Notice
! 22: OpenXM.org, 2003, 2004
! 23:
! 24: */
1.1 takayama 25:
26:
27: /*&ja
1.5 ! takayama 28:
! 29: @@$BMWLs(B
1.1 takayama 30: $B$3$N(B RFC $B$O(B OpenXM RFC 100 ($B$*$h$S(B 101) $B$N<BAu$K$h$jL@$i$+$K$J$C$?<o!9$NLdBjE@$r$b$H$K(B
31: RFC 100 $B%W%m%H%3%k$X$N4v$D$+$NDI2C$rDs0F$9$k(B.
1.5 ! takayama 32:
1.1 takayama 33: */
34:
1.5 ! takayama 35: //&ja @@$BCfCG$*$h$SJQ?t$NEAGE(B
! 36: //&en @@Propagation of an interruption and a value of a variable
1.3 takayama 37:
1.5 ! takayama 38: //&ja @@@$BCfCG(B
! 39: //&en @@@Interruption
1.1 takayama 40:
1.2 takayama 41: /*&ja
1.5 ! takayama 42:
1.2 takayama 43: OX RFC 103 $B$G$O(B,
44: $B%(%s%8%s$O(B OX RFC 100 $B$KDj5A$5$l$?CfCG=hM}$r40N;$7$?$N$A(B,
1.5 ! takayama 45: $B$5$i$K<!$N=hM}$r$*$3$J$o$J$$$H$$$1$J$$(B.
1.2 takayama 46: $B>e0U2<C#$NCfCG=hM}(B:
1.5 ! takayama 47: 1. $B<+J,$N;R6!%W%m%;%9$r$9$Y$F%j%9%H$9$k(B
! 48: ($B$?$H$($P(B asir $B$N>l9g$O(B ox_get_serverinfo())
! 49: 2. $B;R6!%W%m%;%9$K=gHV$K(B OpenXM-RFC 100 $B$NCfCG%a%C%;!<%8$rAw$k(B.
! 50:
1.2 takayama 51: */
52:
53: /*&en
1.5 ! takayama 54:
1.2 takayama 55: Engines complient to OX RFC 103 must execute the following
56: procedures after finishing the interruption exception
57: defined by OX RFC 100.
1.5 ! takayama 58:
! 59: 1. List all the child processes.
! 60: (For example, use the function ox_get_serverinfo() in case of asir).
! 61: 2. Send all the child processes the interruption message defined
1.2 takayama 62: OX RFC 100.
1.5 ! takayama 63:
1.2 takayama 64: */
1.1 takayama 65:
1.5 ! takayama 66: //&ja @@@$B%5!<%PLZ$NBg0hJQ?t(B
! 67: //&en @@@Global variable of the tree of the servers
1.3 takayama 68:
69: //&ja OX RFC 103 $BBP1~$N%(%s%8%s$O%(%s%8%s4X?t(B
70: /*&en
71: The engines complient to OX RFC 103 implement the engine function
72: */
73: /*&C
1.5 ! takayama 74: ox103_set_shared_variable(CMO string Name, CMO object value)
1.3 takayama 75: */
76: /*&ja
77: $B$r<BAu$7$F$$$k(B.
1.5 ! takayama 78: $B$3$N4X?t$,8F$P$l$k$H(B, $B%(%s%8%s%9%?%C%/%^%7%s$NJQ?t(B Name $B$KCM(B value
! 79: $B$,@_Dj$5$l(B, $B$5$i$K;R$I$b$N%W%m%;%9$9$Y$F$N%(%s%8%s4X?t(B
! 80: ox103_set_shared_variable
1.3 takayama 81: $B$r$h$V(B.
82: */
83: /*&en
84: When this function is called,
1.5 ! takayama 85: the value value is assigned to
! 86: the variable Name of the engine stackmachine
1.3 takayama 87: and the engine calls the function
1.5 ! takayama 88: ox103_set_shared_variable
1.3 takayama 89: of all the child processes with the same arguments.
90: */
91:
92: /*&ja
93: $B$?$H$($P(B,
1.5 ! takayama 94: $B$3$N5!G=$O(B asir-contrib $B$K$*$$$FJQ?t(B Xm_noX (ox server $BMQ$N(B debug
1.3 takayama 95: window $B$rI=<($9$k$+$7$J$$$+$N%U%i%0(B) $B$NCM$rF1Js$9$k$N$KMQ$$$F$$$k(B.
96: */
97: /*&en
98: For example,
99: this protocol is used in the asir-contrib
1.5 ! takayama 100: to broad cast the value of the variable Xm\_noX,
1.3 takayama 101: which is the flag of hiding the debug window of an ox server.
102: */
103:
104:
1.5 ! takayama 105: //&ja @@$B?7$7$$(B CMO
! 106: //&en @@New CMO
1.1 takayama 107:
1.5 ! takayama 108: //&ja @@$B%U%!%$%k$X$NFI$_=q$-(B
! 109: //&en @@File IO
1.1 takayama 110:
1.5 ! takayama 111: //&ja @@$B%(%s%8%sG'>Z<jB3$-(B
! 112: //&en @@Engine authentication
1.1 takayama 113:
1.2 takayama 114: /*&ja
1.5 ! takayama 115:
1.2 takayama 116: $B%P%$%H%*!<%@!<$r7h$a$k$?$a$N>pJs8r49(B (OX-RFC 100 $B;2>H(B) $B$NA0$K(B
117: $B%(%s%8%sG'>Z<jB3$-$r$*$3$J$&(B.
1.4 takayama 118:
119: $BG'>Z%W%m%H%3%k$K$O2<$N?^$N(B step 1, step 2, step 3 $B$G$"$k(B.
120:
121:
122: client server
123:
124: ---------------- step 1 ----------------------->
125: ssh $B$K$h$k(B server $B$X$N(B login.
126: controle server, engine server $B$H$N@\B3$r3NN)$9$k$?$a$N(B
127: $B%]!<%HHV9f$*$h$S(B -control= ... , -data=...
128: $BG'>ZJ}K!$*$h$S(B -authtype=NONE | <<oneTimePassword>>
129: $BG'>Z%Q%9%o!<%I(B -passControl=... , -passData=...
130: $B$bAw?.$5$l$k(B.
131: $BG'>Z%Q%9%o!<%I$N0E9f(B -authEncoding=<<NONE>> | file | RSA
132: $B2=J}K!$N;XDj(B.
133: << >> $B$O(B src/kxx/ox $B$NI8=`CM(B
134:
135:
136: <---------------- step 2 -------------------------->
137: -reverse $B$N>l9g$O(B <--- $B$N8~$-$K(B TCP/IP $B@\B3$,3NN)$5$l$k(B.
138: $B$=$&$G$J$$$H$-$O(B ---> $B$N8~$-$K(B TCP/IP $B@\B3$,3NN)$5$l$k(B.
139:
140: <---------------- step 3 -------------------------->
141: -authtype=oneTimePassword $B$N;~(B.
142: connect $B$7$?B&$,(B accept $B$7$?B&$X(B oneTimePassword $B$rAw$k(B.
143: $BKvHx$N(B 0 $B$rAw?.$9$k(B.
144:
145: $B0J2<(B launcher $B$N;E;v$O=*N;$7$F(B, engine $B$H(B control $B$K@)8f$,0\$k(B.
146: <---------------- step 4 -------------------------->
147: engine $B$N(B byte order $B$r@_Dj(B.
148:
149: <---------------------------------------------------->
150: OpenXM $B$N%Q%1%C%H8r49(B
151:
1.5 ! takayama 152:
1.4 takayama 153: */
154:
155: /*&ja
156:
157: authtype $B$O(B NONE $B$+(B oneTimePassword $B$G$"$k(B.
158: oneTimePassword $B$O1Q?t;z$G9=@.$5$l$?Ns$G$"$k(B.
159: oneTimePassword $B$O>o$K%/%i%$%"%s%H$G@8@.$5$l$F(B, $B$J$s$i$+$NJ}K!$G%5!<%P$K(B
160: $BG[Aw$5$l$k(B. connect $BB&$,(B oneTimePassword $B$rJ?J8$G(B accept $BB&$KAw?.$7$F(B
161: $BG'>Z$,=*N;$9$k(B.
162:
163: authEncoding $B$G(B oneTimePassword $B$NG[AwJ}K!$r5,Dj$9$k(B.
164: authEncoding $B$O(B NONE $B$+(B file $B$+(B RSA $B$G$"$k(B.
165:
166: authEncoding=NONE $B$,A*Br$5$l$?>l9g(B oneTimePassword $B$NG[Aw$KFCJL$JJ}K!$rMxMQ(B
167: $B$7$J$$(B.
168: NONE $B$rA*Br$7$?>l9g(B, $B8=:_$N(B ox launcher $B$N<BAu$G$O$?$H$($P(B -passControl
169: $B$N$"$H$K(B oneTimePassword $B$,@8$N7A$G8=$l$k$3$H$H$J$k(B.
170: Unix $B$N>l9g$3$l$O(B command $B$N0z?t$G$"$j(B client $B$H(B server $B$NDL?.O)$,(B
171: ssh $BEy$G0E9f2=$5$l$F$$$?$H$9$k$H%M%C%H%o!<%/%f!<%6$OGA$-$_$k$3$H$O$G$-$J$$$,(B,
172: $BF10l5!$N%f!<%6$O8+$k$3$H$,2DG=$G$"$k(B.
173: $B$7$?$,$C$F(B NONE $B$NA*Br$,2DG=$G$"$k$N$O(B client $B$*$h$S(B server $B$,==J,?.Mj(B
174: $B$G$-$k$H$-$K8B$k(B.
175:
176: */
177:
178: /*&ja
179:
1.5 ! takayama 180: @@@authEncoding=file $B$N>l9g(B.
1.4 takayama 181:
182: authEncoding=file $B$rA*Br$7$?>l9g$O(B oneTimePassword $B$OJL$KMQ0U$5$l$?0BA4$J(B
183: $BDL?.7PO)(B($B$?$H$($P(B scp) $B$rMQ$$$F(B file $B$H$7$FG[Aw$5$l$k(B.
184: oneTimePassword $B$,3JG<$5$l$?(B file $BL>$r(B -passControl, -passData $B0z?t$GEO$9(B.
185: file $BL>$O(B $HOME/.openxm/tmp.otp/ $B$+$i$NAjBP%Q%9L>$G$"$k(B.
186: $B%Q%9$N6h@Z$jJ8;z$O(B windows $B$G$b(B / $B$rMQ$$$k(B.
187: $B%/%i%$%"%s%H$O<!$N5,B'$G%U%!%$%kL>$r@8@.$9$k(B.
188: $B%U%!%$%kL>$K$O1Q?t;z$H(B . - _ $B$NMxMQ$7$+$f$k$5$l$J$$(B. $B%U%!%$%kL>$O<!$N7A<0(B
189: $B$G$"$k(B.
190:
191: clientname-servernameUidPidSerial-time.pass
192:
193: $B$3$3$G(B time $B$O(B time(2) $B$NLa$jCM$r?t;zJ8;zNs$KJQ49$7$?7A<0$G$"$k(B.
194: oneTimePassword $B$N@8@.;~9o$r@Z$j>e$2$F(B 10 $BJ,Kh$N@5;~$KJQ49$7$?$b$N$H$9$k(B.
195: servernameUidPidSerial $B$O(B client $B$,(B oneTimePassword $B$r@8@.$7$F$+$i(B
196: 10 $BJ,4V(B, $B%/%i%$%"%s%H%7%9%F%`$G9b$$3NN($G0l0UE*$G$"$k$3$H$,J]>Z$5$l$F$$$k(B
197: $BJ8;zNs$J$i$J$s$G$b$h$$(B.
198:
199: $BNc(B
200: client server
201:
202: oneTimePassword 1342546 $B$r3JG<$7$?%U%!%$%k(B
203: yama.openxm.org-00001-2312123123.pass $B$r@8@.(B
204:
205: oneTimePassword 89123888 $B$r3JG<$7$?%U%!%$%k(B
206: yama.openxm.org-00002-2312123124.pass $B$r@8@.(B
207: ----------------------------------------------------->
208: $B>e$NFs$D$N%U%!%$%k$r0BA4$JDL?.O)$rMQ$$$FG[Aw$9$k(B.
209: ($B$?$H$($P(B scp )
210:
211: ----------------------------------------------------->
212: ox -authtype oneTimePassword
213: -authEncoding file
214: -passControl yama.openxm.org-00001-2312123123.pass
215: -passData yama.openxm.org-00002-2312123124.pass
216:
217:
218: <---------------- step 2 -------------------------->
219: -reverse $B$N>l9g$O(B <--- $B$N8~$-$K(B TCP/IP $B@\B3$,3NN)$5$l$k(B.
220: $B$=$&$G$J$$$H$-$O(B ---> $B$N8~$-$K(B TCP/IP $B@\B3$,3NN)$5$l$k(B.
221:
222: <---------------- step 3 -------------------------->
223: connect $B$7$?B&$,(B accept $B$7$?B&$X(B oneTimePassword $B$rJ?J8$G$*$/$k(B.
224:
225:
226:
227: oneTimePassword 1342546 $B$r3JG<$7$?%U%!%$%k(B
228: yama.openxm.org-00001-2312123123.pass $B$r(B server $B$K@8@.$9$k$?$a$K(B
229: $B$?$H$($P(B sendStringAsAfile(char *servername, char *serveruser,
230: char *filename, char *otp);
231: $B$N$h$&$J(B API $B$rMQ0U$7$F$*$/$H$h$$$G$"$m$&(B.
232:
233: */
234:
235: /*&ja
236:
1.5 ! takayama 237: @@@authEncoding=RSA $B$N>l9g(B.
1.4 takayama 238:
239: RSA $B$NHkL)80(B, $B8x3+80$r3JG<$9$k%U%!%$%kL>$O0J2<$N$H$*$j(B.
240: $HOME/.openxm/rsa/ox103-rsa0-identity ($BHkL)80$r$J$i$Y$?$b$N(B)
241: $HOME/.openxm/rsa/ox103-rsa0-identity.pub ($B8x3+80(B: $B$3$N7A<0$G$OMxMQ$5$l$:(B)
242: $HOME/.openxm/rsa/ox103-rsa0-authorizedkeys ($B8x3+80$r$J$i$Y$?$b$N(B)
243:
244: $B80%U%!%$%k$O<!$N%G!<%?$r6uGr$G6h@Z$C$FJB$Y$?$b$N$G$"$k(B.
245: user$B<1JL;R(B $B80(B($B#1#0?J?t;zNs(B) RSA$B%U%)!<%^%C%H<1JL;R(B(optional)
246: $B%3%a%s%H9T$O(B # $B$G;O$^$k(B.
1.5 ! takayama 247: $B3F%G!<%?$N6h@Z$j$O(B 0xd $B$^$?$O(B 0xa $B$^$?$O(B $BN>J}$G$"$k(B.
1.4 takayama 248:
1.5 ! takayama 249: $B%U%)!<%^%C%H<1JL;R$,(B 0 $B$N>l9g$O8x3+800E9f2=(B
! 250: x --> x^65537 mod n $B$rMQ$$(B, 128 byte (1024 bit) $B$E$D%G!<%?$r6h@Z$C$F=hM}$9$k(B.
! 251: $BHkL)800E9f2=$O(B x --> x^d mod n $B$rMQ$$$k(B.
! 252: $B%U%)!<%^%C%H<1JL;R(B 0 $B$O<B83MQ$N0UL#(B.
! 253: $BHkL)80$O(B n,d , $B8x3+80$O(B n $B$N7A<0$G(B n $B$H(B d $B$O(B , $B$G6h@Z$k(B.
! 254: $BJ8;zNs$rAw?.$9$k$H$-$O(B 0 $B$,J8;zNs=*$j$N%^!<%/$H$J$j(B,
! 255: 0 $B$G$N$3$jItJ,$rKd$a$k(B. $B%P%$%HNs$rAw$k$H$-$O%G!<%?$ND9$5$OJLAw$9$k(B.
1.4 takayama 256:
257: Todo: $B80$N3JG<J}K!(B, $B%G!<%?6h@Z$j$NJ}K!$J$I2DG=$J8B$j(B
258: RFC3447 $B$K=`5r$9$k$h$&$KJQ99$;$h(B. $B=`5r$,40N;$7$?$i(B -rsa0- $B$r(B
259: -rsa- $B$HJQ99$9$k(B.
260:
261: $BNc(B:
262:
263: client $BB&(B
264:
265: ox103-rsa0-identity
266: # client $BB&$,;H$&HkL)80(B
267: takayama@client.math.kobe-u.ac.jp 1234523....
268:
269:
270: ox103-rsa0-authorizedkeys
271: @ server $BB&$,;H$&HkL)80$KBP1~$9$k8x3+80(B
272: takayama@server.math.kobe-u.ac.jp 8989898....
273:
274: server $BB&(B
275: ox103-rsa0-identity
276: # server $BB&$,;H$&HkL)80(B
277: takayama@server.math.kobe-u.ac.jp 8781234....
278:
279: ox103-rsa0-authorizedkeys
280: @ client $BB&$,;H$&HkL)80$KBP1~$9$k8x3+80(B
281: takayama@client.math.kobe-u.ac.jp 89891....
282:
283: authEncoding=RSA $B$rMxMQ$9$k>l9g$O$3$l$i$N80$rE,@Z$K(B .openxm/rsa $B$N2<$K(B
284: $BCV$+$J$$$H$$$1$J$$(B. .openxm/rsa $B$N(B permission $B$O(B rwx------ $B$G$"$k$3$H(B.
285:
286: $BCm0U(B: $BHkL)80$r@8$G3JG<$7$J$$>l9g%U%!%$%kL>$r(B ox103-rsa2-* $BEy$HJQ99$9$k(B
1.5 ! takayama 287: $BM=Dj(B. RSA encoding $BJ}K!$O?t;zL5$7(B, $B?t;z$NBg$-$$$b$N$+$i80%U%!%$%k$r(B
! 288: $B=gHV$K%5!<%A$7$F(B RSA $B$N%U%)!<%^%C%H$r7hDj$9$k(B.
1.4 takayama 289:
290: authEncoding=RSA $B$N>l9g(B -passData $B$*$h$S(B -passControl $B$O(B
291: oneTimePassword ($BJ8;zNs(B) $B$r(B bit data $B$H$_$F(B rsa $B$G0E9f2=$7$?$b$N$r(B
292: URL encoding $B$7$?7A$GAw$k(B.
293:
294: oneTimePassword $B$N<~4|$O==J,Bg$-$/$J$$$H$$$1$J$$(B.
295: $B0lG/$O(B 31536000 $BIC$G$"$k(B. 100 $BG/$O(B 3153600000 $BIC(B (10 $B7e(B) $B$G$"$k(B.
1.5 ! takayama 296: oneTimePassword $B$O?t;z$N>l9g(B 10 $B7e0J>e$G$"$k$3$H$,I,?\$G$"$j(B,
! 297: 20 $B7e0J>e$G$"$k$3$H$,K>$^$7$$(B.
! 298:
! 299: */
! 300:
! 301: /*&ja
! 302:
! 303: @@@Step 1 $B$,<:GT$7$?>l9g$K$D$$$F(B.
! 304:
! 305: Step 1 $B$N<:GT$N860x$K$O<!$N$h$&$J2DG=@-$,$"$k(B.
! 306: 1. ssh $B$K$h$k(B remote login $B$N<:GT(B.
! 307: 2. Remote server $B$N%Q%9$K(B ox100start/ox $BEy$N%m!<%s%A%c$,B8:_$7$J$$(B.
! 308: 3. Remote server $B$K(B xterm $B$,B8:_$7$J$$$+(B, $BB8:_$7$F$b(B X $B%5!<%P$N@\B3$K<:GT$9$k(B.
! 309: 4. Remote server $B$K%(%s%8%s$,B8:_$7$J$$(B.
! 310: 5. Remote server $B$H(B client $B$N(B TCP/IP $B@\B3$,$J$s$i$+$N860x$G<:GT$9$k(B.
! 311:
! 312: $B<:GT$N>l9g$KBP1~$9$k$?$a(B,
! 313: TCP/IP $B@\B3$G$N(B Accept $BB&$O%?%$%`%"%&%HF0:n$r$9$k$3$H(B.
! 314:
! 315:
! 316: $B<:GT$N860x$rCN$i$;$k%W%m%H%3%k$O$-$a$i$l$F$$$J$$$,(B,
! 317: $B<BAu>e$NBP:v$H$7$F0J2<$N$b$N$,$"$k(B.
! 318: 1. $B%(%i!<%a%C%;!<%8$r=PNO$7$F(B sleep(10); $B$9$k(B.
! 319: 2. $B%(%i!<%a%C%;!<%8$r%U%!%$%kEy$K=PNO$9$k(B.
! 320:
! 321: $B$J$*(B OX-RFC-101 $B$G$O(B Step 1 $B$,J,N%$7$F$$$k$?$a(B, $B%(%i!<$NDLCN$,$h$j4JC1$G$"$k(B.
1.4 takayama 322:
1.2 takayama 323: */
324:
1.5 ! takayama 325:
! 326: //&ja @@$B9W8%<T$*$h$S;n83<BAu(B
! 327: //&en @@Contributors and sample implementations
1.2 takayama 328:
329: /*&ja
1.5 ! takayama 330: $BCfCG$*$h$SJQ?t$NEAGE$K$D$$$F$O9b;3$,@_7W(B, asir $B$*$h$S(B kan/sm1 $B$X$N(B
! 331: $B<BAu(B, $BI>2A$r$*$3$J$C$?(B.
! 332: (OpenXM/src/asir-contrib/packages/src/oxrfc103.rr,
! 333: OpenXM/src/kan96xx/Doc/oxrfc103.sm1
1.2 takayama 334: $B$r$_$h(B).
1.5 ! takayama 335:
! 336: $B%(%s%8%sG'>Z<jB3$-$N(B file encoding $BK!$OLnO$$H9b;3$N5DO@$+$i@8$^$l$?(B.
! 337: $B%(%s%8%sG'>Z<jB3$-$O(B ox100start, ox $B$KItJ,<BAu$5$l$F$$$k(B.
! 338: OpenXM/src/kxx/
! 339: $B$N%U%!%$%k72$*$h$S(B
! 340: OpenXM/src/kan96xx/Doc/ox.sm1
! 341: $B$r$_$h(B.
! 342: $BNc(B: sm1$B$r5/F08e(B, (ox.sm1) run asirconnectr
1.3 takayama 343: */
344:
345: /*&ja
346: $B9TNs(B, $B%Y%/%H%k$N(B CMO $B$O(B NTL $B$N%5!<%P2=$r%F%9%H%1!<%9$H$7$F(B
347: $B4d:,$,@_7W(B, $B<BAu(B, $BI>2A$r9T$C$?(B.
1.5 ! takayama 348: RSA $B$N%-!<@8@.(B, DES $BEy$N(B OpenXM crypt $B%i%$%V%i%j$N<BAu$O4d:,$,$*$3$J$C$F$$$k(B.
! 349: OpenXM/src/ox_ntl/crypt $B$r$_$h(B.
1.2 takayama 350: */
1.1 takayama 351:
1.5 ! takayama 352: //&ja @@$B;29MJ88%(B
! 353: //&en @@Bibliography
! 354:
! 355: /*&C
! 356:
! 357: [OpenXM-RFC-100] Design and Implementation of OpenXM Client-Server Model
! 358: and Common Mathematical Object Format. M.Noro, N.Takayama
! 359:
! 360: [OpenXM-RFC-101] Protocol to Start Engines. K.Ohara
! 361:
! 362:
! 363: [RFC3447] Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography
! 364: Specifications Version 2.1. J. Jonsson, B. Kaliski. February 2003.
! 365: (Format: TXT=143173 bytes) (Obsoletes RFC2437) (Status:
! 366: INFORMATIONAL)
! 367:
! 368: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>