1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 188de7cf6bff36093dda9e25a1ab3718720cb54906Elliott Hughespackage java.net; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20b5bde2fd72189192b52e726a2d606d70c3c8a34bElliott Hughesimport java.nio.ByteOrder; 212a6f23ff8690ac2f025588a360547ce96cde0943Elliott Hughesimport java.nio.charset.StandardCharsets; 22f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughesimport libcore.io.Memory; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectclass Socks4Message { 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int COMMAND_CONNECT = 1; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int COMMAND_BIND = 2; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int RETURN_SUCCESS = 90; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int RETURN_FAILURE = 91; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int RETURN_CANNOT_CONNECT_TO_IDENTD = 92; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int RETURN_DIFFERENT_USER_IDS = 93; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int REPLY_LENGTH = 8; 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int INDEX_VERSION = 0; 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final int SOCKS_VERSION = 4; 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final int INDEX_COMMAND = 1; 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final int INDEX_PORT = 2; 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final int INDEX_IP = 4; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final int INDEX_USER_ID = 8; 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final int BUFFER_LENGTH = 256; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final int MAX_USER_ID_LENGTH = BUFFER_LENGTH - INDEX_USER_ID; 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected byte[] buffer; 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Socks4Message() { 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer = new byte[BUFFER_LENGTH]; 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setVersionNumber(SOCKS_VERSION); 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Get the request's command or result. 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getCommandOrResult() { 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return buffer[INDEX_COMMAND]; 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Set the request's command or result. 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setCommandOrResult(int command) { 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer[INDEX_COMMAND] = (byte) command; 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 773bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes * Returns the request's port number. 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getPort() { 80f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes return Memory.peekShort(buffer, INDEX_PORT, ByteOrder.BIG_ENDIAN); 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Set the request's port number. 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setPort(int port) { 87f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes Memory.pokeShort(buffer, INDEX_PORT, (short) port, ByteOrder.BIG_ENDIAN); 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 903bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes /** 913bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes * Returns the IP address of the request as an integer. 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getIP() { 94f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes return Memory.peekInt(buffer, INDEX_IP, ByteOrder.BIG_ENDIAN); 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Set the IP address. This expects an array of four bytes in host order. 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setIP(byte[] ip) { 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer[INDEX_IP] = ip[0]; 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer[INDEX_IP + 1] = ip[1]; 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer[INDEX_IP + 2] = ip[2]; 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer[INDEX_IP + 3] = ip[3]; 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1083bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes * Returns the user id for authentication. 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getUserId() { 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getString(INDEX_USER_ID, MAX_USER_ID_LENGTH); 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Set the user id for authentication. 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setUserId(String id) { 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setString(INDEX_USER_ID, MAX_USER_ID_LENGTH, id); 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StringBuilder buf = new StringBuilder(50); 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.append("Version: "); 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.append(Integer.toHexString(getVersionNumber())); 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.append(" Command: "); 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.append(Integer.toHexString(getCommandOrResult())); 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.append(" Port: "); 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.append(getPort()); 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.append(" IP: "); 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.append(Integer.toHexString(getIP())); 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.append(" User ID: "); 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.append(getUserId()); 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return buf.toString(); 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1383bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes * Returns the total number of bytes used for the request. This method 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * searches for the end of the user id, then searches for the end of the 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * password and returns the final index as the requests length. 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getLength() { 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int index = 0; 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Look for the end of the user id. 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (index = INDEX_USER_ID; buffer[index] != 0; index++) { 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Finds the end of the user id by searching for the null 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * termination of the user id string. 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Increment the index to include the NULL character in the length; 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project index++; 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return index; 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1593bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes * Returns an error string corresponding to the given error value. 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getErrorString(int error) { 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project switch (error) { 163b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes case RETURN_FAILURE: 164b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes return "Failure to connect to SOCKS server"; 165b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes case RETURN_CANNOT_CONNECT_TO_IDENTD: 166b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes return "Unable to connect to identd to verify user"; 167b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes case RETURN_DIFFERENT_USER_IDS: 168b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes return "Failure - user ids do not match"; 169b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes default: 170b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes return "Success"; 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1753bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes * Returns the message's byte buffer. 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte[] getBytes() { 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return buffer; 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Get a String from the buffer at the offset given. The method reads until 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * it encounters a null value or reaches the maxLength given. 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String getString(int offset, int maxLength) { 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int index = offset; 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int lastIndex = index + maxLength; 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (index < lastIndex && (buffer[index] != 0)) { 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project index++; 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1912a6f23ff8690ac2f025588a360547ce96cde0943Elliott Hughes return new String(buffer, offset, index - offset, StandardCharsets.ISO_8859_1); 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1953bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes * Returns the SOCKS version number. Should always be 4. 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int getVersionNumber() { 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return buffer[INDEX_VERSION]; 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Put a string into the buffer at the offset given. 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void setString(int offset, int maxLength, String theString) { 2052a6f23ff8690ac2f025588a360547ce96cde0943Elliott Hughes byte[] stringBytes = theString.getBytes(StandardCharsets.ISO_8859_1); 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int length = Math.min(stringBytes.length, maxLength); 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(stringBytes, 0, buffer, offset, length); 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer[offset + length] = 0; 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Set the SOCKS version number. This should always be 4. 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void setVersionNumber(int number) { 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer[INDEX_VERSION] = (byte) number; 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 218