File: Netfs.html

package info (click to toggle)
ocamlnet 4.1.9-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 54,024 kB
  • sloc: ml: 151,939; ansic: 11,071; sh: 2,003; makefile: 1,310
file content (596 lines) | stat: -rw-r--r-- 36,722 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="Start" href="index.html">
<link rel="previous" href="Netpagebuffer.html">
<link rel="next" href="Netglob.html">
<link rel="Up" href="index.html">
<link title="Index of types" rel=Appendix href="index_types.html">
<link title="Index of extensions" rel=Appendix href="index_extensions.html">
<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
<link title="Index of values" rel=Appendix href="index_values.html">
<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
<link title="Index of class methods" rel=Appendix href="index_methods.html">
<link title="Index of classes" rel=Appendix href="index_classes.html">
<link title="Index of class types" rel=Appendix href="index_class_types.html">
<link title="Index of modules" rel=Appendix href="index_modules.html">
<link title="Index of module types" rel=Appendix href="index_module_types.html">
<link title="Uq_gtk" rel="Chapter" href="Uq_gtk.html">
<link title="Uq_tcl" rel="Chapter" href="Uq_tcl.html">
<link title="Equeue" rel="Chapter" href="Equeue.html">
<link title="Unixqueue" rel="Chapter" href="Unixqueue.html">
<link title="Unixqueue_pollset" rel="Chapter" href="Unixqueue_pollset.html">
<link title="Unixqueue_select" rel="Chapter" href="Unixqueue_select.html">
<link title="Uq_resolver" rel="Chapter" href="Uq_resolver.html">
<link title="Uq_engines" rel="Chapter" href="Uq_engines.html">
<link title="Uq_multiplex" rel="Chapter" href="Uq_multiplex.html">
<link title="Uq_transfer" rel="Chapter" href="Uq_transfer.html">
<link title="Uq_socks5" rel="Chapter" href="Uq_socks5.html">
<link title="Uq_io" rel="Chapter" href="Uq_io.html">
<link title="Uq_lwt" rel="Chapter" href="Uq_lwt.html">
<link title="Uq_libevent" rel="Chapter" href="Uq_libevent.html">
<link title="Uq_mt" rel="Chapter" href="Uq_mt.html">
<link title="Uq_client" rel="Chapter" href="Uq_client.html">
<link title="Uq_server" rel="Chapter" href="Uq_server.html">
<link title="Uq_datagram" rel="Chapter" href="Uq_datagram.html">
<link title="Uq_engines_compat" rel="Chapter" href="Uq_engines_compat.html">
<link title="Equeue_intro" rel="Chapter" href="Equeue_intro.html">
<link title="Equeue_howto" rel="Chapter" href="Equeue_howto.html">
<link title="Netcamlbox" rel="Chapter" href="Netcamlbox.html">
<link title="Netcgi_apache" rel="Chapter" href="Netcgi_apache.html">
<link title="Netcgi_modtpl" rel="Chapter" href="Netcgi_modtpl.html">
<link title="Netcgi_plex" rel="Chapter" href="Netcgi_plex.html">
<link title="Netcgi_common" rel="Chapter" href="Netcgi_common.html">
<link title="Netcgi" rel="Chapter" href="Netcgi.html">
<link title="Netcgi_ajp" rel="Chapter" href="Netcgi_ajp.html">
<link title="Netcgi_scgi" rel="Chapter" href="Netcgi_scgi.html">
<link title="Netcgi_cgi" rel="Chapter" href="Netcgi_cgi.html">
<link title="Netcgi_fcgi" rel="Chapter" href="Netcgi_fcgi.html">
<link title="Netcgi_dbi" rel="Chapter" href="Netcgi_dbi.html">
<link title="Netcgi1_compat" rel="Chapter" href="Netcgi1_compat.html">
<link title="Netcgi_test" rel="Chapter" href="Netcgi_test.html">
<link title="Netcgi_porting" rel="Chapter" href="Netcgi_porting.html">
<link title="Nethttp_client_conncache" rel="Chapter" href="Nethttp_client_conncache.html">
<link title="Nethttp_client" rel="Chapter" href="Nethttp_client.html">
<link title="Nettelnet_client" rel="Chapter" href="Nettelnet_client.html">
<link title="Netftp_data_endpoint" rel="Chapter" href="Netftp_data_endpoint.html">
<link title="Netftp_client" rel="Chapter" href="Netftp_client.html">
<link title="Nethttp_fs" rel="Chapter" href="Nethttp_fs.html">
<link title="Netftp_fs" rel="Chapter" href="Netftp_fs.html">
<link title="Netsmtp" rel="Chapter" href="Netsmtp.html">
<link title="Netpop" rel="Chapter" href="Netpop.html">
<link title="Netldap" rel="Chapter" href="Netldap.html">
<link title="Netclient_tut" rel="Chapter" href="Netclient_tut.html">
<link title="Netgss_bindings" rel="Chapter" href="Netgss_bindings.html">
<link title="Netgss" rel="Chapter" href="Netgss.html">
<link title="Nethttpd_types" rel="Chapter" href="Nethttpd_types.html">
<link title="Nethttpd_kernel" rel="Chapter" href="Nethttpd_kernel.html">
<link title="Nethttpd_reactor" rel="Chapter" href="Nethttpd_reactor.html">
<link title="Nethttpd_engine" rel="Chapter" href="Nethttpd_engine.html">
<link title="Nethttpd_services" rel="Chapter" href="Nethttpd_services.html">
<link title="Nethttpd_plex" rel="Chapter" href="Nethttpd_plex.html">
<link title="Nethttpd_util" rel="Chapter" href="Nethttpd_util.html">
<link title="Nethttpd_intro" rel="Chapter" href="Nethttpd_intro.html">
<link title="Netmcore" rel="Chapter" href="Netmcore.html">
<link title="Netmcore_camlbox" rel="Chapter" href="Netmcore_camlbox.html">
<link title="Netmcore_mempool" rel="Chapter" href="Netmcore_mempool.html">
<link title="Netmcore_heap" rel="Chapter" href="Netmcore_heap.html">
<link title="Netmcore_ref" rel="Chapter" href="Netmcore_ref.html">
<link title="Netmcore_array" rel="Chapter" href="Netmcore_array.html">
<link title="Netmcore_sem" rel="Chapter" href="Netmcore_sem.html">
<link title="Netmcore_mutex" rel="Chapter" href="Netmcore_mutex.html">
<link title="Netmcore_condition" rel="Chapter" href="Netmcore_condition.html">
<link title="Netmcore_queue" rel="Chapter" href="Netmcore_queue.html">
<link title="Netmcore_buffer" rel="Chapter" href="Netmcore_buffer.html">
<link title="Netmcore_matrix" rel="Chapter" href="Netmcore_matrix.html">
<link title="Netmcore_hashtbl" rel="Chapter" href="Netmcore_hashtbl.html">
<link title="Netmcore_process" rel="Chapter" href="Netmcore_process.html">
<link title="Netmcore_tut" rel="Chapter" href="Netmcore_tut.html">
<link title="Netmcore_basics" rel="Chapter" href="Netmcore_basics.html">
<link title="Netplex_types" rel="Chapter" href="Netplex_types.html">
<link title="Netplex_mp" rel="Chapter" href="Netplex_mp.html">
<link title="Netplex_mt" rel="Chapter" href="Netplex_mt.html">
<link title="Netplex_log" rel="Chapter" href="Netplex_log.html">
<link title="Netplex_controller" rel="Chapter" href="Netplex_controller.html">
<link title="Netplex_container" rel="Chapter" href="Netplex_container.html">
<link title="Netplex_sockserv" rel="Chapter" href="Netplex_sockserv.html">
<link title="Netplex_workload" rel="Chapter" href="Netplex_workload.html">
<link title="Netplex_main" rel="Chapter" href="Netplex_main.html">
<link title="Netplex_config" rel="Chapter" href="Netplex_config.html">
<link title="Netplex_kit" rel="Chapter" href="Netplex_kit.html">
<link title="Rpc_netplex" rel="Chapter" href="Rpc_netplex.html">
<link title="Netplex_cenv" rel="Chapter" href="Netplex_cenv.html">
<link title="Netplex_semaphore" rel="Chapter" href="Netplex_semaphore.html">
<link title="Netplex_sharedvar" rel="Chapter" href="Netplex_sharedvar.html">
<link title="Netplex_mutex" rel="Chapter" href="Netplex_mutex.html">
<link title="Netplex_encap" rel="Chapter" href="Netplex_encap.html">
<link title="Netplex_mbox" rel="Chapter" href="Netplex_mbox.html">
<link title="Netplex_internal" rel="Chapter" href="Netplex_internal.html">
<link title="Netplex_intro" rel="Chapter" href="Netplex_intro.html">
<link title="Netplex_advanced" rel="Chapter" href="Netplex_advanced.html">
<link title="Netplex_admin" rel="Chapter" href="Netplex_admin.html">
<link title="Netshm" rel="Chapter" href="Netshm.html">
<link title="Netshm_data" rel="Chapter" href="Netshm_data.html">
<link title="Netshm_hashtbl" rel="Chapter" href="Netshm_hashtbl.html">
<link title="Netshm_array" rel="Chapter" href="Netshm_array.html">
<link title="Netshm_intro" rel="Chapter" href="Netshm_intro.html">
<link title="Netstring_pcre" rel="Chapter" href="Netstring_pcre.html">
<link title="Netconversion" rel="Chapter" href="Netconversion.html">
<link title="Netchannels" rel="Chapter" href="Netchannels.html">
<link title="Netstream" rel="Chapter" href="Netstream.html">
<link title="Netmime_string" rel="Chapter" href="Netmime_string.html">
<link title="Netmime" rel="Chapter" href="Netmime.html">
<link title="Netsendmail" rel="Chapter" href="Netsendmail.html">
<link title="Neturl" rel="Chapter" href="Neturl.html">
<link title="Netaddress" rel="Chapter" href="Netaddress.html">
<link title="Netbuffer" rel="Chapter" href="Netbuffer.html">
<link title="Netmime_header" rel="Chapter" href="Netmime_header.html">
<link title="Netmime_channels" rel="Chapter" href="Netmime_channels.html">
<link title="Neturl_ldap" rel="Chapter" href="Neturl_ldap.html">
<link title="Netdate" rel="Chapter" href="Netdate.html">
<link title="Netencoding" rel="Chapter" href="Netencoding.html">
<link title="Netulex" rel="Chapter" href="Netulex.html">
<link title="Netaccel" rel="Chapter" href="Netaccel.html">
<link title="Netaccel_link" rel="Chapter" href="Netaccel_link.html">
<link title="Nethtml" rel="Chapter" href="Nethtml.html">
<link title="Netstring_str" rel="Chapter" href="Netstring_str.html">
<link title="Netmappings" rel="Chapter" href="Netmappings.html">
<link title="Netaux" rel="Chapter" href="Netaux.html">
<link title="Nethttp" rel="Chapter" href="Nethttp.html">
<link title="Netpagebuffer" rel="Chapter" href="Netpagebuffer.html">
<link title="Netfs" rel="Chapter" href="Netfs.html">
<link title="Netglob" rel="Chapter" href="Netglob.html">
<link title="Netauth" rel="Chapter" href="Netauth.html">
<link title="Netsockaddr" rel="Chapter" href="Netsockaddr.html">
<link title="Netnumber" rel="Chapter" href="Netnumber.html">
<link title="Netxdr_mstring" rel="Chapter" href="Netxdr_mstring.html">
<link title="Netxdr" rel="Chapter" href="Netxdr.html">
<link title="Netcompression" rel="Chapter" href="Netcompression.html">
<link title="Netunichar" rel="Chapter" href="Netunichar.html">
<link title="Netasn1" rel="Chapter" href="Netasn1.html">
<link title="Netasn1_encode" rel="Chapter" href="Netasn1_encode.html">
<link title="Netoid" rel="Chapter" href="Netoid.html">
<link title="Netstring_tstring" rel="Chapter" href="Netstring_tstring.html">
<link title="Netdn" rel="Chapter" href="Netdn.html">
<link title="Netx509" rel="Chapter" href="Netx509.html">
<link title="Netascii_armor" rel="Chapter" href="Netascii_armor.html">
<link title="Nettls_support" rel="Chapter" href="Nettls_support.html">
<link title="Netmech_scram" rel="Chapter" href="Netmech_scram.html">
<link title="Netmech_scram_gssapi" rel="Chapter" href="Netmech_scram_gssapi.html">
<link title="Netmech_scram_sasl" rel="Chapter" href="Netmech_scram_sasl.html">
<link title="Netmech_scram_http" rel="Chapter" href="Netmech_scram_http.html">
<link title="Netgssapi_support" rel="Chapter" href="Netgssapi_support.html">
<link title="Netgssapi_auth" rel="Chapter" href="Netgssapi_auth.html">
<link title="Netchannels_crypto" rel="Chapter" href="Netchannels_crypto.html">
<link title="Netx509_pubkey" rel="Chapter" href="Netx509_pubkey.html">
<link title="Netx509_pubkey_crypto" rel="Chapter" href="Netx509_pubkey_crypto.html">
<link title="Netsaslprep" rel="Chapter" href="Netsaslprep.html">
<link title="Netmech_plain_sasl" rel="Chapter" href="Netmech_plain_sasl.html">
<link title="Netmech_crammd5_sasl" rel="Chapter" href="Netmech_crammd5_sasl.html">
<link title="Netmech_digest_sasl" rel="Chapter" href="Netmech_digest_sasl.html">
<link title="Netmech_digest_http" rel="Chapter" href="Netmech_digest_http.html">
<link title="Netmech_krb5_sasl" rel="Chapter" href="Netmech_krb5_sasl.html">
<link title="Netmech_gs2_sasl" rel="Chapter" href="Netmech_gs2_sasl.html">
<link title="Netmech_spnego_http" rel="Chapter" href="Netmech_spnego_http.html">
<link title="Netchannels_tut" rel="Chapter" href="Netchannels_tut.html">
<link title="Netmime_tut" rel="Chapter" href="Netmime_tut.html">
<link title="Netsendmail_tut" rel="Chapter" href="Netsendmail_tut.html">
<link title="Netulex_tut" rel="Chapter" href="Netulex_tut.html">
<link title="Neturl_tut" rel="Chapter" href="Neturl_tut.html">
<link title="Netsys" rel="Chapter" href="Netsys.html">
<link title="Netsys_posix" rel="Chapter" href="Netsys_posix.html">
<link title="Netsys_pollset" rel="Chapter" href="Netsys_pollset.html">
<link title="Netlog" rel="Chapter" href="Netlog.html">
<link title="Netexn" rel="Chapter" href="Netexn.html">
<link title="Netsys_win32" rel="Chapter" href="Netsys_win32.html">
<link title="Netsys_pollset_posix" rel="Chapter" href="Netsys_pollset_posix.html">
<link title="Netsys_pollset_win32" rel="Chapter" href="Netsys_pollset_win32.html">
<link title="Netsys_pollset_generic" rel="Chapter" href="Netsys_pollset_generic.html">
<link title="Netsys_signal" rel="Chapter" href="Netsys_signal.html">
<link title="Netsys_oothr" rel="Chapter" href="Netsys_oothr.html">
<link title="Netsys_xdr" rel="Chapter" href="Netsys_xdr.html">
<link title="Netsys_rng" rel="Chapter" href="Netsys_rng.html">
<link title="Netsys_crypto_types" rel="Chapter" href="Netsys_crypto_types.html">
<link title="Netsys_types" rel="Chapter" href="Netsys_types.html">
<link title="Netsys_mem" rel="Chapter" href="Netsys_mem.html">
<link title="Netsys_tmp" rel="Chapter" href="Netsys_tmp.html">
<link title="Netsys_sem" rel="Chapter" href="Netsys_sem.html">
<link title="Netsys_pmanage" rel="Chapter" href="Netsys_pmanage.html">
<link title="Netsys_crypto" rel="Chapter" href="Netsys_crypto.html">
<link title="Netsys_tls" rel="Chapter" href="Netsys_tls.html">
<link title="Netsys_ciphers" rel="Chapter" href="Netsys_ciphers.html">
<link title="Netsys_digests" rel="Chapter" href="Netsys_digests.html">
<link title="Netsys_crypto_modes" rel="Chapter" href="Netsys_crypto_modes.html">
<link title="Netsys_gssapi" rel="Chapter" href="Netsys_gssapi.html">
<link title="Netsys_sasl_types" rel="Chapter" href="Netsys_sasl_types.html">
<link title="Netsys_sasl" rel="Chapter" href="Netsys_sasl.html">
<link title="Netsys_polypipe" rel="Chapter" href="Netsys_polypipe.html">
<link title="Netsys_polysocket" rel="Chapter" href="Netsys_polysocket.html">
<link title="Netsys_global" rel="Chapter" href="Netsys_global.html">
<link title="Nettls_gnutls_bindings" rel="Chapter" href="Nettls_gnutls_bindings.html">
<link title="Nettls_nettle_bindings" rel="Chapter" href="Nettls_nettle_bindings.html">
<link title="Nettls_gnutls" rel="Chapter" href="Nettls_gnutls.html">
<link title="Netunidata" rel="Chapter" href="Netunidata.html">
<link title="Netgzip" rel="Chapter" href="Netgzip.html">
<link title="Rpc_auth_local" rel="Chapter" href="Rpc_auth_local.html">
<link title="Rpc_xti_client" rel="Chapter" href="Rpc_xti_client.html">
<link title="Rpc" rel="Chapter" href="Rpc.html">
<link title="Rpc_program" rel="Chapter" href="Rpc_program.html">
<link title="Rpc_util" rel="Chapter" href="Rpc_util.html">
<link title="Rpc_portmapper_aux" rel="Chapter" href="Rpc_portmapper_aux.html">
<link title="Rpc_packer" rel="Chapter" href="Rpc_packer.html">
<link title="Rpc_transport" rel="Chapter" href="Rpc_transport.html">
<link title="Rpc_client" rel="Chapter" href="Rpc_client.html">
<link title="Rpc_simple_client" rel="Chapter" href="Rpc_simple_client.html">
<link title="Rpc_portmapper_clnt" rel="Chapter" href="Rpc_portmapper_clnt.html">
<link title="Rpc_portmapper" rel="Chapter" href="Rpc_portmapper.html">
<link title="Rpc_server" rel="Chapter" href="Rpc_server.html">
<link title="Rpc_auth_sys" rel="Chapter" href="Rpc_auth_sys.html">
<link title="Rpc_auth_gssapi" rel="Chapter" href="Rpc_auth_gssapi.html">
<link title="Rpc_proxy" rel="Chapter" href="Rpc_proxy.html">
<link title="Rpc_intro" rel="Chapter" href="Rpc_intro.html">
<link title="Rpc_mapping_ref" rel="Chapter" href="Rpc_mapping_ref.html">
<link title="Rpc_intro_gss" rel="Chapter" href="Rpc_intro_gss.html">
<link title="Shell_sys" rel="Chapter" href="Shell_sys.html">
<link title="Shell" rel="Chapter" href="Shell.html">
<link title="Shell_uq" rel="Chapter" href="Shell_uq.html">
<link title="Shell_fs" rel="Chapter" href="Shell_fs.html">
<link title="Shell_intro" rel="Chapter" href="Shell_intro.html">
<link title="Intro" rel="Chapter" href="Intro.html">
<link title="Platform" rel="Chapter" href="Platform.html">
<link title="Foreword" rel="Chapter" href="Foreword.html">
<link title="Ipv6" rel="Chapter" href="Ipv6.html">
<link title="Regexp" rel="Chapter" href="Regexp.html">
<link title="Tls" rel="Chapter" href="Tls.html">
<link title="Crypto" rel="Chapter" href="Crypto.html">
<link title="Authentication" rel="Chapter" href="Authentication.html">
<link title="Credentials" rel="Chapter" href="Credentials.html">
<link title="Gssapi" rel="Chapter" href="Gssapi.html">
<link title="Ocamlnet4" rel="Chapter" href="Ocamlnet4.html">
<link title="Get" rel="Chapter" href="Get.html"><link title="The class type stream_fs" rel="Section" href="#2_Theclasstypestreamfs">
<link title="OS Notes" rel="Section" href="#2_OSNotes">
<link title="Other impementations of stream_fs" rel="Section" href="#links">
<link title="Algorithms" rel="Section" href="#2_Algorithms">
<title>Ocamlnet 4 Reference Manual : Netfs</title>
</head>
<body>
<div class="navbar"><a class="pre" href="Netpagebuffer.html" title="Netpagebuffer">Previous</a>
&nbsp;<a class="up" href="index.html" title="Index">Up</a>
&nbsp;<a class="post" href="Netglob.html" title="Netglob">Next</a>
</div>
<h1>Module <a href="type_Netfs.html">Netfs</a></h1>

<pre><span id="MODULENetfs"><span class="keyword">module</span> Netfs</span>: <code class="code">sig</code> <a href="Netfs.html">..</a> <code class="code">end</code></pre><div class="info module top">
<div class="info-desc">
<p>Class type <code class="code">stream_fs</code> for filesystems with stream access to files</p>
</div>
</div>
<hr width="100%">
<p>The class type <a href="Netfs.stream_fs-c.html"><code class="code">Netfs.stream_fs</code></a>
    is an abstraction for both kernel-level and user-level
    filesystems. It is used as parameter for algorithms (like globbing)
    that operate on filesystems but do not want to assume any particular
    filesystem. Only stream access is provided (no seek).</p>

<p><b>File paths:</b></p>

<p>The filesystem supports hierarchical file names. File paths use
    Unix conventions, i.e.</p>
<ul>
<li><code class="code">/</code> is the root</li>
<li>Path components are separated by slashes. Several consecutive slashes
      are allowed but mean the same as a single slash.</li>
<li><code class="code">.</code> is the same directory</li>
<li><code class="code">..</code> is the parent directory</li>
</ul>
<p>All paths need to be absolute (i.e. start with <code class="code">/</code>).</p>

<p>There can be additional constraints on paths:</p>
<ul>
<li>Character encoding restriction: A certain ASCII-compatible character
      encoding is assumed (including UTF-8)  </li>
<li>Character exclusion: Certain characters may be excluded</li>
</ul>
<p>Implementations may impose more constraints that cannot be expressed
    here (case insensitivity, path length, exclusion of special names etc.).</p>

<p><b>Virtuality:</b></p>

<p>There is no assumption that <code class="code">/</code> is the real root of the local filesystem.
    It can actually be anywhere - a local subdirectory, or a remote directory,
    or a fictive root. There needs not to be any protection against "running
    beyond root", e.g. with the path <code class="code">/..</code>.</p>

<p>This class type also supports remote filesystems, and thus there is no
    concept of file handle (because this would exclude a number of
    implementations).</p>

<p><b>Errors: </b></p>

<p>Errors should generally be indicated by raising <code class="code">Unix_error</code>. For
    many error codes the interpretation is already given by POSIX. Here
    are some more special cases:</p>
<ul>
<li><code class="code">EINVAL</code>: should also be used for invalid paths, or when a flag
      cannot be supported (and it is non-ignorable)</li>
<li><code class="code">ENOSYS</code>: should also be used if an operation is generally unavailable</li>
</ul>
<p>In case of hard errors (like socket errors when communicating with the
    remote server) there is no need to stick to <code class="code">Unix_error</code>, though.</p>

<p><b>Subtyping:</b></p>

<p>The class type <a href="Netfs.stream_fs-c.html"><code class="code">Netfs.stream_fs</code></a> is subtypable, and subtypes can add
    more features by:</p>
<ul>
<li>adding more methods</li>
<li>adding more flags to existing methods</li>
</ul>
<p><b>Omitted:</b></p>

<p>Real filesystems usually provide a lot more features than what is
    represented here, such as:</p>
<ul>
<li>Access control and file permissions</li>
<li>Metadata like timestamps</li>
<li>Random access to files</li>
</ul>
<p>This definition here is intentionally minimalistic. In the future
    this class type will be extended, and more more common filesystem features
    will be covered. See <a href="Netfs.empty_fs-c.html"><code class="code">Netfs.empty_fs</code></a> for a way how to ensure that
    your definition of a <code class="code">stream_fs</code> can still be built after <code class="code">stream_fs</code>
    has been extended.</p>
<h3 id="2_Theclasstypestreamfs">The class type <code class="code">stream_fs</code></h3>
<pre><span id="TYPEread_flag"><span class="keyword">type</span> <code class="type"></code>read_flag</span> = <code class="type">[ `Binary | `Dummy | `Skip of int64 | `Streaming ]</code> </pre>


<pre><span id="TYPEread_file_flag"><span class="keyword">type</span> <code class="type"></code>read_file_flag</span> = <code class="type">[ `Binary | `Dummy ]</code> </pre>


<pre><span id="TYPEwrite_flag"><span class="keyword">type</span> <code class="type"></code>write_flag</span> = <code class="type">[ `Binary | `Create | `Dummy | `Exclusive | `Streaming | `Truncate ]</code> </pre>


<pre><span id="TYPEwrite_file_flag"><span class="keyword">type</span> <code class="type"></code>write_file_flag</span> = <code class="type">[ `Binary | `Create | `Dummy | `Exclusive | `Link | `Truncate ]</code> </pre>


<pre><span id="TYPEwrite_common"><span class="keyword">type</span> <code class="type"></code>write_common</span> = <code class="type">[ `Binary | `Create | `Dummy | `Exclusive | `Truncate ]</code> </pre>
<div class="info ">
<div class="info-desc">
<p>The intersection of <code class="code">write_flag</code> and <code class="code">write_file_flag</code></p>
</div>
</div>


<pre><span id="TYPEsize_flag"><span class="keyword">type</span> <code class="type"></code>size_flag</span> = <code class="type">[ `Dummy ]</code> </pre>


<pre><span id="TYPEtest_flag"><span class="keyword">type</span> <code class="type"></code>test_flag</span> = <code class="type">[ `Dummy | `Link ]</code> </pre>


<pre><span id="TYPEremove_flag"><span class="keyword">type</span> <code class="type"></code>remove_flag</span> = <code class="type">[ `Dummy | `Recursive ]</code> </pre>


<pre><span id="TYPErename_flag"><span class="keyword">type</span> <code class="type"></code>rename_flag</span> = <code class="type">[ `Dummy ]</code> </pre>


<pre><span id="TYPEsymlink_flag"><span class="keyword">type</span> <code class="type"></code>symlink_flag</span> = <code class="type">[ `Dummy ]</code> </pre>


<pre><span id="TYPEreaddir_flag"><span class="keyword">type</span> <code class="type"></code>readdir_flag</span> = <code class="type">[ `Dummy ]</code> </pre>


<pre><span id="TYPEreadlink_flag"><span class="keyword">type</span> <code class="type"></code>readlink_flag</span> = <code class="type">[ `Dummy ]</code> </pre>


<pre><span id="TYPEmkdir_flag"><span class="keyword">type</span> <code class="type"></code>mkdir_flag</span> = <code class="type">[ `Dummy | `Nonexcl | `Path ]</code> </pre>


<pre><span id="TYPErmdir_flag"><span class="keyword">type</span> <code class="type"></code>rmdir_flag</span> = <code class="type">[ `Dummy ]</code> </pre>


<pre><span id="TYPEcopy_flag"><span class="keyword">type</span> <code class="type"></code>copy_flag</span> = <code class="type">[ `Dummy ]</code> </pre>

<p>Note <code class="code">`Dummy</code>: this flag is always ignored. There are two reasons
    for having it:</p>
<ul>
<li>Ocaml does not allow empty variants</li>
<li>it is sometimes convenient to have it
      (e.g. in: <code class="code">if &lt;condition&gt; then `Create else `Dummy</code>)</li>
</ul>

<pre><span id="TYPEtest_type"><span class="keyword">type</span> <code class="type"></code>test_type</span> = <code class="type">[ `D | `E | `F | `H | `N | `R | `S | `W | `X ]</code> </pre>
<div class="info ">
<div class="info-desc">
<p>Tests:</p>
<ul>
<li><code class="code">`N</code>: the file name exists</li>
<li><code class="code">`E</code>: the file exists</li>
<li><code class="code">`D</code>: the file exists and is a directory</li>
<li><code class="code">`F</code>: the file exists and is regular</li>
<li><code class="code">`H</code>: the file exists and is a symlink (possibly to a non-existing
           target)</li>
<li><code class="code">`R</code>: the file exists and is readable</li>
<li><code class="code">`W</code>: the file exists and is writable</li>
<li><code class="code">`X</code>: the file exists and is executable</li>
<li><code class="code">`S</code>: the file exists and is non-empty</li>
</ul>
</div>
</div>


<pre><span id="TYPElocal_file"><span class="keyword">class type</span> <a href="Netfs.local_file-c.html">local_file</a></span> = <code class="code">object</code> <a href="Netfs.local_file-c.html">..</a> <code class="code">end</code></pre>
<pre><span id="TYPEstream_fs"><span class="keyword">class type</span> <a href="Netfs.stream_fs-c.html">stream_fs</a></span> = <code class="code">object</code> <a href="Netfs.stream_fs-c.html">..</a> <code class="code">end</code></pre>
<pre><span id="TYPEempty_fs"><span class="keyword">class</span> <a href="Netfs.empty_fs-c.html">empty_fs</a></span> : <code class="type">string -> </code><code class="type"><a href="Netfs.stream_fs-c.html">stream_fs</a></code></pre><div class="info">
<p>This is a class where all methods fail with <code class="code">ENOSYS</code>.</p>

</div>

<pre><span id="VALlocal_fs"><span class="keyword">val</span> local_fs</span> : <code class="type">?encoding:<a href="Netconversion.html#TYPEencoding">Netconversion.encoding</a> -><br>       ?root:string -> ?enable_relative_paths:bool -> unit -> <a href="Netfs.stream_fs-c.html">stream_fs</a></code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">local_fs()</code>: Returns a filesystem object for the local filesystem.</p>

<ul>
<li><code class="code">encoding</code>: Specifies the character encoding of paths. The default
        is system-dependent.</li>
<li><code class="code">root</code>: the root of the returned object is the directory <code class="code">root</code>
        of the local filesystem. If omitted, the root is the root of
        the local filesystem (i.e. / for Unix, and see comments for
        Windows below). Use <code class="code">root="."</code> to make the current working
        directory the root. Note that "." like other relative paths
        are interpreted at the time when the access method is executed.</li>
<li><code class="code">enable_relative_paths</code>: Normally, only absolute paths can be
        passed to the access methods like <code class="code">read</code>. By setting this option
        to <code class="code">true</code> one can also enable relative paths. These are taken
        relative to the working directory, and not relative to <code class="code">root</code>.
        Relative names are off by default because there is usually no
        counterpart in network filesystems.</li>
</ul>
</div>
</div>
<h3 id="2_OSNotes">OS Notes</h3><p><b>Unix</b> in general: There is no notion of character encoding of
    paths. Paths are just bytes. Because of this, the default encoding
    is <code class="code">None</code>. If a different encoding is passed to <code class="code">local_fs</code>, these
    bytes are just interpreted in this encoding. There is no conversion.</p>

<p>For desktop programs, though, usually the character encoding of the
    locale is taken for filenames. You can get this by passing</p>

<pre class="codepre"><code class="code">    let encoding = 
      Netconversion.user_encoding()
    </code></pre>
<p>as <code class="code">encoding</code> argument.</p>
<p><b>Windows</b>: If the <code class="code">root</code> argument is <b>not</b> passed to <code class="code">local_fs</code>
    it is possible to access the whole filesystem:</p>

<ul>
<li>Paths starting with drive letters like <code class="code">c:/</code> are also considered
      as absolute</li>
<li>Additionally, paths starting with slashes like <code class="code">/c:/</code> mean the same</li>
<li>UNC paths starting with two slashes like <code class="code">//hostname</code> are supported</li>
</ul>
<p>However, when a <code class="code">root</code> directory is passed, these additional
    notations are not possible anymore - paths must start with <code class="code">/</code>,
    and there is neither support for drive letters nor for UNC paths.</p>

<p>The <code class="code">encoding</code> arg defaults to current ANSI codepage, 
    and it is
    not supported to request a different encoding. (The difficulty is
    that the Win32 bindings of the relevant OS functions always assume
    the ANSI encoding.)</p>

<p>There is no support for backslashes as path separators (such paths
    will be rejected), for better compatibility with other platforms.</p>
<h3 id="links">Other impementations of <code class="code">stream_fs</code></h3><p>List:</p>

<ul>
<li><a href="Nethttp_fs.html"><code class="code">Nethttp_fs</code></a> allows one to access HTTP-based filesystems</li>
<li><a href="Netftp_fs.html"><code class="code">Netftp_fs</code></a> allows on to access filesystems via FTP</li>
<li><a href="Shell_fs.html"><code class="code">Shell_fs</code></a> allows one to access filesystems by executing shell
      commands. This works locally and via ssh.</li>
</ul>
<p>There are even some implementations outside Ocamlnet:</p>
<ul>
<li><a href="http://projects.camlcity.org/projects/webdav.html"> Webdav</a>
      provides an extension of
      <a href="Nethttp_fs.html"><code class="code">Nethttp_fs</code></a> for the full WebDAV set of filesystem operations</li>
</ul>
<h3 id="2_Algorithms">Algorithms</h3>
<pre><span id="VALcopy"><span class="keyword">val</span> copy</span> : <code class="type">?replace:bool -><br>       ?streaming:bool -><br>       #<a href="Netfs.stream_fs-c.html">stream_fs</a> -> string -> #<a href="Netfs.stream_fs-c.html">stream_fs</a> -> string -> unit</code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">copy orig_fs orig_name dest_fs dest_name</code>: Copies the file <code class="code">orig_name</code>
      from <code class="code">orig_fs</code> to the file <code class="code">dest_name</code> in <code class="code">dest_fs</code>. By default,
      the destination file is truncated and overwritten if it already
      exists.</p>

<p>If <code class="code">orig_fs</code> and <code class="code">dest_fs</code> are the same object, the <code class="code">copy</code> method
      is called to perform the operation. Otherwise, the data is read
      chunk by chunk from the file in <code class="code">orig_fs</code> and then written to
      the destination file in <code class="code">dest_fs</code>.</p>

<p>Symlinks are resolved, and the linked file is copied, not the
      link as such.</p>

<p>The copy does not preserve ownerships, file permissions, or
      timestamps. (The <code class="code">stream_fs</code> object does not represent these.)
      There is no protection against copying an object to itself.</p>

<ul>
<li><code class="code">replace</code>: If set, the destination file is removed and created again
        if it already exists</li>
<li><code class="code">streaming</code>: use streaming mode for reading and writing files</li>
</ul>
</div>
</div>

<pre><span id="VALcopy_into"><span class="keyword">val</span> copy_into</span> : <code class="type">?replace:bool -><br>       ?subst:(int -> string) -><br>       ?streaming:bool -><br>       #<a href="Netfs.stream_fs-c.html">stream_fs</a> -> string -> #<a href="Netfs.stream_fs-c.html">stream_fs</a> -> string -> unit</code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">copy_into orig_fs orig_name dest_fs dest_name</code>: 
      Like <code class="code">copy</code>, but this version also supports recursive copies. The
      <code class="code">dest_name</code> must be an existing directory, and the file or tree at
      <code class="code">orig_name</code> is copied into it.</p>

<p>Symlinks are copied as symlinks.</p>

<p>If <code class="code">replace</code> and the destination file/directory already exists,
      it is deleted before doing the copy.</p>

<ul>
<li><code class="code">subst</code>: See <a href="Netfs.html#VALconvert_path"><code class="code">Netfs.convert_path</code></a></li>
<li><code class="code">streaming</code>: use streaming mode for reading and writing files</li>
</ul>
</div>
</div>

<pre><span id="TYPEfile_kind"><span class="keyword">type</span> <code class="type"></code>file_kind</span> = <code class="type">[ `Directory | `None | `Other | `Regular | `Symlink ]</code> </pre>


<pre><span id="VALiter"><span class="keyword">val</span> iter</span> : <code class="type">pre:(string -> <a href="Netfs.html#TYPEfile_kind">file_kind</a> -> <a href="Netfs.html#TYPEfile_kind">file_kind</a> -> unit) -><br>       ?post:(string -> unit) -> #<a href="Netfs.stream_fs-c.html">stream_fs</a> -> string -> unit</code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">iter pre fs start</code>: Iterates over the file hierarchy at <code class="code">start</code>.
      The function <code class="code">pre</code> is called for every filename. The filenames
      passed to <code class="code">pre</code> are relative to <code class="code">start</code>. The <code class="code">start</code> must
      be a directory.</p>

<p>For directories, the <code class="code">pre</code> function is called for the directory
      before it is called for the members of the directories.
      The function <code class="code">post</code> can additionally be passed. It is only called
      for directories, but after the members.</p>

<p><code class="code">pre</code> is called as <code class="code">pre rk lk</code> where <code class="code">rk</code> is the file kind after
      following symlinks and <code class="code">lk</code> the file kind without following symlinks
      (the link itself).</p>

<p>Example: <code class="code">iter pre fs "/foo"</code> would call</p>
<ul>
<li><code class="code">pre "dir" `Directory `Directory</code> (meaning the directory "/foo/dir")</li>
<li><code class="code">pre "dir/file1" `File `File</code></li>
<li><code class="code">pre "dir/file2" `File `Symlink</code></li>
<li><code class="code">post "dir"</code></li>
</ul>
<p>Note: symlinks to non-existing files are reported as
      <code class="code">pre name `None `Symlink</code>.</p>
</div>
</div>

<pre><span id="VALconvert_path"><span class="keyword">val</span> convert_path</span> : <code class="type">?subst:(int -> string) -><br>       #<a href="Netfs.stream_fs-c.html">stream_fs</a> -> #<a href="Netfs.stream_fs-c.html">stream_fs</a> -> string -> string</code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">convert_path oldfs newfs oldpath</code>: The encoding of <code class="code">oldpath</code>
      (which is assumed to reside in <code class="code">oldfs</code>) is converted to the encoding
      of <code class="code">newfs</code> and returned.</p>

<p>It is possible that the conversion is not possible, and
      the function <code class="code">subst</code> is then called with the problematic code point as
      argument (in the encoding of <code class="code">oldfs</code>). The default <code class="code">subst</code> function
      just raises <a href="Netconversion.html#EXCEPTIONCannot_represent"><code class="code">Netconversion.Cannot_represent</code></a>.</p>

<p>If one of the filesystem objects does not specify an encoding,
      the file name is not converted, but simply returned as-is. This
      may result in errors when <code class="code">newfs</code> has an encoding while <code class="code">oldfs</code>
      does not have one because the file name might use byte representations
      that are illegal in <code class="code">newfs</code>.</p>
</div>
</div>
</body></html>