|
|
1.1 root 1: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2: /*
3: * The contents of this file are subject to the Mozilla Public
4: * License Version 1.1 (the "License"); you may not use this file
5: * except in compliance with the License. You may obtain a copy of
6: * the License at http://www.mozilla.org/MPL/
7: *
8: * Software distributed under the License is distributed on an "AS
9: * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
10: * implied. See the License for the specific language governing
11: * rights and limitations under the License.
12: *
13: * The Original Code is the Netscape Portable Runtime (NSPR).
14: *
15: * The Initial Developer of the Original Code is Netscape
16: * Communications Corporation. Portions created by Netscape are
17: * Copyright (C) 1998-2000 Netscape Communications Corporation. All
18: * Rights Reserved.
19: *
20: * Contributor(s):
21: *
22: * Alternatively, the contents of this file may be used under the
23: * terms of the GNU General Public License Version 2 or later (the
24: * "GPL"), in which case the provisions of the GPL are applicable
25: * instead of those above. If you wish to allow use of your
26: * version of this file only under the terms of the GPL and not to
27: * allow others to use your version of this file under the MPL,
28: * indicate your decision by deleting the provisions above and
29: * replace them with the notice and other provisions required by
30: * the GPL. If you do not delete the provisions above, a recipient
31: * may use your version of this file under either the MPL or the
32: * GPL.
33: */
34:
35: /*
36: * File: prio.h
37: *
38: * Description: PR i/o related stuff, such as file system access, file
39: * i/o, socket i/o, etc.
40: */
41:
42: #ifndef prio_h___
43: #define prio_h___
44:
45: #include "prlong.h"
46: #include "prtime.h"
47: #include "prinrval.h"
48: #include "prinet.h"
49:
50: PR_BEGIN_EXTERN_C
51:
52: /* Typedefs */
53: typedef struct PRDir PRDir;
54: typedef struct PRDirEntry PRDirEntry;
55: #ifdef MOZ_UNICODE
56: typedef struct PRDirUTF16 PRDirUTF16;
57: typedef struct PRDirEntryUTF16 PRDirEntryUTF16;
58: #endif /* MOZ_UNICODE */
59: typedef struct PRFileDesc PRFileDesc;
60: typedef struct PRFileInfo PRFileInfo;
61: typedef struct PRFileInfo64 PRFileInfo64;
62: typedef union PRNetAddr PRNetAddr;
63: typedef struct PRIOMethods PRIOMethods;
64: typedef struct PRPollDesc PRPollDesc;
65: typedef struct PRFilePrivate PRFilePrivate;
66: typedef struct PRSendFileData PRSendFileData;
67:
68: /*
69: ***************************************************************************
70: ** The file descriptor.
71: ** This is the primary structure to represent any active open socket,
72: ** whether it be a normal file or a network connection. Such objects
73: ** are stackable (or layerable). Each layer may have its own set of
74: ** method pointers and context private to that layer. All each layer
75: ** knows about its neighbors is how to get to their method table.
76: ***************************************************************************
77: */
78:
79: typedef PRIntn PRDescIdentity; /* see: Layering file descriptors */
80:
81: struct PRFileDesc {
82: const PRIOMethods *methods; /* the I/O methods table */
83: PRFilePrivate *secret; /* layer dependent data */
84: PRFileDesc *lower, *higher; /* pointers to adjacent layers */
85: void (PR_CALLBACK *dtor)(PRFileDesc *fd);
86: /* A destructor function for layer */
87: PRDescIdentity identity; /* Identity of this particular layer */
88: };
89:
90: /*
91: ***************************************************************************
92: ** PRTransmitFileFlags
93: **
94: ** Flags for PR_TransmitFile. Pass PR_TRANSMITFILE_CLOSE_SOCKET to
95: ** PR_TransmitFile if the connection should be closed after the file
96: ** is transmitted.
97: ***************************************************************************
98: */
99: typedef enum PRTransmitFileFlags {
100: PR_TRANSMITFILE_KEEP_OPEN = 0, /* socket is left open after file
101: * is transmitted. */
102: PR_TRANSMITFILE_CLOSE_SOCKET = 1 /* socket is closed after file
103: * is transmitted. */
104: } PRTransmitFileFlags;
105:
106: /*
107: **************************************************************************
108: ** Macros for PRNetAddr
109: **
110: ** Address families: PR_AF_INET, PR_AF_INET6, PR_AF_LOCAL
111: ** IP addresses: PR_INADDR_ANY, PR_INADDR_LOOPBACK, PR_INADDR_BROADCAST
112: **************************************************************************
113: */
114:
115: #ifdef WIN32
116:
117: #define PR_AF_INET 2
118: #define PR_AF_LOCAL 1
119: #define PR_INADDR_ANY (unsigned long)0x00000000
120: #define PR_INADDR_LOOPBACK 0x7f000001
121: #define PR_INADDR_BROADCAST (unsigned long)0xffffffff
122:
123: #else /* WIN32 */
124:
125: #define PR_AF_INET AF_INET
126: #define PR_AF_LOCAL AF_UNIX
127: #define PR_INADDR_ANY INADDR_ANY
128: #define PR_INADDR_LOOPBACK INADDR_LOOPBACK
129: #define PR_INADDR_BROADCAST INADDR_BROADCAST
130:
131: #endif /* WIN32 */
132:
133: /*
134: ** Define PR_AF_INET6 in prcpucfg.h with the same
135: ** value as AF_INET6 on platforms with IPv6 support.
136: ** Otherwise define it here.
137: */
138: #ifndef PR_AF_INET6
139: #define PR_AF_INET6 100
140: #endif
141:
142: /*
143: **************************************************************************
144: ** A network address
145: **
146: ** Only Internet Protocol (IPv4 and IPv6) addresses are supported.
147: ** The address family must always represent IPv4 (AF_INET, probably == 2)
148: ** or IPv6 (AF_INET6).
149: **************************************************************************
150: *************************************************************************/
151:
152: struct PRIPv6Addr {
153: union {
154: PRUint8 _S6_u8[16];
155: PRUint16 _S6_u16[8];
156: PRUint32 _S6_u32[4];
157: PRUint64 _S6_u64[2];
158: } _S6_un;
159: };
160: #define pr_s6_addr _S6_un._S6_u8
161: #define pr_s6_addr16 _S6_un._S6_u16
162: #define pr_s6_addr32 _S6_un._S6_u32
163: #define pr_s6_addr64 _S6_un._S6_u64
164:
165: typedef struct PRIPv6Addr PRIPv6Addr;
166:
167: union PRNetAddr {
168: struct {
169: PRUint16 family; /* address family (0x00ff maskable) */
170: #ifdef XP_BEOS
171: char data[10]; /* Be has a smaller structure */
172: #else
173: char data[14]; /* raw address data */
174: #endif
175: } raw;
176: struct {
177: PRUint16 family; /* address family (AF_INET) */
178: PRUint16 port; /* port number */
179: PRUint32 ip; /* The actual 32 bits of address */
180: #ifdef XP_BEOS
181: char pad[4]; /* Be has a smaller structure */
182: #else
183: char pad[8];
184: #endif
185: } inet;
186: struct {
187: PRUint16 family; /* address family (AF_INET6) */
188: PRUint16 port; /* port number */
189: PRUint32 flowinfo; /* routing information */
190: PRIPv6Addr ip; /* the actual 128 bits of address */
191: PRUint32 scope_id; /* set of interfaces for a scope */
192: } ipv6;
193: #if defined(XP_UNIX)
194: struct { /* Unix domain socket address */
195: PRUint16 family; /* address family (AF_UNIX) */
196: char path[104]; /* null-terminated pathname */
197: } local;
198: #endif
199: };
200:
201: /*
202: ***************************************************************************
203: ** PRSockOption
204: **
205: ** The file descriptors can have predefined options set after they file
206: ** descriptor is created to change their behavior. Only the options in
207: ** the following enumeration are supported.
208: ***************************************************************************
209: */
210: typedef enum PRSockOption
211: {
212: PR_SockOpt_Nonblocking, /* nonblocking io */
213: PR_SockOpt_Linger, /* linger on close if data present */
214: PR_SockOpt_Reuseaddr, /* allow local address reuse */
215: PR_SockOpt_Keepalive, /* keep connections alive */
216: PR_SockOpt_RecvBufferSize, /* send buffer size */
217: PR_SockOpt_SendBufferSize, /* receive buffer size */
218:
219: PR_SockOpt_IpTimeToLive, /* time to live */
220: PR_SockOpt_IpTypeOfService, /* type of service and precedence */
221:
222: PR_SockOpt_AddMember, /* add an IP group membership */
223: PR_SockOpt_DropMember, /* drop an IP group membership */
224: PR_SockOpt_McastInterface, /* multicast interface address */
225: PR_SockOpt_McastTimeToLive, /* multicast timetolive */
226: PR_SockOpt_McastLoopback, /* multicast loopback */
227:
228: PR_SockOpt_NoDelay, /* don't delay send to coalesce packets */
229: PR_SockOpt_MaxSegment, /* maximum segment size */
230: PR_SockOpt_Broadcast, /* enable broadcast */
231: PR_SockOpt_Last
232: } PRSockOption;
233:
234: typedef struct PRLinger {
235: PRBool polarity; /* Polarity of the option's setting */
236: PRIntervalTime linger; /* Time to linger before closing */
237: } PRLinger;
238:
239: typedef struct PRMcastRequest {
240: PRNetAddr mcaddr; /* IP multicast address of group */
241: PRNetAddr ifaddr; /* local IP address of interface */
242: } PRMcastRequest;
243:
244: typedef struct PRSocketOptionData
245: {
246: PRSockOption option;
247: union
248: {
249: PRUintn ip_ttl; /* IP time to live */
250: PRUintn mcast_ttl; /* IP multicast time to live */
251: PRUintn tos; /* IP type of service and precedence */
252: PRBool non_blocking; /* Non-blocking (network) I/O */
253: PRBool reuse_addr; /* Allow local address reuse */
254: PRBool keep_alive; /* Keep connections alive */
255: PRBool mcast_loopback; /* IP multicast loopback */
256: PRBool no_delay; /* Don't delay send to coalesce packets */
257: PRBool broadcast; /* Enable broadcast */
258: PRSize max_segment; /* Maximum segment size */
259: PRSize recv_buffer_size; /* Receive buffer size */
260: PRSize send_buffer_size; /* Send buffer size */
261: PRLinger linger; /* Time to linger on close if data present */
262: PRMcastRequest add_member; /* add an IP group membership */
263: PRMcastRequest drop_member; /* Drop an IP group membership */
264: PRNetAddr mcast_if; /* multicast interface address */
265: } value;
266: } PRSocketOptionData;
267:
268: /*
269: ***************************************************************************
270: ** PRIOVec
271: **
272: ** The I/O vector is used by the write vector method to describe the areas
273: ** that are affected by the ouput operation.
274: ***************************************************************************
275: */
276: typedef struct PRIOVec {
277: char *iov_base;
278: int iov_len;
279: } PRIOVec;
280:
281: /*
282: ***************************************************************************
283: ** Discover what type of socket is being described by the file descriptor.
284: ***************************************************************************
285: */
286: typedef enum PRDescType
287: {
288: PR_DESC_FILE = 1,
289: PR_DESC_SOCKET_TCP = 2,
290: PR_DESC_SOCKET_UDP = 3,
291: PR_DESC_LAYERED = 4,
292: PR_DESC_PIPE = 5
293: } PRDescType;
294:
295: typedef enum PRSeekWhence {
296: PR_SEEK_SET = 0,
297: PR_SEEK_CUR = 1,
298: PR_SEEK_END = 2
299: } PRSeekWhence;
300:
301: NSPR_API(PRDescType) PR_GetDescType(PRFileDesc *file);
302:
303: /*
304: ***************************************************************************
305: ** PRIOMethods
306: **
307: ** The I/O methods table provides procedural access to the functions of
308: ** the file descriptor. It is the responsibility of a layer implementor
309: ** to provide suitable functions at every entry point. If a layer provides
310: ** no functionality, it should call the next lower(higher) function of the
311: ** same name (e.g., return fd->lower->method->close(fd->lower));
312: **
313: ** Not all functions are implemented for all types of files. In cases where
314: ** that is true, the function will return a error indication with an error
315: ** code of PR_INVALID_METHOD_ERROR.
316: ***************************************************************************
317: */
318:
319: typedef PRStatus (PR_CALLBACK *PRCloseFN)(PRFileDesc *fd);
320: typedef PRInt32 (PR_CALLBACK *PRReadFN)(PRFileDesc *fd, void *buf, PRInt32 amount);
321: typedef PRInt32 (PR_CALLBACK *PRWriteFN)(PRFileDesc *fd, const void *buf, PRInt32 amount);
322: typedef PRInt32 (PR_CALLBACK *PRAvailableFN)(PRFileDesc *fd);
323: typedef PRInt64 (PR_CALLBACK *PRAvailable64FN)(PRFileDesc *fd);
324: typedef PRStatus (PR_CALLBACK *PRFsyncFN)(PRFileDesc *fd);
325: typedef PROffset32 (PR_CALLBACK *PRSeekFN)(PRFileDesc *fd, PROffset32 offset, PRSeekWhence how);
326: typedef PROffset64 (PR_CALLBACK *PRSeek64FN)(PRFileDesc *fd, PROffset64 offset, PRSeekWhence how);
327: typedef PRStatus (PR_CALLBACK *PRFileInfoFN)(PRFileDesc *fd, PRFileInfo *info);
328: typedef PRStatus (PR_CALLBACK *PRFileInfo64FN)(PRFileDesc *fd, PRFileInfo64 *info);
329: typedef PRInt32 (PR_CALLBACK *PRWritevFN)(
330: PRFileDesc *fd, const PRIOVec *iov, PRInt32 iov_size,
331: PRIntervalTime timeout);
332: typedef PRStatus (PR_CALLBACK *PRConnectFN)(
333: PRFileDesc *fd, const PRNetAddr *addr, PRIntervalTime timeout);
334: typedef PRFileDesc* (PR_CALLBACK *PRAcceptFN) (
335: PRFileDesc *fd, PRNetAddr *addr, PRIntervalTime timeout);
336: typedef PRStatus (PR_CALLBACK *PRBindFN)(PRFileDesc *fd, const PRNetAddr *addr);
337: typedef PRStatus (PR_CALLBACK *PRListenFN)(PRFileDesc *fd, PRIntn backlog);
338: typedef PRStatus (PR_CALLBACK *PRShutdownFN)(PRFileDesc *fd, PRIntn how);
339: typedef PRInt32 (PR_CALLBACK *PRRecvFN)(
340: PRFileDesc *fd, void *buf, PRInt32 amount,
341: PRIntn flags, PRIntervalTime timeout);
342: typedef PRInt32 (PR_CALLBACK *PRSendFN) (
343: PRFileDesc *fd, const void *buf, PRInt32 amount,
344: PRIntn flags, PRIntervalTime timeout);
345: typedef PRInt32 (PR_CALLBACK *PRRecvfromFN)(
346: PRFileDesc *fd, void *buf, PRInt32 amount,
347: PRIntn flags, PRNetAddr *addr, PRIntervalTime timeout);
348: typedef PRInt32 (PR_CALLBACK *PRSendtoFN)(
349: PRFileDesc *fd, const void *buf, PRInt32 amount,
350: PRIntn flags, const PRNetAddr *addr, PRIntervalTime timeout);
351: typedef PRInt16 (PR_CALLBACK *PRPollFN)(
352: PRFileDesc *fd, PRInt16 in_flags, PRInt16 *out_flags);
353: typedef PRInt32 (PR_CALLBACK *PRAcceptreadFN)(
354: PRFileDesc *sd, PRFileDesc **nd, PRNetAddr **raddr,
355: void *buf, PRInt32 amount, PRIntervalTime t);
356: typedef PRInt32 (PR_CALLBACK *PRTransmitfileFN)(
357: PRFileDesc *sd, PRFileDesc *fd, const void *headers,
358: PRInt32 hlen, PRTransmitFileFlags flags, PRIntervalTime t);
359: typedef PRStatus (PR_CALLBACK *PRGetsocknameFN)(PRFileDesc *fd, PRNetAddr *addr);
360: typedef PRStatus (PR_CALLBACK *PRGetpeernameFN)(PRFileDesc *fd, PRNetAddr *addr);
361: typedef PRStatus (PR_CALLBACK *PRGetsocketoptionFN)(
362: PRFileDesc *fd, PRSocketOptionData *data);
363: typedef PRStatus (PR_CALLBACK *PRSetsocketoptionFN)(
364: PRFileDesc *fd, const PRSocketOptionData *data);
365: typedef PRInt32 (PR_CALLBACK *PRSendfileFN)(
366: PRFileDesc *networkSocket, PRSendFileData *sendData,
367: PRTransmitFileFlags flags, PRIntervalTime timeout);
368: typedef PRStatus (PR_CALLBACK *PRConnectcontinueFN)(
369: PRFileDesc *fd, PRInt16 out_flags);
370: typedef PRIntn (PR_CALLBACK *PRReservedFN)(PRFileDesc *fd);
371:
372: struct PRIOMethods {
373: PRDescType file_type; /* Type of file represented (tos) */
374: PRCloseFN close; /* close file and destroy descriptor */
375: PRReadFN read; /* read up to specified bytes into buffer */
376: PRWriteFN write; /* write specified bytes from buffer */
377: PRAvailableFN available; /* determine number of bytes available */
378: PRAvailable64FN available64; /* ditto, 64 bit */
379: PRFsyncFN fsync; /* flush all buffers to permanent store */
380: PRSeekFN seek; /* position the file to the desired place */
381: PRSeek64FN seek64; /* ditto, 64 bit */
382: PRFileInfoFN fileInfo; /* Get information about an open file */
383: PRFileInfo64FN fileInfo64; /* ditto, 64 bit */
384: PRWritevFN writev; /* Write segments as described by iovector */
385: PRConnectFN connect; /* Connect to the specified (net) address */
386: PRAcceptFN accept; /* Accept a connection for a (net) peer */
387: PRBindFN bind; /* Associate a (net) address with the fd */
388: PRListenFN listen; /* Prepare to listen for (net) connections */
389: PRShutdownFN shutdown; /* Shutdown a (net) connection */
390: PRRecvFN recv; /* Solicit up the the specified bytes */
391: PRSendFN send; /* Send all the bytes specified */
392: PRRecvfromFN recvfrom; /* Solicit (net) bytes and report source */
393: PRSendtoFN sendto; /* Send bytes to (net) address specified */
394: PRPollFN poll; /* Test the fd to see if it is ready */
395: PRAcceptreadFN acceptread; /* Accept and read on a new (net) fd */
396: PRTransmitfileFN transmitfile; /* Transmit at entire file */
397: PRGetsocknameFN getsockname; /* Get (net) address associated with fd */
398: PRGetpeernameFN getpeername; /* Get peer's (net) address */
399: PRReservedFN reserved_fn_6; /* reserved for future use */
400: PRReservedFN reserved_fn_5; /* reserved for future use */
401: PRGetsocketoptionFN getsocketoption;
402: /* Get current setting of specified option */
403: PRSetsocketoptionFN setsocketoption;
404: /* Set value of specified option */
405: PRSendfileFN sendfile; /* Send a (partial) file with header/trailer*/
406: PRConnectcontinueFN connectcontinue;
407: /* Continue a nonblocking connect */
408: PRReservedFN reserved_fn_3; /* reserved for future use */
409: PRReservedFN reserved_fn_2; /* reserved for future use */
410: PRReservedFN reserved_fn_1; /* reserved for future use */
411: PRReservedFN reserved_fn_0; /* reserved for future use */
412: };
413:
414: /*
415: **************************************************************************
416: * FUNCTION: PR_GetSpecialFD
417: * DESCRIPTION: Get the file descriptor that represents the standard input,
418: * output, or error stream.
419: * INPUTS:
420: * PRSpecialFD id
421: * A value indicating the type of stream desired:
422: * PR_StandardInput: standard input
423: * PR_StandardOuput: standard output
424: * PR_StandardError: standard error
425: * OUTPUTS: none
426: * RETURNS: PRFileDesc *
427: * If the argument is valid, PR_GetSpecialFD returns a file descriptor
428: * that represents the corresponding standard I/O stream. Otherwise,
429: * PR_GetSpecialFD returns NULL and sets error PR_INVALID_ARGUMENT_ERROR.
430: **************************************************************************
431: */
432:
433: typedef enum PRSpecialFD
434: {
435: PR_StandardInput, /* standard input */
436: PR_StandardOutput, /* standard output */
437: PR_StandardError /* standard error */
438: } PRSpecialFD;
439:
440: NSPR_API(PRFileDesc*) PR_GetSpecialFD(PRSpecialFD id);
441:
442: #define PR_STDIN PR_GetSpecialFD(PR_StandardInput)
443: #define PR_STDOUT PR_GetSpecialFD(PR_StandardOutput)
444: #define PR_STDERR PR_GetSpecialFD(PR_StandardError)
445:
446: /*
447: **************************************************************************
448: * Layering file descriptors
449: *
450: * File descriptors may be layered. Each layer has it's own identity.
451: * Identities are allocated by the runtime and are to be associated
452: * (by the layer implementor) with all layers that are of that type.
453: * It is then possible to scan the chain of layers and find a layer
454: * that one recongizes and therefore predict that it will implement
455: * a desired protocol.
456: *
457: * There are three well-known identities:
458: * PR_INVALID_IO_LAYER => an invalid layer identity, for error return
459: * PR_TOP_IO_LAYER => the identity of the top of the stack
460: * PR_NSPR_IO_LAYER => the identity used by NSPR proper
461: * PR_TOP_IO_LAYER may be used as a shorthand for identifying the topmost
462: * layer of an existing stack. Ie., the following two constructs are
463: * equivalent.
464: *
465: * rv = PR_PushIOLayer(stack, PR_TOP_IO_LAYER, my_layer);
466: * rv = PR_PushIOLayer(stack, PR_GetLayersIdentity(stack), my_layer)
467: *
468: * A string may be associated with the creation of the identity. It
469: * will be copied by the runtime. If queried the runtime will return
470: * a reference to that copied string (not yet another copy). There
471: * is no facility for deleting an identity.
472: **************************************************************************
473: */
474:
475: #define PR_IO_LAYER_HEAD (PRDescIdentity)-3
476: #define PR_INVALID_IO_LAYER (PRDescIdentity)-1
477: #define PR_TOP_IO_LAYER (PRDescIdentity)-2
478: #define PR_NSPR_IO_LAYER (PRDescIdentity)0
479:
480: NSPR_API(PRDescIdentity) PR_GetUniqueIdentity(const char *layer_name);
481: NSPR_API(const char*) PR_GetNameForIdentity(PRDescIdentity ident);
482: NSPR_API(PRDescIdentity) PR_GetLayersIdentity(PRFileDesc* fd);
483: NSPR_API(PRFileDesc*) PR_GetIdentitiesLayer(PRFileDesc* fd_stack, PRDescIdentity id);
484:
485: /*
486: **************************************************************************
487: * PR_GetDefaultIOMethods: Accessing the default methods table.
488: * You may get a pointer to the default methods table by calling this function.
489: * You may then select any elements from that table with which to build your
490: * layer's methods table. You may NOT modify the table directly.
491: **************************************************************************
492: */
493: NSPR_API(const PRIOMethods *) PR_GetDefaultIOMethods(void);
494:
495: /*
496: **************************************************************************
497: * Creating a layer
498: *
499: * A new layer may be allocated by calling PR_CreateIOLayerStub(). The
500: * file descriptor returned will contain the pointer to the methods table
501: * provided. The runtime will not modify the table nor test its correctness.
502: **************************************************************************
503: */
504: NSPR_API(PRFileDesc*) PR_CreateIOLayerStub(
505: PRDescIdentity ident, const PRIOMethods *methods);
506:
507: /*
508: **************************************************************************
509: * Creating a layer
510: *
511: * A new stack may be created by calling PR_CreateIOLayer(). The
512: * file descriptor returned will point to the top of the stack, which has
513: * the layer 'fd' as the topmost layer.
514: *
515: * NOTE: This function creates a new style stack, which has a fixed, dummy
516: * header. The old style stack, created by a call to PR_PushIOLayer,
517: * results in modifying contents of the top layer of the stack, when
518: * pushing and popping layers of the stack.
519: **************************************************************************
520: */
521: NSPR_API(PRFileDesc*) PR_CreateIOLayer(PRFileDesc* fd);
522:
523: /*
524: **************************************************************************
525: * Pushing a layer
526: *
527: * A file descriptor (perhaps allocated using PR_CreateIOLayerStub()) may
528: * be pushed into an existing stack of file descriptors at any point the
529: * caller deems appropriate. The new layer will be inserted into the stack
530: * just above the layer with the indicated identity.
531: *
532: * Note: Even if the identity parameter indicates the top-most layer of
533: * the stack, the value of the file descriptor describing the original
534: * stack will not change.
535: **************************************************************************
536: */
537: NSPR_API(PRStatus) PR_PushIOLayer(
538: PRFileDesc *fd_stack, PRDescIdentity id, PRFileDesc *layer);
539:
540: /*
541: **************************************************************************
542: * Popping a layer
543: *
544: * A layer may be popped from a stack by indicating the identity of the
545: * layer to be removed. If found, a pointer to the removed object will
546: * be returned to the caller. The object then becomes the responsibility
547: * of the caller.
548: *
549: * Note: Even if the identity indicates the top layer of the stack, the
550: * reference returned will not be the file descriptor for the stack and
551: * that file descriptor will remain valid.
552: **************************************************************************
553: */
554: NSPR_API(PRFileDesc*) PR_PopIOLayer(PRFileDesc *fd_stack, PRDescIdentity id);
555:
556: /*
557: **************************************************************************
558: * FUNCTION: PR_Open
559: * DESCRIPTION: Open a file for reading, writing, or both.
560: * INPUTS:
561: * const char *name
562: * The path name of the file to be opened
563: * PRIntn flags
564: * The file status flags.
565: * It is a bitwise OR of the following bit flags (only one of
566: * the first three flags below may be used):
567: * PR_RDONLY Open for reading only.
568: * PR_WRONLY Open for writing only.
569: * PR_RDWR Open for reading and writing.
570: * PR_CREATE_FILE If the file does not exist, the file is created
571: * If the file exists, this flag has no effect.
572: * PR_SYNC If set, each write will wait for both the file data
573: * and file status to be physically updated.
574: * PR_APPEND The file pointer is set to the end of
575: * the file prior to each write.
576: * PR_TRUNCATE If the file exists, its length is truncated to 0.
577: * PR_EXCL With PR_CREATE_FILE, if the file does not exist,
578: * the file is created. If the file already
579: * exists, no action and NULL is returned
580: *
581: * PRIntn mode
582: * The access permission bits of the file mode, if the file is
583: * created when PR_CREATE_FILE is on.
584: * OUTPUTS: None
585: * RETURNS: PRFileDesc *
586: * If the file is successfully opened,
587: * returns a pointer to the PRFileDesc
588: * created for the newly opened file.
589: * Returns a NULL pointer if the open
590: * failed.
591: * SIDE EFFECTS:
592: * RESTRICTIONS:
593: * MEMORY:
594: * The return value, if not NULL, points to a dynamically allocated
595: * PRFileDesc object.
596: * ALGORITHM:
597: **************************************************************************
598: */
599:
600: /* Open flags */
601: #define PR_RDONLY 0x01
602: #define PR_WRONLY 0x02
603: #define PR_RDWR 0x04
604: #define PR_CREATE_FILE 0x08
605: #define PR_APPEND 0x10
606: #define PR_TRUNCATE 0x20
607: #define PR_SYNC 0x40
608: #define PR_EXCL 0x80
609:
610: /*
611: ** File modes ....
612: **
613: ** CAVEAT: 'mode' is currently only applicable on UNIX platforms.
614: ** The 'mode' argument may be ignored by PR_Open on other platforms.
615: **
616: ** 00400 Read by owner.
617: ** 00200 Write by owner.
618: ** 00100 Execute (search if a directory) by owner.
619: ** 00040 Read by group.
620: ** 00020 Write by group.
621: ** 00010 Execute by group.
622: ** 00004 Read by others.
623: ** 00002 Write by others
624: ** 00001 Execute by others.
625: **
626: */
627:
628: NSPR_API(PRFileDesc*) PR_Open(const char *name, PRIntn flags, PRIntn mode);
629:
630: /*
631: **************************************************************************
632: * FUNCTION: PR_OpenFile
633: * DESCRIPTION:
634: * Open a file for reading, writing, or both.
635: * PR_OpenFile has the same prototype as PR_Open but implements
636: * the specified file mode where possible.
637: **************************************************************************
638: */
639:
640: /* File mode bits */
641: #define PR_IRWXU 00700 /* read, write, execute/search by owner */
642: #define PR_IRUSR 00400 /* read permission, owner */
643: #define PR_IWUSR 00200 /* write permission, owner */
644: #define PR_IXUSR 00100 /* execute/search permission, owner */
645: #define PR_IRWXG 00070 /* read, write, execute/search by group */
646: #define PR_IRGRP 00040 /* read permission, group */
647: #define PR_IWGRP 00020 /* write permission, group */
648: #define PR_IXGRP 00010 /* execute/search permission, group */
649: #define PR_IRWXO 00007 /* read, write, execute/search by others */
650: #define PR_IROTH 00004 /* read permission, others */
651: #define PR_IWOTH 00002 /* write permission, others */
652: #define PR_IXOTH 00001 /* execute/search permission, others */
653:
654: NSPR_API(PRFileDesc*) PR_OpenFile(
655: const char *name, PRIntn flags, PRIntn mode);
656:
657: #ifdef MOZ_UNICODE
658: /*
659: * EXPERIMENTAL: This function may be removed in a future release.
660: */
661: NSPR_API(PRFileDesc*) PR_OpenFileUTF16(
662: const PRUnichar *name, PRIntn flags, PRIntn mode);
663: #endif /* MOZ_UNICODE */
664:
665: /*
666: **************************************************************************
667: * FUNCTION: PR_Close
668: * DESCRIPTION:
669: * Close a file or socket.
670: * INPUTS:
671: * PRFileDesc *fd
672: * a pointer to a PRFileDesc.
673: * OUTPUTS:
674: * None.
675: * RETURN:
676: * PRStatus
677: * SIDE EFFECTS:
678: * RESTRICTIONS:
679: * None.
680: * MEMORY:
681: * The dynamic memory pointed to by the argument fd is freed.
682: **************************************************************************
683: */
684:
685: NSPR_API(PRStatus) PR_Close(PRFileDesc *fd);
686:
687: /*
688: **************************************************************************
689: * FUNCTION: PR_Read
690: * DESCRIPTION:
691: * Read bytes from a file or socket.
692: * The operation will block until either an end of stream indication is
693: * encountered, some positive number of bytes are transferred, or there
694: * is an error. No more than 'amount' bytes will be transferred.
695: * INPUTS:
696: * PRFileDesc *fd
697: * pointer to the PRFileDesc object for the file or socket
698: * void *buf
699: * pointer to a buffer to hold the data read in.
700: * PRInt32 amount
701: * the size of 'buf' (in bytes)
702: * OUTPUTS:
703: * RETURN:
704: * PRInt32
705: * a positive number indicates the number of bytes actually read in.
706: * 0 means end of file is reached or the network connection is closed.
707: * -1 indicates a failure. The reason for the failure is obtained
708: * by calling PR_GetError().
709: * SIDE EFFECTS:
710: * data is written into the buffer pointed to by 'buf'.
711: * RESTRICTIONS:
712: * None.
713: * MEMORY:
714: * N/A
715: * ALGORITHM:
716: * N/A
717: **************************************************************************
718: */
719:
720: NSPR_API(PRInt32) PR_Read(PRFileDesc *fd, void *buf, PRInt32 amount);
721:
722: /*
723: ***************************************************************************
724: * FUNCTION: PR_Write
725: * DESCRIPTION:
726: * Write a specified number of bytes to a file or socket. The thread
727: * invoking this function blocks until all the data is written.
728: * INPUTS:
729: * PRFileDesc *fd
730: * pointer to a PRFileDesc object that refers to a file or socket
731: * const void *buf
732: * pointer to the buffer holding the data
733: * PRInt32 amount
734: * amount of data in bytes to be written from the buffer
735: * OUTPUTS:
736: * None.
737: * RETURN: PRInt32
738: * A positive number indicates the number of bytes successfully written.
739: * A -1 is an indication that the operation failed. The reason
740: * for the failure is obtained by calling PR_GetError().
741: ***************************************************************************
742: */
743:
744: NSPR_API(PRInt32) PR_Write(PRFileDesc *fd,const void *buf,PRInt32 amount);
745:
746: /*
747: ***************************************************************************
748: * FUNCTION: PR_Writev
749: * DESCRIPTION:
750: * Write data to a socket. The data is organized in a PRIOVec array. The
751: * operation will block until all the data is written or the operation
752: * fails.
753: * INPUTS:
754: * PRFileDesc *fd
755: * Pointer that points to a PRFileDesc object for a socket.
756: * const PRIOVec *iov
757: * An array of PRIOVec. PRIOVec is a struct with the following
758: * two fields:
759: * char *iov_base;
760: * int iov_len;
761: * PRInt32 iov_size
762: * Number of elements in the iov array. The value of this
763: * argument must not be greater than PR_MAX_IOVECTOR_SIZE.
764: * If it is, the method will fail (PR_BUFFER_OVERFLOW_ERROR).
765: * PRIntervalTime timeout
766: * Time limit for completion of the entire write operation.
767: * OUTPUTS:
768: * None
769: * RETURN:
770: * A positive number indicates the number of bytes successfully written.
771: * A -1 is an indication that the operation failed. The reason
772: * for the failure is obtained by calling PR_GetError().
773: ***************************************************************************
774: */
775:
776: #define PR_MAX_IOVECTOR_SIZE 16 /* 'iov_size' must be <= */
777:
778: NSPR_API(PRInt32) PR_Writev(
779: PRFileDesc *fd, const PRIOVec *iov, PRInt32 iov_size,
780: PRIntervalTime timeout);
781:
782: /*
783: ***************************************************************************
784: * FUNCTION: PR_Delete
785: * DESCRIPTION:
786: * Delete a file from the filesystem. The operation may fail if the
787: * file is open.
788: * INPUTS:
789: * const char *name
790: * Path name of the file to be deleted.
791: * OUTPUTS:
792: * None.
793: * RETURN: PRStatus
794: * The function returns PR_SUCCESS if the file is successfully
795: * deleted, otherwise it returns PR_FAILURE.
796: ***************************************************************************
797: */
798:
799: NSPR_API(PRStatus) PR_Delete(const char *name);
800:
801: /**************************************************************************/
802:
803: typedef enum PRFileType
804: {
805: PR_FILE_FILE = 1,
806: PR_FILE_DIRECTORY = 2,
807: PR_FILE_OTHER = 3
808: } PRFileType;
809:
810: struct PRFileInfo {
811: PRFileType type; /* Type of file */
812: PROffset32 size; /* Size, in bytes, of file's contents */
813: PRTime creationTime; /* Creation time per definition of PRTime */
814: PRTime modifyTime; /* Last modification time per definition of PRTime */
815: };
816:
817: struct PRFileInfo64 {
818: PRFileType type; /* Type of file */
819: PROffset64 size; /* Size, in bytes, of file's contents */
820: PRTime creationTime; /* Creation time per definition of PRTime */
821: PRTime modifyTime; /* Last modification time per definition of PRTime */
822: };
823:
824: /****************************************************************************
825: * FUNCTION: PR_GetFileInfo, PR_GetFileInfo64
826: * DESCRIPTION:
827: * Get the information about the file with the given path name. This is
828: * applicable only to NSFileDesc describing 'file' types (see
829: * INPUTS:
830: * const char *fn
831: * path name of the file
832: * OUTPUTS:
833: * PRFileInfo *info
834: * Information about the given file is written into the file
835: * information object pointer to by 'info'.
836: * RETURN: PRStatus
837: * PR_GetFileInfo returns PR_SUCCESS if file information is successfully
838: * obtained, otherwise it returns PR_FAILURE.
839: ***************************************************************************
840: */
841:
842: NSPR_API(PRStatus) PR_GetFileInfo(const char *fn, PRFileInfo *info);
843: NSPR_API(PRStatus) PR_GetFileInfo64(const char *fn, PRFileInfo64 *info);
844:
845: #ifdef MOZ_UNICODE
846: /*
847: * EXPERIMENTAL: This function may be removed in a future release.
848: */
849: NSPR_API(PRStatus) PR_GetFileInfo64UTF16(const PRUnichar *fn, PRFileInfo64 *info);
850: #endif /* MOZ_UNICODE */
851:
852: /*
853: **************************************************************************
854: * FUNCTION: PR_GetOpenFileInfo, PR_GetOpenFileInfo64
855: * DESCRIPTION:
856: * Get information about an open file referred to by the
857: * given PRFileDesc object.
858: * INPUTS:
859: * const PRFileDesc *fd
860: * A reference to a valid, open file.
861: * OUTPUTS:
862: * Same as PR_GetFileInfo, PR_GetFileInfo64
863: * RETURN: PRStatus
864: * PR_GetFileInfo returns PR_SUCCESS if file information is successfully
865: * obtained, otherwise it returns PR_FAILURE.
866: ***************************************************************************
867: */
868:
869: NSPR_API(PRStatus) PR_GetOpenFileInfo(PRFileDesc *fd, PRFileInfo *info);
870: NSPR_API(PRStatus) PR_GetOpenFileInfo64(PRFileDesc *fd, PRFileInfo64 *info);
871:
872: /*
873: **************************************************************************
874: * FUNCTION: PR_Rename
875: * DESCRIPTION:
876: * Rename a file from the old name 'from' to the new name 'to'.
877: * INPUTS:
878: * const char *from
879: * The old name of the file to be renamed.
880: * const char *to
881: * The new name of the file.
882: * OUTPUTS:
883: * None.
884: * RETURN: PRStatus
885: **************************************************************************
886: */
887:
888: NSPR_API(PRStatus) PR_Rename(const char *from, const char *to);
889:
890: /*
891: *************************************************************************
892: * FUNCTION: PR_Access
893: * DESCRIPTION:
894: * Determine accessibility of a file.
895: * INPUTS:
896: * const char *name
897: * path name of the file
898: * PRAccessHow how
899: * specifies which access permission to check for.
900: * It can be one of the following values:
901: * PR_ACCESS_READ_OK Test for read permission
902: * PR_ACCESS_WRITE_OK Test for write permission
903: * PR_ACCESS_EXISTS Check existence of file
904: * OUTPUTS:
905: * None.
906: * RETURN: PRStatus
907: * PR_SUCCESS is returned if the requested access is permitted.
908: * Otherwise, PR_FAILURE is returned. Additional information
909: * regarding the reason for the failure may be retrieved from
910: * PR_GetError().
911: *************************************************************************
912: */
913:
914: typedef enum PRAccessHow {
915: PR_ACCESS_EXISTS = 1,
916: PR_ACCESS_WRITE_OK = 2,
917: PR_ACCESS_READ_OK = 3
918: } PRAccessHow;
919:
920: NSPR_API(PRStatus) PR_Access(const char *name, PRAccessHow how);
921:
922: /*
923: *************************************************************************
924: * FUNCTION: PR_Seek, PR_Seek64
925: * DESCRIPTION:
926: * Moves read-write file offset
927: * INPUTS:
928: * PRFileDesc *fd
929: * Pointer to a PRFileDesc object.
930: * PROffset32, PROffset64 offset
931: * Specifies a value, in bytes, that is used in conjunction
932: * with the 'whence' parameter to set the file pointer. A
933: * negative value causes seeking in the reverse direction.
934: * PRSeekWhence whence
935: * Specifies how to interpret the 'offset' parameter in setting
936: * the file pointer associated with the 'fd' parameter.
937: * Values for the 'whence' parameter are:
938: * PR_SEEK_SET Sets the file pointer to the value of the
939: * 'offset' parameter
940: * PR_SEEK_CUR Sets the file pointer to its current location
941: * plus the value of the offset parameter.
942: * PR_SEEK_END Sets the file pointer to the size of the
943: * file plus the value of the offset parameter.
944: * OUTPUTS:
945: * None.
946: * RETURN: PROffset32, PROffset64
947: * Upon successful completion, the resulting pointer location,
948: * measured in bytes from the beginning of the file, is returned.
949: * If the PR_Seek() function fails, the file offset remains
950: * unchanged, and the returned value is -1. The error code can
951: * then be retrieved via PR_GetError().
952: *************************************************************************
953: */
954:
955: NSPR_API(PROffset32) PR_Seek(PRFileDesc *fd, PROffset32 offset, PRSeekWhence whence);
956: NSPR_API(PROffset64) PR_Seek64(PRFileDesc *fd, PROffset64 offset, PRSeekWhence whence);
957:
958: /*
959: ************************************************************************
960: * FUNCTION: PR_Available
961: * DESCRIPTION:
962: * Determine the amount of data in bytes available for reading
963: * in the given file or socket.
964: * INPUTS:
965: * PRFileDesc *fd
966: * Pointer to a PRFileDesc object that refers to a file or
967: * socket.
968: * OUTPUTS:
969: * None
970: * RETURN: PRInt32, PRInt64
971: * Upon successful completion, PR_Available returns the number of
972: * bytes beyond the current read pointer that is available for
973: * reading. Otherwise, it returns a -1 and the reason for the
974: * failure can be retrieved via PR_GetError().
975: ************************************************************************
976: */
977:
978: NSPR_API(PRInt32) PR_Available(PRFileDesc *fd);
979: NSPR_API(PRInt64) PR_Available64(PRFileDesc *fd);
980:
981: /*
982: ************************************************************************
983: * FUNCTION: PR_Sync
984: * DESCRIPTION:
985: * Sync any buffered data for a fd to its backing device (disk).
986: * INPUTS:
987: * PRFileDesc *fd
988: * Pointer to a PRFileDesc object that refers to a file or
989: * socket
990: * OUTPUTS:
991: * None
992: * RETURN: PRStatus
993: * PR_SUCCESS is returned if the requested access is permitted.
994: * Otherwise, PR_FAILURE is returned.
995: ************************************************************************
996: */
997:
998: NSPR_API(PRStatus) PR_Sync(PRFileDesc *fd);
999:
1000: /************************************************************************/
1001:
1002: struct PRDirEntry {
1003: const char *name; /* name of entry, relative to directory name */
1004: };
1005:
1006: #ifdef MOZ_UNICODE
1007: struct PRDirEntryUTF16 {
1008: const PRUnichar *name; /* name of entry in UTF16, relative to
1009: * directory name */
1010: };
1011: #endif /* MOZ_UNICODE */
1012:
1013: #if !defined(NO_NSPR_10_SUPPORT)
1014: #define PR_DirName(dirEntry) (dirEntry->name)
1015: #endif
1016:
1017: /*
1018: *************************************************************************
1019: * FUNCTION: PR_OpenDir
1020: * DESCRIPTION:
1021: * Open the directory by the given name
1022: * INPUTS:
1023: * const char *name
1024: * path name of the directory to be opened
1025: * OUTPUTS:
1026: * None
1027: * RETURN: PRDir *
1028: * If the directory is sucessfully opened, a PRDir object is
1029: * dynamically allocated and a pointer to it is returned.
1030: * If the directory cannot be opened, a NULL pointer is returned.
1031: * MEMORY:
1032: * Upon successful completion, the return value points to
1033: * dynamically allocated memory.
1034: *************************************************************************
1035: */
1036:
1037: NSPR_API(PRDir*) PR_OpenDir(const char *name);
1038:
1039: #ifdef MOZ_UNICODE
1040: /*
1041: * EXPERIMENTAL: This function may be removed in a future release.
1042: */
1043: NSPR_API(PRDirUTF16*) PR_OpenDirUTF16(const PRUnichar *name);
1044: #endif /* MOZ_UNICODE */
1045:
1046: /*
1047: *************************************************************************
1048: * FUNCTION: PR_ReadDir
1049: * DESCRIPTION:
1050: * INPUTS:
1051: * PRDir *dir
1052: * pointer to a PRDir object that designates an open directory
1053: * PRDirFlags flags
1054: * PR_SKIP_NONE Do not skip any files
1055: * PR_SKIP_DOT Skip the directory entry "." that
1056: * represents the current directory
1057: * PR_SKIP_DOT_DOT Skip the directory entry ".." that
1058: * represents the parent directory.
1059: * PR_SKIP_BOTH Skip both '.' and '..'
1060: * PR_SKIP_HIDDEN Skip hidden files
1061: * OUTPUTS:
1062: * RETURN: PRDirEntry*
1063: * Returns a pointer to the next entry in the directory. Returns
1064: * a NULL pointer upon reaching the end of the directory or when an
1065: * error occurs. The actual reason can be retrieved via PR_GetError().
1066: *************************************************************************
1067: */
1068:
1069: typedef enum PRDirFlags {
1070: PR_SKIP_NONE = 0x0,
1071: PR_SKIP_DOT = 0x1,
1072: PR_SKIP_DOT_DOT = 0x2,
1073: PR_SKIP_BOTH = 0x3,
1074: PR_SKIP_HIDDEN = 0x4
1075: } PRDirFlags;
1076:
1077: NSPR_API(PRDirEntry*) PR_ReadDir(PRDir *dir, PRDirFlags flags);
1078:
1079: #ifdef MOZ_UNICODE
1080: /*
1081: * EXPERIMENTAL: This function may be removed in a future release.
1082: */
1083: NSPR_API(PRDirEntryUTF16*) PR_ReadDirUTF16(PRDirUTF16 *dir, PRDirFlags flags);
1084: #endif /* MOZ_UNICODE */
1085:
1086: /*
1087: *************************************************************************
1088: * FUNCTION: PR_CloseDir
1089: * DESCRIPTION:
1090: * Close the specified directory.
1091: * INPUTS:
1092: * PRDir *dir
1093: * The directory to be closed.
1094: * OUTPUTS:
1095: * None
1096: * RETURN: PRStatus
1097: * If successful, will return a status of PR_SUCCESS. Otherwise
1098: * a value of PR_FAILURE. The reason for the failure may be re-
1099: * trieved using PR_GetError().
1100: *************************************************************************
1101: */
1102:
1103: NSPR_API(PRStatus) PR_CloseDir(PRDir *dir);
1104:
1105: #ifdef MOZ_UNICODE
1106: /*
1107: * EXPERIMENTAL: This function may be removed in a future release.
1108: */
1109: NSPR_API(PRStatus) PR_CloseDirUTF16(PRDirUTF16 *dir);
1110: #endif /* MOZ_UNICODE */
1111:
1112: /*
1113: *************************************************************************
1114: * FUNCTION: PR_MkDir
1115: * DESCRIPTION:
1116: * Create a new directory with the given name and access mode.
1117: * INPUTS:
1118: * const char *name
1119: * The name of the directory to be created. All the path components
1120: * up to but not including the leaf component must already exist.
1121: * PRIntn mode
1122: * See 'mode' definiton in PR_Open().
1123: * OUTPUTS:
1124: * None
1125: * RETURN: PRStatus
1126: * If successful, will return a status of PR_SUCCESS. Otherwise
1127: * a value of PR_FAILURE. The reason for the failure may be re-
1128: * trieved using PR_GetError().
1129: *************************************************************************
1130: */
1131:
1132: NSPR_API(PRStatus) PR_MkDir(const char *name, PRIntn mode);
1133:
1134: /*
1135: *************************************************************************
1136: * FUNCTION: PR_MakeDir
1137: * DESCRIPTION:
1138: * Create a new directory with the given name and access mode.
1139: * PR_MakeDir has the same prototype as PR_MkDir but implements
1140: * the specified access mode where possible.
1141: *************************************************************************
1142: */
1143:
1144: NSPR_API(PRStatus) PR_MakeDir(const char *name, PRIntn mode);
1145:
1146: /*
1147: *************************************************************************
1148: * FUNCTION: PR_RmDir
1149: * DESCRIPTION:
1150: * Remove a directory by the given name.
1151: * INPUTS:
1152: * const char *name
1153: * The name of the directory to be removed. All the path components
1154: * must already exist. Only the leaf component will be removed.
1155: * OUTPUTS:
1156: * None
1157: * RETURN: PRStatus
1158: * If successful, will return a status of PR_SUCCESS. Otherwise
1159: * a value of PR_FAILURE. The reason for the failure may be re-
1160: * trieved using PR_GetError().
1161: **************************************************************************
1162: */
1163:
1164: NSPR_API(PRStatus) PR_RmDir(const char *name);
1165:
1166: /*
1167: *************************************************************************
1168: * FUNCTION: PR_NewUDPSocket
1169: * DESCRIPTION:
1170: * Create a new UDP socket.
1171: * INPUTS:
1172: * None
1173: * OUTPUTS:
1174: * None
1175: * RETURN: PRFileDesc*
1176: * Upon successful completion, PR_NewUDPSocket returns a pointer
1177: * to the PRFileDesc created for the newly opened UDP socket.
1178: * Returns a NULL pointer if the creation of a new UDP socket failed.
1179: *
1180: **************************************************************************
1181: */
1182:
1183: NSPR_API(PRFileDesc*) PR_NewUDPSocket(void);
1184:
1185: /*
1186: *************************************************************************
1187: * FUNCTION: PR_NewTCPSocket
1188: * DESCRIPTION:
1189: * Create a new TCP socket.
1190: * INPUTS:
1191: * None
1192: * OUTPUTS:
1193: * None
1194: * RETURN: PRFileDesc*
1195: * Upon successful completion, PR_NewTCPSocket returns a pointer
1196: * to the PRFileDesc created for the newly opened TCP socket.
1197: * Returns a NULL pointer if the creation of a new TCP socket failed.
1198: *
1199: **************************************************************************
1200: */
1201:
1202: NSPR_API(PRFileDesc*) PR_NewTCPSocket(void);
1203:
1204: /*
1205: *************************************************************************
1206: * FUNCTION: PR_OpenUDPSocket
1207: * DESCRIPTION:
1208: * Create a new UDP socket of the specified address family.
1209: * INPUTS:
1210: * PRIntn af
1211: * Address family
1212: * OUTPUTS:
1213: * None
1214: * RETURN: PRFileDesc*
1215: * Upon successful completion, PR_OpenUDPSocket returns a pointer
1216: * to the PRFileDesc created for the newly opened UDP socket.
1217: * Returns a NULL pointer if the creation of a new UDP socket failed.
1218: *
1219: **************************************************************************
1220: */
1221:
1222: NSPR_API(PRFileDesc*) PR_OpenUDPSocket(PRIntn af);
1223:
1224: /*
1225: *************************************************************************
1226: * FUNCTION: PR_OpenTCPSocket
1227: * DESCRIPTION:
1228: * Create a new TCP socket of the specified address family.
1229: * INPUTS:
1230: * PRIntn af
1231: * Address family
1232: * OUTPUTS:
1233: * None
1234: * RETURN: PRFileDesc*
1235: * Upon successful completion, PR_NewTCPSocket returns a pointer
1236: * to the PRFileDesc created for the newly opened TCP socket.
1237: * Returns a NULL pointer if the creation of a new TCP socket failed.
1238: *
1239: **************************************************************************
1240: */
1241:
1242: NSPR_API(PRFileDesc*) PR_OpenTCPSocket(PRIntn af);
1243:
1244: /*
1245: *************************************************************************
1246: * FUNCTION: PR_Connect
1247: * DESCRIPTION:
1248: * Initiate a connection on a socket.
1249: * INPUTS:
1250: * PRFileDesc *fd
1251: * Points to a PRFileDesc object representing a socket
1252: * PRNetAddr *addr
1253: * Specifies the address of the socket in its own communication
1254: * space.
1255: * PRIntervalTime timeout
1256: * Time limit for completion of the connect operation.
1257: * OUTPUTS:
1258: * None
1259: * RETURN: PRStatus
1260: * Upon successful completion of connection initiation, PR_Connect
1261: * returns PR_SUCCESS. Otherwise, it returns PR_FAILURE. Further
1262: * failure information can be obtained by calling PR_GetError().
1263: **************************************************************************
1264: */
1265:
1266: NSPR_API(PRStatus) PR_Connect(
1267: PRFileDesc *fd, const PRNetAddr *addr, PRIntervalTime timeout);
1268:
1269: /*
1270: *************************************************************************
1271: * FUNCTION: PR_ConnectContinue
1272: * DESCRIPTION:
1273: * Continue a nonblocking connect. After a nonblocking connect
1274: * is initiated with PR_Connect() (which fails with
1275: * PR_IN_PROGRESS_ERROR), one should call PR_Poll() on the socket,
1276: * with the in_flags PR_POLL_WRITE | PR_POLL_EXCEPT. When
1277: * PR_Poll() returns, one calls PR_ConnectContinue() on the
1278: * socket to determine whether the nonblocking connect has
1279: * completed or is still in progress. Repeat the PR_Poll(),
1280: * PR_ConnectContinue() sequence until the nonblocking connect
1281: * has completed.
1282: * INPUTS:
1283: * PRFileDesc *fd
1284: * the file descriptor representing a socket
1285: * PRInt16 out_flags
1286: * the out_flags field of the poll descriptor returned by
1287: * PR_Poll()
1288: * RETURN: PRStatus
1289: * If the nonblocking connect has successfully completed,
1290: * PR_ConnectContinue returns PR_SUCCESS. If PR_ConnectContinue()
1291: * returns PR_FAILURE, call PR_GetError():
1292: * - PR_IN_PROGRESS_ERROR: the nonblocking connect is still in
1293: * progress and has not completed yet. The caller should poll
1294: * on the file descriptor for the in_flags
1295: * PR_POLL_WRITE|PR_POLL_EXCEPT and retry PR_ConnectContinue
1296: * later when PR_Poll() returns.
1297: * - Other errors: the nonblocking connect has failed with this
1298: * error code.
1299: */
1300:
1301: NSPR_API(PRStatus) PR_ConnectContinue(PRFileDesc *fd, PRInt16 out_flags);
1302:
1303: /*
1304: *************************************************************************
1305: * THIS FUNCTION IS DEPRECATED. USE PR_ConnectContinue INSTEAD.
1306: *
1307: * FUNCTION: PR_GetConnectStatus
1308: * DESCRIPTION:
1309: * Get the completion status of a nonblocking connect. After
1310: * a nonblocking connect is initiated with PR_Connect() (which
1311: * fails with PR_IN_PROGRESS_ERROR), one should call PR_Poll()
1312: * on the socket, with the in_flags PR_POLL_WRITE | PR_POLL_EXCEPT.
1313: * When PR_Poll() returns, one calls PR_GetConnectStatus on the
1314: * PRPollDesc structure to determine whether the nonblocking
1315: * connect has succeeded or failed.
1316: * INPUTS:
1317: * const PRPollDesc *pd
1318: * Pointer to a PRPollDesc whose fd member is the socket,
1319: * and in_flags must contain PR_POLL_WRITE and PR_POLL_EXCEPT.
1320: * PR_Poll() should have been called and set the out_flags.
1321: * RETURN: PRStatus
1322: * If the nonblocking connect has successfully completed,
1323: * PR_GetConnectStatus returns PR_SUCCESS. If PR_GetConnectStatus()
1324: * returns PR_FAILURE, call PR_GetError():
1325: * - PR_IN_PROGRESS_ERROR: the nonblocking connect is still in
1326: * progress and has not completed yet.
1327: * - Other errors: the nonblocking connect has failed with this
1328: * error code.
1329: */
1330:
1331: NSPR_API(PRStatus) PR_GetConnectStatus(const PRPollDesc *pd);
1332:
1333: /*
1334: *************************************************************************
1335: * FUNCTION: PR_Accept
1336: * DESCRIPTION:
1337: * Accept a connection on a socket.
1338: * INPUTS:
1339: * PRFileDesc *fd
1340: * Points to a PRFileDesc object representing the rendezvous socket
1341: * on which the caller is willing to accept new connections.
1342: * PRIntervalTime timeout
1343: * Time limit for completion of the accept operation.
1344: * OUTPUTS:
1345: * PRNetAddr *addr
1346: * Returns the address of the connecting entity in its own
1347: * communication space. It may be NULL.
1348: * RETURN: PRFileDesc*
1349: * Upon successful acceptance of a connection, PR_Accept
1350: * returns a valid file descriptor. Otherwise, it returns NULL.
1351: * Further failure information can be obtained by calling PR_GetError().
1352: **************************************************************************
1353: */
1354:
1355: NSPR_API(PRFileDesc*) PR_Accept(
1356: PRFileDesc *fd, PRNetAddr *addr, PRIntervalTime timeout);
1357:
1358: /*
1359: *************************************************************************
1360: * FUNCTION: PR_Bind
1361: * DESCRIPTION:
1362: * Bind an address to a socket.
1363: * INPUTS:
1364: * PRFileDesc *fd
1365: * Points to a PRFileDesc object representing a socket.
1366: * PRNetAddr *addr
1367: * Specifies the address to which the socket will be bound.
1368: * OUTPUTS:
1369: * None
1370: * RETURN: PRStatus
1371: * Upon successful binding of an address to a socket, PR_Bind
1372: * returns PR_SUCCESS. Otherwise, it returns PR_FAILURE. Further
1373: * failure information can be obtained by calling PR_GetError().
1374: **************************************************************************
1375: */
1376:
1377: NSPR_API(PRStatus) PR_Bind(PRFileDesc *fd, const PRNetAddr *addr);
1378:
1379: /*
1380: *************************************************************************
1381: * FUNCTION: PR_Listen
1382: * DESCRIPTION:
1383: * Listen for connections on a socket.
1384: * INPUTS:
1385: * PRFileDesc *fd
1386: * Points to a PRFileDesc object representing a socket that will be
1387: * used to listen for new connections.
1388: * PRIntn backlog
1389: * Specifies the maximum length of the queue of pending connections.
1390: * OUTPUTS:
1391: * None
1392: * RETURN: PRStatus
1393: * Upon successful completion of listen request, PR_Listen
1394: * returns PR_SUCCESS. Otherwise, it returns PR_FAILURE. Further
1395: * failure information can be obtained by calling PR_GetError().
1396: **************************************************************************
1397: */
1398:
1399: NSPR_API(PRStatus) PR_Listen(PRFileDesc *fd, PRIntn backlog);
1400:
1401: /*
1402: *************************************************************************
1403: * FUNCTION: PR_Shutdown
1404: * DESCRIPTION:
1405: * Shut down part of a full-duplex connection on a socket.
1406: * INPUTS:
1407: * PRFileDesc *fd
1408: * Points to a PRFileDesc object representing a connected socket.
1409: * PRIntn how
1410: * Specifies the kind of disallowed operations on the socket.
1411: * PR_SHUTDOWN_RCV - Further receives will be disallowed
1412: * PR_SHUTDOWN_SEND - Further sends will be disallowed
1413: * PR_SHUTDOWN_BOTH - Further sends and receives will be disallowed
1414: * OUTPUTS:
1415: * None
1416: * RETURN: PRStatus
1417: * Upon successful completion of shutdown request, PR_Shutdown
1418: * returns PR_SUCCESS. Otherwise, it returns PR_FAILURE. Further
1419: * failure information can be obtained by calling PR_GetError().
1420: **************************************************************************
1421: */
1422:
1423: typedef enum PRShutdownHow
1424: {
1425: PR_SHUTDOWN_RCV = 0, /* disallow further receives */
1426: PR_SHUTDOWN_SEND = 1, /* disallow further sends */
1427: PR_SHUTDOWN_BOTH = 2 /* disallow further receives and sends */
1428: } PRShutdownHow;
1429:
1430: NSPR_API(PRStatus) PR_Shutdown(PRFileDesc *fd, PRShutdownHow how);
1431:
1432: /*
1433: *************************************************************************
1434: * FUNCTION: PR_Recv
1435: * DESCRIPTION:
1436: * Receive a specified number of bytes from a connected socket.
1437: * The operation will block until some positive number of bytes are
1438: * transferred, a time out has occurred, or there is an error.
1439: * No more than 'amount' bytes will be transferred.
1440: * INPUTS:
1441: * PRFileDesc *fd
1442: * points to a PRFileDesc object representing a socket.
1443: * void *buf
1444: * pointer to a buffer to hold the data received.
1445: * PRInt32 amount
1446: * the size of 'buf' (in bytes)
1447: * PRIntn flags
1448: * must be zero or PR_MSG_PEEK.
1449: * PRIntervalTime timeout
1450: * Time limit for completion of the receive operation.
1451: * OUTPUTS:
1452: * None
1453: * RETURN: PRInt32
1454: * a positive number indicates the number of bytes actually received.
1455: * 0 means the network connection is closed.
1456: * -1 indicates a failure. The reason for the failure is obtained
1457: * by calling PR_GetError().
1458: **************************************************************************
1459: */
1460:
1461: #define PR_MSG_PEEK 0x2
1462:
1463: NSPR_API(PRInt32) PR_Recv(PRFileDesc *fd, void *buf, PRInt32 amount,
1464: PRIntn flags, PRIntervalTime timeout);
1465:
1466: /*
1467: *************************************************************************
1468: * FUNCTION: PR_Send
1469: * DESCRIPTION:
1470: * Send a specified number of bytes from a connected socket.
1471: * The operation will block until all bytes are
1472: * processed, a time out has occurred, or there is an error.
1473: * INPUTS:
1474: * PRFileDesc *fd
1475: * points to a PRFileDesc object representing a socket.
1476: * void *buf
1477: * pointer to a buffer from where the data is sent.
1478: * PRInt32 amount
1479: * the size of 'buf' (in bytes)
1480: * PRIntn flags
1481: * (OBSOLETE - must always be zero)
1482: * PRIntervalTime timeout
1483: * Time limit for completion of the send operation.
1484: * OUTPUTS:
1485: * None
1486: * RETURN: PRInt32
1487: * A positive number indicates the number of bytes successfully processed.
1488: * This number must always equal 'amount'. A -1 is an indication that the
1489: * operation failed. The reason for the failure is obtained by calling
1490: * PR_GetError().
1491: **************************************************************************
1492: */
1493:
1494: NSPR_API(PRInt32) PR_Send(PRFileDesc *fd, const void *buf, PRInt32 amount,
1495: PRIntn flags, PRIntervalTime timeout);
1496:
1497: /*
1498: *************************************************************************
1499: * FUNCTION: PR_RecvFrom
1500: * DESCRIPTION:
1501: * Receive up to a specified number of bytes from socket which may
1502: * or may not be connected.
1503: * The operation will block until one or more bytes are
1504: * transferred, a time out has occurred, or there is an error.
1505: * No more than 'amount' bytes will be transferred.
1506: * INPUTS:
1507: * PRFileDesc *fd
1508: * points to a PRFileDesc object representing a socket.
1509: * void *buf
1510: * pointer to a buffer to hold the data received.
1511: * PRInt32 amount
1512: * the size of 'buf' (in bytes)
1513: * PRIntn flags
1514: * (OBSOLETE - must always be zero)
1515: * PRNetAddr *addr
1516: * Specifies the address of the sending peer. It may be NULL.
1517: * PRIntervalTime timeout
1518: * Time limit for completion of the receive operation.
1519: * OUTPUTS:
1520: * None
1521: * RETURN: PRInt32
1522: * a positive number indicates the number of bytes actually received.
1523: * 0 means the network connection is closed.
1524: * -1 indicates a failure. The reason for the failure is obtained
1525: * by calling PR_GetError().
1526: **************************************************************************
1527: */
1528:
1529: NSPR_API(PRInt32) PR_RecvFrom(
1530: PRFileDesc *fd, void *buf, PRInt32 amount, PRIntn flags,
1531: PRNetAddr *addr, PRIntervalTime timeout);
1532:
1533: /*
1534: *************************************************************************
1535: * FUNCTION: PR_SendTo
1536: * DESCRIPTION:
1537: * Send a specified number of bytes from an unconnected socket.
1538: * The operation will block until all bytes are
1539: * sent, a time out has occurred, or there is an error.
1540: * INPUTS:
1541: * PRFileDesc *fd
1542: * points to a PRFileDesc object representing an unconnected socket.
1543: * void *buf
1544: * pointer to a buffer from where the data is sent.
1545: * PRInt32 amount
1546: * the size of 'buf' (in bytes)
1547: * PRIntn flags
1548: * (OBSOLETE - must always be zero)
1549: * PRNetAddr *addr
1550: * Specifies the address of the peer.
1551: .* PRIntervalTime timeout
1552: * Time limit for completion of the send operation.
1553: * OUTPUTS:
1554: * None
1555: * RETURN: PRInt32
1556: * A positive number indicates the number of bytes successfully sent.
1557: * -1 indicates a failure. The reason for the failure is obtained
1558: * by calling PR_GetError().
1559: **************************************************************************
1560: */
1561:
1562: NSPR_API(PRInt32) PR_SendTo(
1563: PRFileDesc *fd, const void *buf, PRInt32 amount, PRIntn flags,
1564: const PRNetAddr *addr, PRIntervalTime timeout);
1565:
1566: /*
1567: *************************************************************************
1568: ** FUNCTION: PR_TransmitFile
1569: ** DESCRIPTION:
1570: ** Transmitfile sends a complete file (sourceFile) across a socket
1571: ** (networkSocket). If headers is non-NULL, the headers will be sent across
1572: ** the socket prior to sending the file.
1573: **
1574: ** Optionally, the PR_TRANSMITFILE_CLOSE_SOCKET flag may be passed to
1575: ** transmitfile. This flag specifies that transmitfile should close the
1576: ** socket after sending the data.
1577: **
1578: ** INPUTS:
1579: ** PRFileDesc *networkSocket
1580: ** The socket to send data over
1581: ** PRFileDesc *sourceFile
1582: ** The file to send
1583: ** const void *headers
1584: ** A pointer to headers to be sent before sending data
1585: ** PRInt32 hlen
1586: ** length of header buffers in bytes.
1587: ** PRTransmitFileFlags flags
1588: ** If the flags indicate that the connection should be closed,
1589: ** it will be done immediately after transferring the file, unless
1590: ** the operation is unsuccessful.
1591: .* PRIntervalTime timeout
1592: * Time limit for completion of the transmit operation.
1593: **
1594: ** RETURNS:
1595: ** Returns the number of bytes written or -1 if the operation failed.
1596: ** If an error occurs while sending the file, the PR_TRANSMITFILE_CLOSE_
1597: ** SOCKET flag is ignored. The reason for the failure is obtained
1598: ** by calling PR_GetError().
1599: **************************************************************************
1600: */
1601:
1602: NSPR_API(PRInt32) PR_TransmitFile(
1603: PRFileDesc *networkSocket, PRFileDesc *sourceFile,
1604: const void *headers, PRInt32 hlen, PRTransmitFileFlags flags,
1605: PRIntervalTime timeout);
1606:
1607: /*
1608: *************************************************************************
1609: ** FUNCTION: PR_SendFile
1610: ** DESCRIPTION:
1611: ** PR_SendFile sends data from a file (sendData->fd) across a socket
1612: ** (networkSocket). If specified, a header and/or trailer buffer are sent
1613: ** before and after the file, respectively. The file offset, number of bytes
1614: ** of file data to send, the header and trailer buffers are specified in the
1615: ** sendData argument.
1616: **
1617: ** Optionally, if the PR_TRANSMITFILE_CLOSE_SOCKET flag is passed, the
1618: ** socket is closed after successfully sending the data.
1619: **
1620: ** INPUTS:
1621: ** PRFileDesc *networkSocket
1622: ** The socket to send data over
1623: ** PRSendFileData *sendData
1624: ** Contains the FD, file offset and length, header and trailer
1625: ** buffer specifications.
1626: ** PRTransmitFileFlags flags
1627: ** If the flags indicate that the connection should be closed,
1628: ** it will be done immediately after transferring the file, unless
1629: ** the operation is unsuccessful.
1630: .* PRIntervalTime timeout
1631: * Time limit for completion of the send operation.
1632: **
1633: ** RETURNS:
1634: ** Returns the number of bytes written or -1 if the operation failed.
1635: ** If an error occurs while sending the file, the PR_TRANSMITFILE_CLOSE_
1636: ** SOCKET flag is ignored. The reason for the failure is obtained
1637: ** by calling PR_GetError().
1638: **************************************************************************
1639: */
1640:
1641: struct PRSendFileData {
1642: PRFileDesc *fd; /* file to send */
1643: PRUint32 file_offset; /* file offset */
1644: PRSize file_nbytes; /* number of bytes of file data to send */
1645: /* if 0, send data from file_offset to */
1646: /* end-of-file. */
1647: const void *header; /* header buffer */
1648: PRInt32 hlen; /* header len */
1649: const void *trailer; /* trailer buffer */
1650: PRInt32 tlen; /* trailer len */
1651: };
1652:
1653:
1654: NSPR_API(PRInt32) PR_SendFile(
1655: PRFileDesc *networkSocket, PRSendFileData *sendData,
1656: PRTransmitFileFlags flags, PRIntervalTime timeout);
1657:
1658: /*
1659: *************************************************************************
1660: ** FUNCTION: PR_AcceptRead
1661: ** DESCRIPTION:
1662: ** AcceptRead accepts a new connection, returns the newly created
1663: ** socket's descriptor and also returns the connecting peer's address.
1664: ** AcceptRead, as its name suggests, also receives the first block of data
1665: ** sent by the peer.
1666: **
1667: ** INPUTS:
1668: ** PRFileDesc *listenSock
1669: ** A socket descriptor that has been called with the PR_Listen()
1670: ** function, also known as the rendezvous socket.
1671: ** void *buf
1672: ** A pointer to a buffer to receive data sent by the client. This
1673: ** buffer must be large enough to receive <amount> bytes of data
1674: ** and two PRNetAddr structures, plus an extra 32 bytes. See:
1675: ** PR_ACCEPT_READ_BUF_OVERHEAD.
1676: ** PRInt32 amount
1677: ** The number of bytes of client data to receive. Does not include
1678: ** the size of the PRNetAddr structures. If 0, no data will be read
1679: ** from the client.
1680: ** PRIntervalTime timeout
1681: ** The timeout interval only applies to the read portion of the
1682: ** operation. PR_AcceptRead will block indefinitely until the
1683: ** connection is accepted; the read will timeout after the timeout
1684: ** interval elapses.
1685: ** OUTPUTS:
1686: ** PRFileDesc **acceptedSock
1687: ** The file descriptor for the newly connected socket. This parameter
1688: ** will only be valid if the function return does not indicate failure.
1689: ** PRNetAddr **peerAddr,
1690: ** The address of the remote socket. This parameter will only be
1691: ** valid if the function return does not indicate failure. The
1692: ** returned address is not guaranteed to be properly aligned.
1693: **
1694: ** RETURNS:
1695: ** The number of bytes read from the client or -1 on failure. The reason
1696: ** for the failure is obtained by calling PR_GetError().
1697: **************************************************************************
1698: **/
1699: /* define buffer overhead constant. Add this value to the user's
1700: ** data length when allocating a buffer to accept data.
1701: ** Example:
1702: ** #define USER_DATA_SIZE 10
1703: ** char buf[USER_DATA_SIZE + PR_ACCEPT_READ_BUF_OVERHEAD];
1704: ** bytesRead = PR_AcceptRead( s, fd, &a, &p, USER_DATA_SIZE, ...);
1705: */
1706: #define PR_ACCEPT_READ_BUF_OVERHEAD (32+(2*sizeof(PRNetAddr)))
1707:
1708: NSPR_API(PRInt32) PR_AcceptRead(
1709: PRFileDesc *listenSock, PRFileDesc **acceptedSock,
1710: PRNetAddr **peerAddr, void *buf, PRInt32 amount, PRIntervalTime timeout);
1711:
1712: /*
1713: *************************************************************************
1714: ** FUNCTION: PR_NewTCPSocketPair
1715: ** DESCRIPTION:
1716: ** Create a new TCP socket pair. The returned descriptors can be used
1717: ** interchangeably; they are interconnected full-duplex descriptors: data
1718: ** written to one can be read from the other and vice-versa.
1719: **
1720: ** INPUTS:
1721: ** None
1722: ** OUTPUTS:
1723: ** PRFileDesc *fds[2]
1724: ** The file descriptor pair for the newly created TCP sockets.
1725: ** RETURN: PRStatus
1726: ** Upon successful completion of TCP socket pair, PR_NewTCPSocketPair
1727: ** returns PR_SUCCESS. Otherwise, it returns PR_FAILURE. Further
1728: ** failure information can be obtained by calling PR_GetError().
1729: ** XXX can we implement this on windoze and mac?
1730: **************************************************************************
1731: **/
1732: NSPR_API(PRStatus) PR_NewTCPSocketPair(PRFileDesc *fds[2]);
1733:
1734: /*
1735: *************************************************************************
1736: ** FUNCTION: PR_GetSockName
1737: ** DESCRIPTION:
1738: ** Get socket name. Return the network address for this socket.
1739: **
1740: ** INPUTS:
1741: ** PRFileDesc *fd
1742: ** Points to a PRFileDesc object representing the socket.
1743: ** OUTPUTS:
1744: ** PRNetAddr *addr
1745: ** Returns the address of the socket in its own communication space.
1746: ** RETURN: PRStatus
1747: ** Upon successful completion, PR_GetSockName returns PR_SUCCESS.
1748: ** Otherwise, it returns PR_FAILURE. Further failure information can
1749: ** be obtained by calling PR_GetError().
1750: **************************************************************************
1751: **/
1752: NSPR_API(PRStatus) PR_GetSockName(PRFileDesc *fd, PRNetAddr *addr);
1753:
1754: /*
1755: *************************************************************************
1756: ** FUNCTION: PR_GetPeerName
1757: ** DESCRIPTION:
1758: ** Get name of the connected peer. Return the network address for the
1759: ** connected peer socket.
1760: **
1761: ** INPUTS:
1762: ** PRFileDesc *fd
1763: ** Points to a PRFileDesc object representing the connected peer.
1764: ** OUTPUTS:
1765: ** PRNetAddr *addr
1766: ** Returns the address of the connected peer in its own communication
1767: ** space.
1768: ** RETURN: PRStatus
1769: ** Upon successful completion, PR_GetPeerName returns PR_SUCCESS.
1770: ** Otherwise, it returns PR_FAILURE. Further failure information can
1771: ** be obtained by calling PR_GetError().
1772: **************************************************************************
1773: **/
1774: NSPR_API(PRStatus) PR_GetPeerName(PRFileDesc *fd, PRNetAddr *addr);
1775:
1776: NSPR_API(PRStatus) PR_GetSocketOption(
1777: PRFileDesc *fd, PRSocketOptionData *data);
1778:
1779: NSPR_API(PRStatus) PR_SetSocketOption(
1780: PRFileDesc *fd, const PRSocketOptionData *data);
1781:
1782: /*
1783: *********************************************************************
1784: *
1785: * File descriptor inheritance
1786: *
1787: *********************************************************************
1788: */
1789:
1790: /*
1791: ************************************************************************
1792: * FUNCTION: PR_SetFDInheritable
1793: * DESCRIPTION:
1794: * Set the inheritance attribute of a file descriptor.
1795: *
1796: * INPUTS:
1797: * PRFileDesc *fd
1798: * Points to a PRFileDesc object.
1799: * PRBool inheritable
1800: * If PR_TRUE, the file descriptor fd is set to be inheritable
1801: * by a child process. If PR_FALSE, the file descriptor is set
1802: * to be not inheritable by a child process.
1803: * RETURN: PRStatus
1804: * Upon successful completion, PR_SetFDInheritable returns PR_SUCCESS.
1805: * Otherwise, it returns PR_FAILURE. Further failure information can
1806: * be obtained by calling PR_GetError().
1807: *************************************************************************
1808: */
1809: NSPR_API(PRStatus) PR_SetFDInheritable(
1810: PRFileDesc *fd,
1811: PRBool inheritable);
1812:
1813: /*
1814: ************************************************************************
1815: * FUNCTION: PR_GetInheritedFD
1816: * DESCRIPTION:
1817: * Get an inherited file descriptor with the specified name.
1818: *
1819: * INPUTS:
1820: * const char *name
1821: * The name of the inherited file descriptor.
1822: * RETURN: PRFileDesc *
1823: * Upon successful completion, PR_GetInheritedFD returns the
1824: * inherited file descriptor with the specified name. Otherwise,
1825: * it returns NULL. Further failure information can be obtained
1826: * by calling PR_GetError().
1827: *************************************************************************
1828: */
1829: NSPR_API(PRFileDesc *) PR_GetInheritedFD(const char *name);
1830:
1831: /*
1832: *********************************************************************
1833: *
1834: * Memory-mapped files
1835: *
1836: *********************************************************************
1837: */
1838:
1839: typedef struct PRFileMap PRFileMap;
1840:
1841: /*
1842: * protection options for read and write accesses of a file mapping
1843: */
1844: typedef enum PRFileMapProtect {
1845: PR_PROT_READONLY, /* read only */
1846: PR_PROT_READWRITE, /* readable, and write is shared */
1847: PR_PROT_WRITECOPY /* readable, and write is private (copy-on-write) */
1848: } PRFileMapProtect;
1849:
1850: NSPR_API(PRFileMap *) PR_CreateFileMap(
1851: PRFileDesc *fd,
1852: PRInt64 size,
1853: PRFileMapProtect prot);
1854:
1855: /*
1856: * return the alignment (in bytes) of the offset argument to PR_MemMap
1857: */
1858: NSPR_API(PRInt32) PR_GetMemMapAlignment(void);
1859:
1860: NSPR_API(void *) PR_MemMap(
1861: PRFileMap *fmap,
1862: PROffset64 offset, /* must be aligned and sized according to the
1863: * return value of PR_GetMemMapAlignment() */
1864: PRUint32 len);
1865:
1866: NSPR_API(PRStatus) PR_MemUnmap(void *addr, PRUint32 len);
1867:
1868: NSPR_API(PRStatus) PR_CloseFileMap(PRFileMap *fmap);
1869:
1870: /*
1871: ******************************************************************
1872: *
1873: * Interprocess communication
1874: *
1875: ******************************************************************
1876: */
1877:
1878: /*
1879: * Creates an anonymous pipe and returns file descriptors for the
1880: * read and write ends of the pipe.
1881: */
1882:
1883: NSPR_API(PRStatus) PR_CreatePipe(
1884: PRFileDesc **readPipe,
1885: PRFileDesc **writePipe
1886: );
1887:
1888: /************************************************************************/
1889: /************** The following definitions are for poll ******************/
1890: /************************************************************************/
1891:
1892: struct PRPollDesc {
1893: PRFileDesc* fd;
1894: PRInt16 in_flags;
1895: PRInt16 out_flags;
1896: };
1897:
1898: /*
1899: ** Bit values for PRPollDesc.in_flags or PRPollDesc.out_flags. Binary-or
1900: ** these together to produce the desired poll request.
1901: */
1902:
1903: #if defined(_PR_POLL_BACKCOMPAT)
1904:
1905: #include <poll.h>
1906: #define PR_POLL_READ POLLIN
1907: #define PR_POLL_WRITE POLLOUT
1908: #define PR_POLL_EXCEPT POLLPRI
1909: #define PR_POLL_ERR POLLERR /* only in out_flags */
1910: #define PR_POLL_NVAL POLLNVAL /* only in out_flags when fd is bad */
1911: #define PR_POLL_HUP POLLHUP /* only in out_flags */
1912:
1913: #else /* _PR_POLL_BACKCOMPAT */
1914:
1915: #define PR_POLL_READ 0x1
1916: #define PR_POLL_WRITE 0x2
1917: #define PR_POLL_EXCEPT 0x4
1918: #define PR_POLL_ERR 0x8 /* only in out_flags */
1919: #define PR_POLL_NVAL 0x10 /* only in out_flags when fd is bad */
1920: #define PR_POLL_HUP 0x20 /* only in out_flags */
1921:
1922: #endif /* _PR_POLL_BACKCOMPAT */
1923:
1924: /*
1925: *************************************************************************
1926: ** FUNCTION: PR_Poll
1927: ** DESCRIPTION:
1928: **
1929: ** The call returns as soon as I/O is ready on one or more of the underlying
1930: ** socket objects. A count of the number of ready descriptors is
1931: ** returned unless a timeout occurs in which case zero is returned.
1932: **
1933: ** PRPollDesc.fd should be set to a pointer to a PRFileDesc object
1934: ** representing a socket. This field can be set to NULL to indicate to
1935: ** PR_Poll that this PRFileDesc object should be ignored.
1936: ** PRPollDesc.in_flags should be set to the desired request
1937: ** (read/write/except or some combination). Upon successful return from
1938: ** this call PRPollDesc.out_flags will be set to indicate what kind of
1939: ** i/o can be performed on the respective descriptor. PR_Poll() uses the
1940: ** out_flags fields as scratch variables during the call. If PR_Poll()
1941: ** returns 0 or -1, the out_flags fields do not contain meaningful values
1942: ** and must not be used.
1943: **
1944: ** INPUTS:
1945: ** PRPollDesc *pds A pointer to an array of PRPollDesc
1946: **
1947: ** PRIntn npds The number of elements in the array
1948: ** If this argument is zero PR_Poll is
1949: ** equivalent to a PR_Sleep(timeout).
1950: **
1951: ** PRIntervalTime timeout Amount of time the call will block waiting
1952: ** for I/O to become ready. If this time expires
1953: ** w/o any I/O becoming ready, the result will
1954: ** be zero.
1955: **
1956: ** OUTPUTS: None
1957: ** RETURN:
1958: ** PRInt32 Number of PRPollDesc's with events or zero
1959: ** if the function timed out or -1 on failure.
1960: ** The reason for the failure is obtained by
1961: ** calling PR_GetError().
1962: **************************************************************************
1963: */
1964: NSPR_API(PRInt32) PR_Poll(
1965: PRPollDesc *pds, PRIntn npds, PRIntervalTime timeout);
1966:
1967: /*
1968: **************************************************************************
1969: **
1970: ** Pollable events
1971: **
1972: ** A pollable event is a special kind of file descriptor.
1973: ** The only I/O operation you can perform on a pollable event
1974: ** is to poll it with the PR_POLL_READ flag. You can't
1975: ** read from or write to a pollable event.
1976: **
1977: ** The purpose of a pollable event is to combine event waiting
1978: ** with I/O waiting in a single PR_Poll call. Pollable events
1979: ** are implemented using a pipe or a pair of TCP sockets
1980: ** connected via the loopback address, therefore setting and
1981: ** waiting for pollable events are expensive operating system
1982: ** calls. Do not use pollable events for general thread
1983: ** synchronization. Use condition variables instead.
1984: **
1985: ** A pollable event has two states: set and unset. Events
1986: ** are not queued, so there is no notion of an event count.
1987: ** A pollable event is either set or unset.
1988: **
1989: ** A new pollable event is created by a PR_NewPollableEvent
1990: ** call and is initially in the unset state.
1991: **
1992: ** PR_WaitForPollableEvent blocks the calling thread until
1993: ** the pollable event is set, and then it atomically unsets
1994: ** the pollable event before it returns.
1995: **
1996: ** To set a pollable event, call PR_SetPollableEvent.
1997: **
1998: ** One can call PR_Poll with the PR_POLL_READ flag on a pollable
1999: ** event. When the pollable event is set, PR_Poll returns with
2000: ** the PR_POLL_READ flag set in the out_flags.
2001: **
2002: ** To close a pollable event, call PR_DestroyPollableEvent
2003: ** (not PR_Close).
2004: **
2005: **************************************************************************
2006: */
2007:
2008: NSPR_API(PRFileDesc *) PR_NewPollableEvent(void);
2009:
2010: NSPR_API(PRStatus) PR_DestroyPollableEvent(PRFileDesc *event);
2011:
2012: NSPR_API(PRStatus) PR_SetPollableEvent(PRFileDesc *event);
2013:
2014: NSPR_API(PRStatus) PR_WaitForPollableEvent(PRFileDesc *event);
2015:
2016: PR_END_EXTERN_C
2017:
2018: #endif /* prio_h___ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.