forked from mozilla/gecko-dev
-
Notifications
You must be signed in to change notification settings - Fork 2
/
prio.h
2037 lines (1855 loc) · 76.3 KB
/
prio.h
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
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the Netscape Portable Runtime (NSPR).
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998-2000
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/*
* File: prio.h
*
* Description: PR i/o related stuff, such as file system access, file
* i/o, socket i/o, etc.
*/
#ifndef prio_h___
#define prio_h___
#include "prlong.h"
#include "prtime.h"
#include "prinrval.h"
#include "prinet.h"
PR_BEGIN_EXTERN_C
/* Typedefs */
typedef struct PRDir PRDir;
typedef struct PRDirEntry PRDirEntry;
#ifdef MOZ_UNICODE
typedef struct PRDirUTF16 PRDirUTF16;
typedef struct PRDirEntryUTF16 PRDirEntryUTF16;
#endif /* MOZ_UNICODE */
typedef struct PRFileDesc PRFileDesc;
typedef struct PRFileInfo PRFileInfo;
typedef struct PRFileInfo64 PRFileInfo64;
typedef union PRNetAddr PRNetAddr;
typedef struct PRIOMethods PRIOMethods;
typedef struct PRPollDesc PRPollDesc;
typedef struct PRFilePrivate PRFilePrivate;
typedef struct PRSendFileData PRSendFileData;
/*
***************************************************************************
** The file descriptor.
** This is the primary structure to represent any active open socket,
** whether it be a normal file or a network connection. Such objects
** are stackable (or layerable). Each layer may have its own set of
** method pointers and context private to that layer. All each layer
** knows about its neighbors is how to get to their method table.
***************************************************************************
*/
typedef PRIntn PRDescIdentity; /* see: Layering file descriptors */
struct PRFileDesc {
const PRIOMethods *methods; /* the I/O methods table */
PRFilePrivate *secret; /* layer dependent data */
PRFileDesc *lower, *higher; /* pointers to adjacent layers */
void (PR_CALLBACK *dtor)(PRFileDesc *fd);
/* A destructor function for layer */
PRDescIdentity identity; /* Identity of this particular layer */
};
/*
***************************************************************************
** PRTransmitFileFlags
**
** Flags for PR_TransmitFile. Pass PR_TRANSMITFILE_CLOSE_SOCKET to
** PR_TransmitFile if the connection should be closed after the file
** is transmitted.
***************************************************************************
*/
typedef enum PRTransmitFileFlags {
PR_TRANSMITFILE_KEEP_OPEN = 0, /* socket is left open after file
* is transmitted. */
PR_TRANSMITFILE_CLOSE_SOCKET = 1 /* socket is closed after file
* is transmitted. */
} PRTransmitFileFlags;
/*
**************************************************************************
** Macros for PRNetAddr
**
** Address families: PR_AF_INET, PR_AF_INET6, PR_AF_LOCAL
** IP addresses: PR_INADDR_ANY, PR_INADDR_LOOPBACK, PR_INADDR_BROADCAST
**************************************************************************
*/
#ifdef WIN32
#define PR_AF_INET 2
#define PR_AF_LOCAL 1
#define PR_INADDR_ANY (unsigned long)0x00000000
#define PR_INADDR_LOOPBACK 0x7f000001
#define PR_INADDR_BROADCAST (unsigned long)0xffffffff
#else /* WIN32 */
#define PR_AF_INET AF_INET
#define PR_AF_LOCAL AF_UNIX
#define PR_INADDR_ANY INADDR_ANY
#define PR_INADDR_LOOPBACK INADDR_LOOPBACK
#define PR_INADDR_BROADCAST INADDR_BROADCAST
#endif /* WIN32 */
/*
** Define PR_AF_INET6 in prcpucfg.h with the same
** value as AF_INET6 on platforms with IPv6 support.
** Otherwise define it here.
*/
#ifndef PR_AF_INET6
#define PR_AF_INET6 100
#endif
#define PR_AF_INET_SDP 101
#define PR_AF_INET6_SDP 102
#ifndef PR_AF_UNSPEC
#define PR_AF_UNSPEC 0
#endif
/*
**************************************************************************
** A network address
**
** Only Internet Protocol (IPv4 and IPv6) addresses are supported.
** The address family must always represent IPv4 (AF_INET, probably == 2)
** or IPv6 (AF_INET6).
**************************************************************************
*************************************************************************/
struct PRIPv6Addr {
union {
PRUint8 _S6_u8[16];
PRUint16 _S6_u16[8];
PRUint32 _S6_u32[4];
PRUint64 _S6_u64[2];
} _S6_un;
};
#define pr_s6_addr _S6_un._S6_u8
#define pr_s6_addr16 _S6_un._S6_u16
#define pr_s6_addr32 _S6_un._S6_u32
#define pr_s6_addr64 _S6_un._S6_u64
typedef struct PRIPv6Addr PRIPv6Addr;
union PRNetAddr {
struct {
PRUint16 family; /* address family (0x00ff maskable) */
#ifdef XP_BEOS
char data[10]; /* Be has a smaller structure */
#else
char data[14]; /* raw address data */
#endif
} raw;
struct {
PRUint16 family; /* address family (AF_INET) */
PRUint16 port; /* port number */
PRUint32 ip; /* The actual 32 bits of address */
#ifdef XP_BEOS
char pad[4]; /* Be has a smaller structure */
#else
char pad[8];
#endif
} inet;
struct {
PRUint16 family; /* address family (AF_INET6) */
PRUint16 port; /* port number */
PRUint32 flowinfo; /* routing information */
PRIPv6Addr ip; /* the actual 128 bits of address */
PRUint32 scope_id; /* set of interfaces for a scope */
} ipv6;
#if defined(XP_UNIX) || defined(XP_OS2)
struct { /* Unix domain socket address */
PRUint16 family; /* address family (AF_UNIX) */
#ifdef XP_OS2
char path[108]; /* null-terminated pathname */
/* bind fails if size is not 108. */
#else
char path[104]; /* null-terminated pathname */
#endif
} local;
#endif
};
/*
***************************************************************************
** PRSockOption
**
** The file descriptors can have predefined options set after they file
** descriptor is created to change their behavior. Only the options in
** the following enumeration are supported.
***************************************************************************
*/
typedef enum PRSockOption
{
PR_SockOpt_Nonblocking, /* nonblocking io */
PR_SockOpt_Linger, /* linger on close if data present */
PR_SockOpt_Reuseaddr, /* allow local address reuse */
PR_SockOpt_Keepalive, /* keep connections alive */
PR_SockOpt_RecvBufferSize, /* send buffer size */
PR_SockOpt_SendBufferSize, /* receive buffer size */
PR_SockOpt_IpTimeToLive, /* time to live */
PR_SockOpt_IpTypeOfService, /* type of service and precedence */
PR_SockOpt_AddMember, /* add an IP group membership */
PR_SockOpt_DropMember, /* drop an IP group membership */
PR_SockOpt_McastInterface, /* multicast interface address */
PR_SockOpt_McastTimeToLive, /* multicast timetolive */
PR_SockOpt_McastLoopback, /* multicast loopback */
PR_SockOpt_NoDelay, /* don't delay send to coalesce packets */
PR_SockOpt_MaxSegment, /* maximum segment size */
PR_SockOpt_Broadcast, /* enable broadcast */
PR_SockOpt_Last
} PRSockOption;
typedef struct PRLinger {
PRBool polarity; /* Polarity of the option's setting */
PRIntervalTime linger; /* Time to linger before closing */
} PRLinger;
typedef struct PRMcastRequest {
PRNetAddr mcaddr; /* IP multicast address of group */
PRNetAddr ifaddr; /* local IP address of interface */
} PRMcastRequest;
typedef struct PRSocketOptionData
{
PRSockOption option;
union
{
PRUintn ip_ttl; /* IP time to live */
PRUintn mcast_ttl; /* IP multicast time to live */
PRUintn tos; /* IP type of service and precedence */
PRBool non_blocking; /* Non-blocking (network) I/O */
PRBool reuse_addr; /* Allow local address reuse */
PRBool keep_alive; /* Keep connections alive */
PRBool mcast_loopback; /* IP multicast loopback */
PRBool no_delay; /* Don't delay send to coalesce packets */
PRBool broadcast; /* Enable broadcast */
PRSize max_segment; /* Maximum segment size */
PRSize recv_buffer_size; /* Receive buffer size */
PRSize send_buffer_size; /* Send buffer size */
PRLinger linger; /* Time to linger on close if data present */
PRMcastRequest add_member; /* add an IP group membership */
PRMcastRequest drop_member; /* Drop an IP group membership */
PRNetAddr mcast_if; /* multicast interface address */
} value;
} PRSocketOptionData;
/*
***************************************************************************
** PRIOVec
**
** The I/O vector is used by the write vector method to describe the areas
** that are affected by the ouput operation.
***************************************************************************
*/
typedef struct PRIOVec {
char *iov_base;
int iov_len;
} PRIOVec;
/*
***************************************************************************
** Discover what type of socket is being described by the file descriptor.
***************************************************************************
*/
typedef enum PRDescType
{
PR_DESC_FILE = 1,
PR_DESC_SOCKET_TCP = 2,
PR_DESC_SOCKET_UDP = 3,
PR_DESC_LAYERED = 4,
PR_DESC_PIPE = 5
} PRDescType;
typedef enum PRSeekWhence {
PR_SEEK_SET = 0,
PR_SEEK_CUR = 1,
PR_SEEK_END = 2
} PRSeekWhence;
NSPR_API(PRDescType) PR_GetDescType(PRFileDesc *file);
/*
***************************************************************************
** PRIOMethods
**
** The I/O methods table provides procedural access to the functions of
** the file descriptor. It is the responsibility of a layer implementor
** to provide suitable functions at every entry point. If a layer provides
** no functionality, it should call the next lower(higher) function of the
** same name (e.g., return fd->lower->method->close(fd->lower));
**
** Not all functions are implemented for all types of files. In cases where
** that is true, the function will return a error indication with an error
** code of PR_INVALID_METHOD_ERROR.
***************************************************************************
*/
typedef PRStatus (PR_CALLBACK *PRCloseFN)(PRFileDesc *fd);
typedef PRInt32 (PR_CALLBACK *PRReadFN)(PRFileDesc *fd, void *buf, PRInt32 amount);
typedef PRInt32 (PR_CALLBACK *PRWriteFN)(PRFileDesc *fd, const void *buf, PRInt32 amount);
typedef PRInt32 (PR_CALLBACK *PRAvailableFN)(PRFileDesc *fd);
typedef PRInt64 (PR_CALLBACK *PRAvailable64FN)(PRFileDesc *fd);
typedef PRStatus (PR_CALLBACK *PRFsyncFN)(PRFileDesc *fd);
typedef PROffset32 (PR_CALLBACK *PRSeekFN)(PRFileDesc *fd, PROffset32 offset, PRSeekWhence how);
typedef PROffset64 (PR_CALLBACK *PRSeek64FN)(PRFileDesc *fd, PROffset64 offset, PRSeekWhence how);
typedef PRStatus (PR_CALLBACK *PRFileInfoFN)(PRFileDesc *fd, PRFileInfo *info);
typedef PRStatus (PR_CALLBACK *PRFileInfo64FN)(PRFileDesc *fd, PRFileInfo64 *info);
typedef PRInt32 (PR_CALLBACK *PRWritevFN)(
PRFileDesc *fd, const PRIOVec *iov, PRInt32 iov_size,
PRIntervalTime timeout);
typedef PRStatus (PR_CALLBACK *PRConnectFN)(
PRFileDesc *fd, const PRNetAddr *addr, PRIntervalTime timeout);
typedef PRFileDesc* (PR_CALLBACK *PRAcceptFN) (
PRFileDesc *fd, PRNetAddr *addr, PRIntervalTime timeout);
typedef PRStatus (PR_CALLBACK *PRBindFN)(PRFileDesc *fd, const PRNetAddr *addr);
typedef PRStatus (PR_CALLBACK *PRListenFN)(PRFileDesc *fd, PRIntn backlog);
typedef PRStatus (PR_CALLBACK *PRShutdownFN)(PRFileDesc *fd, PRIntn how);
typedef PRInt32 (PR_CALLBACK *PRRecvFN)(
PRFileDesc *fd, void *buf, PRInt32 amount,
PRIntn flags, PRIntervalTime timeout);
typedef PRInt32 (PR_CALLBACK *PRSendFN) (
PRFileDesc *fd, const void *buf, PRInt32 amount,
PRIntn flags, PRIntervalTime timeout);
typedef PRInt32 (PR_CALLBACK *PRRecvfromFN)(
PRFileDesc *fd, void *buf, PRInt32 amount,
PRIntn flags, PRNetAddr *addr, PRIntervalTime timeout);
typedef PRInt32 (PR_CALLBACK *PRSendtoFN)(
PRFileDesc *fd, const void *buf, PRInt32 amount,
PRIntn flags, const PRNetAddr *addr, PRIntervalTime timeout);
typedef PRInt16 (PR_CALLBACK *PRPollFN)(
PRFileDesc *fd, PRInt16 in_flags, PRInt16 *out_flags);
typedef PRInt32 (PR_CALLBACK *PRAcceptreadFN)(
PRFileDesc *sd, PRFileDesc **nd, PRNetAddr **raddr,
void *buf, PRInt32 amount, PRIntervalTime t);
typedef PRInt32 (PR_CALLBACK *PRTransmitfileFN)(
PRFileDesc *sd, PRFileDesc *fd, const void *headers,
PRInt32 hlen, PRTransmitFileFlags flags, PRIntervalTime t);
typedef PRStatus (PR_CALLBACK *PRGetsocknameFN)(PRFileDesc *fd, PRNetAddr *addr);
typedef PRStatus (PR_CALLBACK *PRGetpeernameFN)(PRFileDesc *fd, PRNetAddr *addr);
typedef PRStatus (PR_CALLBACK *PRGetsocketoptionFN)(
PRFileDesc *fd, PRSocketOptionData *data);
typedef PRStatus (PR_CALLBACK *PRSetsocketoptionFN)(
PRFileDesc *fd, const PRSocketOptionData *data);
typedef PRInt32 (PR_CALLBACK *PRSendfileFN)(
PRFileDesc *networkSocket, PRSendFileData *sendData,
PRTransmitFileFlags flags, PRIntervalTime timeout);
typedef PRStatus (PR_CALLBACK *PRConnectcontinueFN)(
PRFileDesc *fd, PRInt16 out_flags);
typedef PRIntn (PR_CALLBACK *PRReservedFN)(PRFileDesc *fd);
struct PRIOMethods {
PRDescType file_type; /* Type of file represented (tos) */
PRCloseFN close; /* close file and destroy descriptor */
PRReadFN read; /* read up to specified bytes into buffer */
PRWriteFN write; /* write specified bytes from buffer */
PRAvailableFN available; /* determine number of bytes available */
PRAvailable64FN available64; /* ditto, 64 bit */
PRFsyncFN fsync; /* flush all buffers to permanent store */
PRSeekFN seek; /* position the file to the desired place */
PRSeek64FN seek64; /* ditto, 64 bit */
PRFileInfoFN fileInfo; /* Get information about an open file */
PRFileInfo64FN fileInfo64; /* ditto, 64 bit */
PRWritevFN writev; /* Write segments as described by iovector */
PRConnectFN connect; /* Connect to the specified (net) address */
PRAcceptFN accept; /* Accept a connection for a (net) peer */
PRBindFN bind; /* Associate a (net) address with the fd */
PRListenFN listen; /* Prepare to listen for (net) connections */
PRShutdownFN shutdown; /* Shutdown a (net) connection */
PRRecvFN recv; /* Solicit up the the specified bytes */
PRSendFN send; /* Send all the bytes specified */
PRRecvfromFN recvfrom; /* Solicit (net) bytes and report source */
PRSendtoFN sendto; /* Send bytes to (net) address specified */
PRPollFN poll; /* Test the fd to see if it is ready */
PRAcceptreadFN acceptread; /* Accept and read on a new (net) fd */
PRTransmitfileFN transmitfile; /* Transmit at entire file */
PRGetsocknameFN getsockname; /* Get (net) address associated with fd */
PRGetpeernameFN getpeername; /* Get peer's (net) address */
PRReservedFN reserved_fn_6; /* reserved for future use */
PRReservedFN reserved_fn_5; /* reserved for future use */
PRGetsocketoptionFN getsocketoption;
/* Get current setting of specified option */
PRSetsocketoptionFN setsocketoption;
/* Set value of specified option */
PRSendfileFN sendfile; /* Send a (partial) file with header/trailer*/
PRConnectcontinueFN connectcontinue;
/* Continue a nonblocking connect */
PRReservedFN reserved_fn_3; /* reserved for future use */
PRReservedFN reserved_fn_2; /* reserved for future use */
PRReservedFN reserved_fn_1; /* reserved for future use */
PRReservedFN reserved_fn_0; /* reserved for future use */
};
/*
**************************************************************************
* FUNCTION: PR_GetSpecialFD
* DESCRIPTION: Get the file descriptor that represents the standard input,
* output, or error stream.
* INPUTS:
* PRSpecialFD id
* A value indicating the type of stream desired:
* PR_StandardInput: standard input
* PR_StandardOuput: standard output
* PR_StandardError: standard error
* OUTPUTS: none
* RETURNS: PRFileDesc *
* If the argument is valid, PR_GetSpecialFD returns a file descriptor
* that represents the corresponding standard I/O stream. Otherwise,
* PR_GetSpecialFD returns NULL and sets error PR_INVALID_ARGUMENT_ERROR.
**************************************************************************
*/
typedef enum PRSpecialFD
{
PR_StandardInput, /* standard input */
PR_StandardOutput, /* standard output */
PR_StandardError /* standard error */
} PRSpecialFD;
NSPR_API(PRFileDesc*) PR_GetSpecialFD(PRSpecialFD id);
#define PR_STDIN PR_GetSpecialFD(PR_StandardInput)
#define PR_STDOUT PR_GetSpecialFD(PR_StandardOutput)
#define PR_STDERR PR_GetSpecialFD(PR_StandardError)
/*
**************************************************************************
* Layering file descriptors
*
* File descriptors may be layered. Each layer has it's own identity.
* Identities are allocated by the runtime and are to be associated
* (by the layer implementor) with all layers that are of that type.
* It is then possible to scan the chain of layers and find a layer
* that one recongizes and therefore predict that it will implement
* a desired protocol.
*
* There are three well-known identities:
* PR_INVALID_IO_LAYER => an invalid layer identity, for error return
* PR_TOP_IO_LAYER => the identity of the top of the stack
* PR_NSPR_IO_LAYER => the identity used by NSPR proper
* PR_TOP_IO_LAYER may be used as a shorthand for identifying the topmost
* layer of an existing stack. Ie., the following two constructs are
* equivalent.
*
* rv = PR_PushIOLayer(stack, PR_TOP_IO_LAYER, my_layer);
* rv = PR_PushIOLayer(stack, PR_GetLayersIdentity(stack), my_layer)
*
* A string may be associated with the creation of the identity. It
* will be copied by the runtime. If queried the runtime will return
* a reference to that copied string (not yet another copy). There
* is no facility for deleting an identity.
**************************************************************************
*/
#define PR_IO_LAYER_HEAD (PRDescIdentity)-3
#define PR_INVALID_IO_LAYER (PRDescIdentity)-1
#define PR_TOP_IO_LAYER (PRDescIdentity)-2
#define PR_NSPR_IO_LAYER (PRDescIdentity)0
NSPR_API(PRDescIdentity) PR_GetUniqueIdentity(const char *layer_name);
NSPR_API(const char*) PR_GetNameForIdentity(PRDescIdentity ident);
NSPR_API(PRDescIdentity) PR_GetLayersIdentity(PRFileDesc* fd);
NSPR_API(PRFileDesc*) PR_GetIdentitiesLayer(PRFileDesc* fd_stack, PRDescIdentity id);
/*
**************************************************************************
* PR_GetDefaultIOMethods: Accessing the default methods table.
* You may get a pointer to the default methods table by calling this function.
* You may then select any elements from that table with which to build your
* layer's methods table. You may NOT modify the table directly.
**************************************************************************
*/
NSPR_API(const PRIOMethods *) PR_GetDefaultIOMethods(void);
/*
**************************************************************************
* Creating a layer
*
* A new layer may be allocated by calling PR_CreateIOLayerStub(). The
* file descriptor returned will contain the pointer to the methods table
* provided. The runtime will not modify the table nor test its correctness.
**************************************************************************
*/
NSPR_API(PRFileDesc*) PR_CreateIOLayerStub(
PRDescIdentity ident, const PRIOMethods *methods);
/*
**************************************************************************
* Creating a layer
*
* A new stack may be created by calling PR_CreateIOLayer(). The
* file descriptor returned will point to the top of the stack, which has
* the layer 'fd' as the topmost layer.
*
* NOTE: This function creates a new style stack, which has a fixed, dummy
* header. The old style stack, created by a call to PR_PushIOLayer,
* results in modifying contents of the top layer of the stack, when
* pushing and popping layers of the stack.
**************************************************************************
*/
NSPR_API(PRFileDesc*) PR_CreateIOLayer(PRFileDesc* fd);
/*
**************************************************************************
* Pushing a layer
*
* A file descriptor (perhaps allocated using PR_CreateIOLayerStub()) may
* be pushed into an existing stack of file descriptors at any point the
* caller deems appropriate. The new layer will be inserted into the stack
* just above the layer with the indicated identity.
*
* Note: Even if the identity parameter indicates the top-most layer of
* the stack, the value of the file descriptor describing the original
* stack will not change.
**************************************************************************
*/
NSPR_API(PRStatus) PR_PushIOLayer(
PRFileDesc *fd_stack, PRDescIdentity id, PRFileDesc *layer);
/*
**************************************************************************
* Popping a layer
*
* A layer may be popped from a stack by indicating the identity of the
* layer to be removed. If found, a pointer to the removed object will
* be returned to the caller. The object then becomes the responsibility
* of the caller.
*
* Note: Even if the identity indicates the top layer of the stack, the
* reference returned will not be the file descriptor for the stack and
* that file descriptor will remain valid.
**************************************************************************
*/
NSPR_API(PRFileDesc*) PR_PopIOLayer(PRFileDesc *fd_stack, PRDescIdentity id);
/*
**************************************************************************
* FUNCTION: PR_Open
* DESCRIPTION: Open a file for reading, writing, or both.
* INPUTS:
* const char *name
* The path name of the file to be opened
* PRIntn flags
* The file status flags.
* It is a bitwise OR of the following bit flags (only one of
* the first three flags below may be used):
* PR_RDONLY Open for reading only.
* PR_WRONLY Open for writing only.
* PR_RDWR Open for reading and writing.
* PR_CREATE_FILE If the file does not exist, the file is created
* If the file exists, this flag has no effect.
* PR_SYNC If set, each write will wait for both the file data
* and file status to be physically updated.
* PR_APPEND The file pointer is set to the end of
* the file prior to each write.
* PR_TRUNCATE If the file exists, its length is truncated to 0.
* PR_EXCL With PR_CREATE_FILE, if the file does not exist,
* the file is created. If the file already
* exists, no action and NULL is returned
*
* PRIntn mode
* The access permission bits of the file mode, if the file is
* created when PR_CREATE_FILE is on.
* OUTPUTS: None
* RETURNS: PRFileDesc *
* If the file is successfully opened,
* returns a pointer to the PRFileDesc
* created for the newly opened file.
* Returns a NULL pointer if the open
* failed.
* SIDE EFFECTS:
* RESTRICTIONS:
* MEMORY:
* The return value, if not NULL, points to a dynamically allocated
* PRFileDesc object.
* ALGORITHM:
**************************************************************************
*/
/* Open flags */
#define PR_RDONLY 0x01
#define PR_WRONLY 0x02
#define PR_RDWR 0x04
#define PR_CREATE_FILE 0x08
#define PR_APPEND 0x10
#define PR_TRUNCATE 0x20
#define PR_SYNC 0x40
#define PR_EXCL 0x80
/*
** File modes ....
**
** CAVEAT: 'mode' is currently only applicable on UNIX platforms.
** The 'mode' argument may be ignored by PR_Open on other platforms.
**
** 00400 Read by owner.
** 00200 Write by owner.
** 00100 Execute (search if a directory) by owner.
** 00040 Read by group.
** 00020 Write by group.
** 00010 Execute by group.
** 00004 Read by others.
** 00002 Write by others
** 00001 Execute by others.
**
*/
NSPR_API(PRFileDesc*) PR_Open(const char *name, PRIntn flags, PRIntn mode);
/*
**************************************************************************
* FUNCTION: PR_OpenFile
* DESCRIPTION:
* Open a file for reading, writing, or both.
* PR_OpenFile has the same prototype as PR_Open but implements
* the specified file mode where possible.
**************************************************************************
*/
/* File mode bits */
#define PR_IRWXU 00700 /* read, write, execute/search by owner */
#define PR_IRUSR 00400 /* read permission, owner */
#define PR_IWUSR 00200 /* write permission, owner */
#define PR_IXUSR 00100 /* execute/search permission, owner */
#define PR_IRWXG 00070 /* read, write, execute/search by group */
#define PR_IRGRP 00040 /* read permission, group */
#define PR_IWGRP 00020 /* write permission, group */
#define PR_IXGRP 00010 /* execute/search permission, group */
#define PR_IRWXO 00007 /* read, write, execute/search by others */
#define PR_IROTH 00004 /* read permission, others */
#define PR_IWOTH 00002 /* write permission, others */
#define PR_IXOTH 00001 /* execute/search permission, others */
NSPR_API(PRFileDesc*) PR_OpenFile(
const char *name, PRIntn flags, PRIntn mode);
#ifdef MOZ_UNICODE
/*
* EXPERIMENTAL: This function may be removed in a future release.
*/
NSPR_API(PRFileDesc*) PR_OpenFileUTF16(
const PRUnichar *name, PRIntn flags, PRIntn mode);
#endif /* MOZ_UNICODE */
/*
**************************************************************************
* FUNCTION: PR_Close
* DESCRIPTION:
* Close a file or socket.
* INPUTS:
* PRFileDesc *fd
* a pointer to a PRFileDesc.
* OUTPUTS:
* None.
* RETURN:
* PRStatus
* SIDE EFFECTS:
* RESTRICTIONS:
* None.
* MEMORY:
* The dynamic memory pointed to by the argument fd is freed.
**************************************************************************
*/
NSPR_API(PRStatus) PR_Close(PRFileDesc *fd);
/*
**************************************************************************
* FUNCTION: PR_Read
* DESCRIPTION:
* Read bytes from a file or socket.
* The operation will block until either an end of stream indication is
* encountered, some positive number of bytes are transferred, or there
* is an error. No more than 'amount' bytes will be transferred.
* INPUTS:
* PRFileDesc *fd
* pointer to the PRFileDesc object for the file or socket
* void *buf
* pointer to a buffer to hold the data read in.
* PRInt32 amount
* the size of 'buf' (in bytes)
* OUTPUTS:
* RETURN:
* PRInt32
* a positive number indicates the number of bytes actually read in.
* 0 means end of file is reached or the network connection is closed.
* -1 indicates a failure. The reason for the failure is obtained
* by calling PR_GetError().
* SIDE EFFECTS:
* data is written into the buffer pointed to by 'buf'.
* RESTRICTIONS:
* None.
* MEMORY:
* N/A
* ALGORITHM:
* N/A
**************************************************************************
*/
NSPR_API(PRInt32) PR_Read(PRFileDesc *fd, void *buf, PRInt32 amount);
/*
***************************************************************************
* FUNCTION: PR_Write
* DESCRIPTION:
* Write a specified number of bytes to a file or socket. The thread
* invoking this function blocks until all the data is written.
* INPUTS:
* PRFileDesc *fd
* pointer to a PRFileDesc object that refers to a file or socket
* const void *buf
* pointer to the buffer holding the data
* PRInt32 amount
* amount of data in bytes to be written from the buffer
* OUTPUTS:
* None.
* RETURN: PRInt32
* A positive number indicates the number of bytes successfully written.
* A -1 is an indication that the operation failed. The reason
* for the failure is obtained by calling PR_GetError().
***************************************************************************
*/
NSPR_API(PRInt32) PR_Write(PRFileDesc *fd,const void *buf,PRInt32 amount);
/*
***************************************************************************
* FUNCTION: PR_Writev
* DESCRIPTION:
* Write data to a socket. The data is organized in a PRIOVec array. The
* operation will block until all the data is written or the operation
* fails.
* INPUTS:
* PRFileDesc *fd
* Pointer that points to a PRFileDesc object for a socket.
* const PRIOVec *iov
* An array of PRIOVec. PRIOVec is a struct with the following
* two fields:
* char *iov_base;
* int iov_len;
* PRInt32 iov_size
* Number of elements in the iov array. The value of this
* argument must not be greater than PR_MAX_IOVECTOR_SIZE.
* If it is, the method will fail (PR_BUFFER_OVERFLOW_ERROR).
* PRIntervalTime timeout
* Time limit for completion of the entire write operation.
* OUTPUTS:
* None
* RETURN:
* A positive number indicates the number of bytes successfully written.
* A -1 is an indication that the operation failed. The reason
* for the failure is obtained by calling PR_GetError().
***************************************************************************
*/
#define PR_MAX_IOVECTOR_SIZE 16 /* 'iov_size' must be <= */
NSPR_API(PRInt32) PR_Writev(
PRFileDesc *fd, const PRIOVec *iov, PRInt32 iov_size,
PRIntervalTime timeout);
/*
***************************************************************************
* FUNCTION: PR_Delete
* DESCRIPTION:
* Delete a file from the filesystem. The operation may fail if the
* file is open.
* INPUTS:
* const char *name
* Path name of the file to be deleted.
* OUTPUTS:
* None.
* RETURN: PRStatus
* The function returns PR_SUCCESS if the file is successfully
* deleted, otherwise it returns PR_FAILURE.
***************************************************************************
*/
NSPR_API(PRStatus) PR_Delete(const char *name);
/**************************************************************************/
typedef enum PRFileType
{
PR_FILE_FILE = 1,
PR_FILE_DIRECTORY = 2,
PR_FILE_OTHER = 3
} PRFileType;
struct PRFileInfo {
PRFileType type; /* Type of file */
PROffset32 size; /* Size, in bytes, of file's contents */
PRTime creationTime; /* Creation time per definition of PRTime */
PRTime modifyTime; /* Last modification time per definition of PRTime */
};
struct PRFileInfo64 {
PRFileType type; /* Type of file */
PROffset64 size; /* Size, in bytes, of file's contents */
PRTime creationTime; /* Creation time per definition of PRTime */
PRTime modifyTime; /* Last modification time per definition of PRTime */
};
/****************************************************************************
* FUNCTION: PR_GetFileInfo, PR_GetFileInfo64
* DESCRIPTION:
* Get the information about the file with the given path name. This is
* applicable only to NSFileDesc describing 'file' types (see
* INPUTS:
* const char *fn
* path name of the file
* OUTPUTS:
* PRFileInfo *info
* Information about the given file is written into the file
* information object pointer to by 'info'.
* RETURN: PRStatus
* PR_GetFileInfo returns PR_SUCCESS if file information is successfully
* obtained, otherwise it returns PR_FAILURE.
***************************************************************************
*/
NSPR_API(PRStatus) PR_GetFileInfo(const char *fn, PRFileInfo *info);
NSPR_API(PRStatus) PR_GetFileInfo64(const char *fn, PRFileInfo64 *info);
#ifdef MOZ_UNICODE
/*
* EXPERIMENTAL: This function may be removed in a future release.
*/
NSPR_API(PRStatus) PR_GetFileInfo64UTF16(const PRUnichar *fn, PRFileInfo64 *info);
#endif /* MOZ_UNICODE */
/*
**************************************************************************
* FUNCTION: PR_GetOpenFileInfo, PR_GetOpenFileInfo64
* DESCRIPTION:
* Get information about an open file referred to by the
* given PRFileDesc object.
* INPUTS:
* const PRFileDesc *fd
* A reference to a valid, open file.
* OUTPUTS:
* Same as PR_GetFileInfo, PR_GetFileInfo64
* RETURN: PRStatus
* PR_GetFileInfo returns PR_SUCCESS if file information is successfully
* obtained, otherwise it returns PR_FAILURE.
***************************************************************************
*/
NSPR_API(PRStatus) PR_GetOpenFileInfo(PRFileDesc *fd, PRFileInfo *info);
NSPR_API(PRStatus) PR_GetOpenFileInfo64(PRFileDesc *fd, PRFileInfo64 *info);
/*
**************************************************************************
* FUNCTION: PR_Rename
* DESCRIPTION:
* Rename a file from the old name 'from' to the new name 'to'.
* INPUTS:
* const char *from
* The old name of the file to be renamed.
* const char *to
* The new name of the file.
* OUTPUTS:
* None.
* RETURN: PRStatus
**************************************************************************
*/
NSPR_API(PRStatus) PR_Rename(const char *from, const char *to);
/*
*************************************************************************
* FUNCTION: PR_Access
* DESCRIPTION:
* Determine accessibility of a file.
* INPUTS:
* const char *name
* path name of the file
* PRAccessHow how
* specifies which access permission to check for.
* It can be one of the following values:
* PR_ACCESS_READ_OK Test for read permission
* PR_ACCESS_WRITE_OK Test for write permission
* PR_ACCESS_EXISTS Check existence of file
* OUTPUTS:
* None.
* RETURN: PRStatus
* PR_SUCCESS is returned if the requested access is permitted.
* Otherwise, PR_FAILURE is returned. Additional information
* regarding the reason for the failure may be retrieved from
* PR_GetError().
*************************************************************************
*/
typedef enum PRAccessHow {
PR_ACCESS_EXISTS = 1,
PR_ACCESS_WRITE_OK = 2,
PR_ACCESS_READ_OK = 3
} PRAccessHow;
NSPR_API(PRStatus) PR_Access(const char *name, PRAccessHow how);
/*
*************************************************************************
* FUNCTION: PR_Seek, PR_Seek64
* DESCRIPTION:
* Moves read-write file offset
* INPUTS:
* PRFileDesc *fd
* Pointer to a PRFileDesc object.
* PROffset32, PROffset64 offset
* Specifies a value, in bytes, that is used in conjunction
* with the 'whence' parameter to set the file pointer. A
* negative value causes seeking in the reverse direction.
* PRSeekWhence whence
* Specifies how to interpret the 'offset' parameter in setting
* the file pointer associated with the 'fd' parameter.
* Values for the 'whence' parameter are:
* PR_SEEK_SET Sets the file pointer to the value of the
* 'offset' parameter
* PR_SEEK_CUR Sets the file pointer to its current location
* plus the value of the offset parameter.
* PR_SEEK_END Sets the file pointer to the size of the
* file plus the value of the offset parameter.
* OUTPUTS:
* None.
* RETURN: PROffset32, PROffset64
* Upon successful completion, the resulting pointer location,
* measured in bytes from the beginning of the file, is returned.
* If the PR_Seek() function fails, the file offset remains
* unchanged, and the returned value is -1. The error code can
* then be retrieved via PR_GetError().
*************************************************************************
*/
NSPR_API(PROffset32) PR_Seek(PRFileDesc *fd, PROffset32 offset, PRSeekWhence whence);
NSPR_API(PROffset64) PR_Seek64(PRFileDesc *fd, PROffset64 offset, PRSeekWhence whence);
/*
************************************************************************
* FUNCTION: PR_Available
* DESCRIPTION:
* Determine the amount of data in bytes available for reading
* in the given file or socket.
* INPUTS:
* PRFileDesc *fd
* Pointer to a PRFileDesc object that refers to a file or
* socket.
* OUTPUTS:
* None
* RETURN: PRInt32, PRInt64
* Upon successful completion, PR_Available returns the number of
* bytes beyond the current read pointer that is available for
* reading. Otherwise, it returns a -1 and the reason for the
* failure can be retrieved via PR_GetError().
************************************************************************
*/
NSPR_API(PRInt32) PR_Available(PRFileDesc *fd);
NSPR_API(PRInt64) PR_Available64(PRFileDesc *fd);
/*
************************************************************************
* FUNCTION: PR_Sync
* DESCRIPTION:
* Sync any buffered data for a fd to its backing device (disk).