forked from cellularmitosis/ADC-reference-library-2009-july
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlisting1.html
executable file
·491 lines (402 loc) · 16.1 KB
/
listing1.html
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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<!-- BEGIN META TAG INFO -->
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="home" href="http://developer.apple.com/">
<link rel="find" href="http://developer.apple.com/search/">
<link rel="stylesheet" type="text/css" href="../../documentation/css/adcstyle.css" title="fonts">
<script language="JavaScript" src="../../documentation/js/adc.js" type="text/javascript"></script>
<!-- END META TAG INFO -->
<!-- BEGIN TITLE -->
<title>GetSetOptions - /GetSetOptions.c</title>
<!-- END TITLE -->
<script language="JavaScript">
function JumpToNewPage() {
window.location=document.scpopupmenu.gotop.value;
return true;
}
</script>
</head>
<!-- BEGIN BODY OPEN -->
<body>
<!--END BODY OPEN -->
<!-- START CENTER OPEN -->
<center>
<!-- END CENTER OPEN -->
<!-- BEGIN LOGO AND SEARCH -->
<!--#include virtual="/includes/adcnavbar"-->
<!-- END LOGO AND SEARCH -->
<!-- START BREADCRUMB -->
<div id="breadcrumb">
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr>
<td scope="row"><img width="340" height="10" src="images/1dot.gif" alt=""></td>
<td><img width="340" height="10" src="images/1dot.gif" alt=""></td>
</tr>
<tr valign="middle">
<td align="left" colspan="2">
<a href="http://developer.apple.com/">ADC Home</a> > <a href="../../referencelibrary/index.html">Reference Library</a> > <a href="../../samplecode/index.html">Sample Code</a> > <a href="../../samplecode/Carbon/index.html">Carbon</a> > <a href="../../samplecode/Carbon/idxNetworking-date.html">Networking</a> > <A HREF="javascript:location.replace('index.html');">GetSetOptions</A> >
</td>
</tr>
<tr>
<td colspan="2" scope="row"><img width="680" height="35" src="images/1dot.gif" alt=""></td>
</tr>
</table>
</div>
<!-- END BREADCRUMB -->
<!-- START MAIN CONTENT -->
<!-- START TITLE GRAPHIC AND INTRO-->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr align="left" valign="top">
<td><h1><div id="pagehead">GetSetOptions</div></h1></td>
</tr>
</table>
<!-- END TITLE GRAPHIC AND INTRO -->
<!-- START WIDE COLUMN -->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr align="left" valign="top">
<td id="scdetails">
<h2>/GetSetOptions.c</h2>
<form name="scpopupmenu" onSubmit="return false;" method=post>
<p><strong>View Source Code:</strong>
<select name="gotop" onChange="JumpToNewPage();" style="width:340px"><option selected value="ingnore">Select File</option>
<option value="listing1.html">/GetSetOptions.c</option>
<option value="listing2.html">/Read Me About GetSetOptions.txt</option></select>
</p>
</form>
<p><strong><a href="GetSetOptions.zip">Download Sample</a></strong> (“GetSetOptions.zip”, 41.1K)<BR>
<strong><a href="GetSetOptions.dmg">Download Sample</a></strong> (“GetSetOptions.dmg”, 102.2K)</p>
<!--
<p><strong><a href="#">Download Sample</a></strong> (“filename.sit”, 500K)</p>
-->
</td>
</tr>
<tr>
<td scope="row"><img width="680" height="10" src="images/1dot.gif" alt=""><br>
<img height="1" width="680" src="images/1dot_919699.gif" alt=""><br>
<img width="680" height="20" src="images/1dot.gif" alt=""></td>
</tr>
<tr>
<td scope="row">
<!--googleon: index -->
<pre class="sourcecodebox">/* File: GetSetOptions.c Contains: Sample for getting and setting options using the various option management routines. Written by: Quinn "The Eskimo!" Copyright: Copyright © 1997-2001 by Apple Computer, Inc., All Rights Reserved. You may incorporate this Apple sample source code into your program(s) without restriction. This Apple sample source code has been provided "AS IS" and the responsibility for its operation is yours. You are not permitted to redistribute this Apple sample source code as "Apple sample source code" after having made changes. If you're going to re-distribute the source, we require that you make it clear in the source that the code was descended from Apple sample source code, but that you've made changes. Change History (most recent first): 2/18/2001 Chad Jones Updated for Codewarrior IDE 4.1 and Carbonized for OSX 7/22/1999 Karl Groethe Updated for Metrowerks Codewarror Pro 2.1 *//////////////////////////////////////////////////////////////////////// Need to include to be carbonized #if defined(__MWERKS__)# include <carbon.h># include <OpenTransport.h># include <OpenTptInternet.h># include <OpenTptSerial.h># include <SIOUX.h>#else# include <CoreServices/CoreServices.h>#endif# include <stdio.h>/////////////////////////////////////////////////////////////////////// This MoreAssertQ is used in replacement for OTAssert under carbon because// OTAssert is not in carbon.static void MoreAssertQ(Boolean mustBeTrue){ if ( ! mustBeTrue ) { DebugStr("\pGetSetOptions: Assertion failure."); }}/////////////////////////////////////////////////////////////////////static OTResult SetFourByteOption(EndpointRef ep, OTXTILevel level, OTXTIName name, UInt32 value) // level and name must denote a four byte option that is // appropriate for the endpoint ep. This routine sets the // option to value. ep is assumed to be in synchronous // mode. // // If all goes well, the result is noErr. If an error // occurs, the result is negative. If the option could not // be negotiated, a positive result being one of (T_FAILURE, // T_PARTSUCCESS, T_READONLY, T_NOTSUPPORT) is returned{ OTResult err; TOption option; TOptMgmt request; TOptMgmt result; // Set up the option buffer to reflect the specific option // and value we want to set. We use a TOption structure // to represent the option buffer. TOption is specifically // defined to allow easy construction of 4 byte options. // If you want to negotiate different size options, or // multiple options in a single call, then constructing // the option buffer is a little trickier option.len = kOTFourByteOptionSize; option.level = level; option.name = name; option.status = 0; option.value[0] = value; // Set up the request for OTOptionManagement to point // to the option buffer we just filled out, and tell // it that we want to negotiate (ie set) the option. request.opt.buf = (UInt8 *) &option; request.opt.len = sizeof(option); request.flags = T_NEGOTIATE; // Set up the reply for OTOptionManagement. This is where // OTOptionManagement puts the result of the negotiation. result.opt.buf = (UInt8 *) &option; result.opt.maxlen = sizeof(option); // Call OTOptionManagement and then check that the value // was negotiated successfully. Any value other than // T_SUCCESS is reported via the error result. err = OTOptionManagement(ep, &request, &result); if (err == noErr) { if (option.status != T_SUCCESS) { err = option.status; } } return (err);}/////////////////////////////////////////////////////////////////////static OTResult GetFourByteOption(EndpointRef ep, OTXTILevel level, OTXTIName name, UInt32 *value) // level and name must denote a four byte option that is // appropriate for the endpoint ep. This routine gets the // current option setting and puts it in the the variable // pointed to by value. ep is assumed to be in synchronous // mode. // // If all goes well, the result is noErr. If an error // occurs, the result is negative. If the option could not // be read, a positive result being one of (T_FAILURE, // T_PARTSUCCESS, T_NOTSUPPORT) is returned{ OTResult err; TOption option; TOptMgmt request; TOptMgmt result; // Set up the option buffer to reflect the specific option // and value we want to set. We use a TOption structure // to represent the option buffer. TOption is specifically // defined to allow easy construction of 4 byte options. // If you want to negotiate different size options, or // multiple options in a single call, then constructing // the option buffer is a little trickier option.len = kOTFourByteOptionSize; option.level = level; option.name = name; option.status = 0; option.value[0] = 0; // Ignored because we're getting the value. // Set up the request for OTOptionManagement to point // to the option buffer we just filled out, and tell // it that we want to get the current value of the option. request.opt.buf = (UInt8 *) &option; request.opt.len = sizeof(option); request.flags = T_CURRENT; // Set up the reply for OTOptionManagement. This is where // OTOptionManagement puts the result of the negotiation. result.opt.buf = (UInt8 *) &option; result.opt.maxlen = sizeof(option); // Call OTOptionManagement and then check that the value // was read successfully. Any status other than // T_SUCCESS or T_READONLY is reported via the error // result. err = OTOptionManagement(ep, &request, &result); if (err == noErr) { switch (option.status) { case T_SUCCESS: case T_READONLY: *value = option.value[0]; break; default: err = option.status; break; } } return (err);}/////////////////////////////////////////////////////////////////////static OSStatus PrintOptionBuffer(const TNetbuf *optionBuffer) // Print a summary of the optionBuffer to stdout. // Basically the call enumerates the option buffer using // OTNextOption, and prints the level, name, size and status // of each of the options in the buffer.{ OSStatus err; TOption *currentOption; currentOption = nil; do { err = OTNextOption(optionBuffer->buf, optionBuffer->len, &currentOption); if (err == noErr && currentOption != nil) { printf("Level = $%08lx, Name = $%08lx, Data Length = %ld, Status = $%08lx\n", currentOption->level, currentOption->name, currentOption->len - kOTOptionHeaderSize, currentOption->status); fflush(stdout); } } while (err == noErr && currentOption != nil); return (err);}/////////////////////////////////////////////////////////////////////static OSStatus PrintAllOptionsAtLevel(EndpointRef ep, OTXTILevel level) // Gets all of the options for the endpoint ep at the specified // level and prints a summary of them to stdout.{ OSStatus err; TEndpointInfo epInfo; TOptionHeader requestOption; void *resultOptionBuffer; TOptMgmt request; TOptMgmt result; resultOptionBuffer = nil; // First call OTGetEndpointInfo to find out the maximum // size of the options for this type of endpoint and then // allocate that size buffer to hold the resulting options. err = OTGetEndpointInfo(ep, &epInfo); if (err == noErr) { resultOptionBuffer = OTAllocMemInContext(epInfo.options,nil); if (resultOptionBuffer == nil) { err = kENOMEMErr; } } // Call OTOptionManagement to get the current value (T_CURRENT) // of all of the options (ie T_ALLOPT) of the specified level. // The resulting options go into resultOptionBuffer, which we // have just allocated. if (err == noErr) { requestOption.len = kOTOptionHeaderSize; requestOption.level = level; requestOption.name = T_ALLOPT; requestOption.status = 0; request.opt.buf = (UInt8 *) &requestOption; request.opt.len = sizeof(requestOption); request.flags = T_CURRENT; result.opt.buf = resultOptionBuffer; result.opt.maxlen = epInfo.options; err = OTOptionManagement(ep, &request, &result); } // Now that we have the options, print them to stdout. if (err == noErr) { err = PrintOptionBuffer(&result.opt); printf("\n"); fflush(stdout); } // Clean up. if (resultOptionBuffer != nil) { OTFreeMem(resultOptionBuffer); } return (err);}/////////////////////////////////////////////////////////////////////int main(void) // A simple main line that demonstrates the use of the various // functions defined above. The basic idea is to create // an endpoint, get the value of the kIP_REUSEADDR option, then // change it to true, and read it back to verify that the change // worked. We then do a few other interesting things with // various miscellaneous options API routines.{ OSStatus err; OSStatus junk; EndpointRef ep; UInt32 value; #if defined(__MWERKS__) SIOUXSettings.autocloseonquit = FALSE; // don't close the SIOUX window on program termination SIOUXSettings.asktosaveonclose = FALSE; // don't offer to save on a close #endif err = InitOpenTransportInContext(kInitOTForApplicationMask, nil); if (err == noErr) { ep = OTOpenEndpointInContext(OTCreateConfiguration(kTCPName), 0, nil, &err,nil); if (err == noErr) { printf("\nGetting and Setting IP_REUSEADDR.\n"); fflush(stdout); err = GetFourByteOption(ep, INET_IP, kIP_REUSEADDR, &value); if (err == noErr) { printf("Default value = %ld\n", value); fflush(stdout); } if (err == noErr) { err = SetFourByteOption(ep, INET_IP, kIP_REUSEADDR, true); } if (err == noErr) { err = GetFourByteOption(ep, INET_IP, kIP_REUSEADDR, &value); if (err == noErr) { printf("New value = %ld\n", value); fflush(stdout); } } if (err == noErr) { printf("\nPrinting Options Piecemeal at Level INET_IP.\n"); err = PrintAllOptionsAtLevel(ep, INET_IP); fflush(stdout); } //If you used the pre-carbon sampes of this sample code you may be wondering where calls to //PrintOptionsForConfiguration and BuildAndPrintOptions are. //In carbon and OSX these calls have no meaning because there is no concept of options as //strings in OSX or carbon. Thus they have been removed completely from this sample code. junk = OTCloseProvider(ep); MoreAssertQ(junk == noErr); //False if: Closing the endpoint failed. } CloseOpenTransportInContext(nil); } if (err == noErr) { printf("Success.\n"); } else { printf("Failed with error %ld.\n", err); } fflush(stdout); return(0);}</pre>
<!--googleoff: index -->
</td>
</tr>
</table>
<!-- END WIDE COLUMN -->
<!-- END MAIN CONTENT -->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><div style="width: 100%; height: 1px; background-color: #919699; margin-top: 5px; margin-bottom: 15px"></div></td>
</tr>
<tr>
<td align="center"><br/>
<table border="0" cellpadding="0" cellspacing="0" class="graybox">
<tr>
<th>Did this document help you?</th>
</tr>
<tr>
<td>
<div style="margin-bottom: 8px"><a href="http://developer.apple.com/feedback/?v=1&url=/samplecode/GetSetOptions/listing1.html%3Fid%3DDTS10000699-1.0&media=dvd" target=_new>Yes</a>: Tell us what works for you.</div>
<div style="margin-bottom: 8px"><a href="http://developer.apple.com/feedback/?v=2&url=/samplecode/GetSetOptions/listing1.html%3Fid%3DDTS10000699-1.0&media=dvd" target=_new>It’s good, but:</a> Report typos, inaccuracies, and so forth.</div>
<div><a href="http://developer.apple.com/feedback/?v=3&url=/samplecode/GetSetOptions/listing1.html%3Fid%3DDTS10000699-1.0&media=dvd" target=_new>It wasn’t helpful</a>: Tell us what would have helped.</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!-- START BOTTOM APPLE NAVIGATION -->
<!--#include virtual="/includes/footer"-->
<!-- END BOTTOM APPLE NAVIGATION -->
<!-- START CENTER CLOSE -->
</center>
<!-- END CENTER CLOSE -->
</body>
</html>