| | 95 | int RegKeyReadInt(struct RegKeySet* keySet, char* name, int* ret) |
| | 96 | { |
| | 97 | int type, length=sizeof(int); |
| | 98 | |
| | 99 | if (RegKeySetReadKey(keySet, name, &type, ret, &length) < 0) |
| | 100 | return -1; |
| | 101 | |
| | 102 | if (type != REG_KEY_TYPE_INT) |
| | 103 | return -1; |
| | 104 | |
| | 105 | return 0; |
| | 106 | } |
| | 107 | |
| | 108 | int RegKeyReadString(struct RegKeySet* keySet, char* name, char** data, unsigned long* length) |
| | 109 | { |
| | 110 | int type; |
| | 111 | unsigned long rLength=2048; |
| | 112 | |
| | 113 | /* TODO: Check return to see if buf needs to be expanded? */ |
| | 114 | |
| | 115 | if (!*data) |
| | 116 | *data=malloc(2048); |
| | 117 | |
| | 118 | if (length) |
| | 119 | rLength=*length; |
| | 120 | |
| | 121 | if (RegKeySetReadKey(keySet, name, &type, *data, &rLength) < 0) |
| | 122 | return -1; |
| | 123 | |
| | 124 | if (type != REG_KEY_TYPE_STR) |
| | 125 | return -1; |
| | 126 | |
| | 127 | if (length) |
| | 128 | *length=rLength; |
| | 129 | |
| | 130 | return 0; |
| | 131 | } |
| | 132 | |
| 136 | | return 0; |
| 137 | | } |
| | 178 | if (type) |
| | 179 | *type=reply.type; |
| | 180 | |
| | 181 | return 0; |
| | 182 | } |
| | 183 | |
| | 184 | int RegKeySetIterInit(struct RegKeySet* keySet, struct RegKeySetIter* iter) |
| | 185 | { |
| | 186 | iter->keySet=keySet; |
| | 187 | iter->bufSize=4096; |
| | 188 | iter->buf=(char*)malloc(4096); |
| | 189 | iter->next=0; |
| | 190 | iter->index=0; |
| | 191 | iter->size=0; |
| | 192 | |
| | 193 | return 0; |
| | 194 | } |
| | 195 | |
| | 196 | char* RegKeySetIterNext(struct RegKeySetIter* iter) |
| | 197 | { |
| | 198 | struct RegEnumSetPacket |
| | 199 | { |
| | 200 | int type; |
| | 201 | int length; |
| | 202 | unsigned long handleId; |
| | 203 | unsigned long index; |
| | 204 | unsigned long size; |
| | 205 | }; |
| | 206 | |
| | 207 | char* ret; |
| | 208 | int bytes; |
| | 209 | int sockFd; |
| | 210 | |
| | 211 | sockFd=iter->keySet->registry->sockFd; |
| | 212 | |
| | 213 | if (!iter) |
| | 214 | return NULL; |
| | 215 | |
| | 216 | if (iter->size <= iter->next) |
| | 217 | iter->size=iter->next=0; |
| | 218 | |
| | 219 | if (iter->size == 0) |
| | 220 | { |
| | 221 | /* Get the next batch of directory entries. */ |
| | 222 | struct RegEnumSetPacket packet; |
| | 223 | packet.type=REG_PACKET_ENUM_KEYSET; |
| | 224 | packet.length=sizeof(struct RegEnumSetPacket); |
| | 225 | packet.handleId=iter->keySet->handleId; |
| | 226 | packet.index=iter->index; |
| | 227 | packet.size=iter->bufSize; |
| | 228 | |
| | 229 | bytes=NetSocketSend(sockFd, &packet, packet.length, 0); |
| | 230 | |
| | 231 | if (bytes <= 0) |
| | 232 | return NULL; |
| | 233 | |
| | 234 | bytes=NetSocketReceive(sockFd, iter->buf, iter->bufSize, 0); |
| | 235 | iter->size=bytes; |
| | 236 | |
| | 237 | if (bytes <= 0) |
| | 238 | return NULL; |
| | 239 | |
| | 240 | printf("Got %d bytes\n", bytes); |
| | 241 | } |
| | 242 | |
| | 243 | ret=iter->buf+iter->next; |
| | 244 | iter->next+=strlen(ret)+1; |
| | 245 | iter->index++; |
| | 246 | |
| | 247 | return ret; |
| | 248 | } |
| | 249 | |
| | 250 | int RegKeySetIterClose(struct RegKeySetIter* iter) |
| | 251 | { |
| | 252 | if (!iter) |
| | 253 | return -1; |
| | 254 | |
| | 255 | free(iter->buf); |
| | 256 | |
| | 257 | return 0; |
| | 258 | } |
| | 259 | |
| | 260 | int RegEntryGetType(struct RegKeySet* keySet, char* name, int* ret) |
| | 261 | { |
| | 262 | struct RegReadKeyPacket packet; |
| | 263 | int sockFd, err; |
| | 264 | |
| | 265 | sockFd=keySet->registry->sockFd; |
| | 266 | |
| | 267 | packet.type=REG_PACKET_GET_ENT_TYPE; |
| | 268 | packet.length=sizeof(struct RegReadKeyPacket); |
| | 269 | packet.handleId=keySet->handleId; |
| | 270 | strncpy(packet.name, name, REG_NAME_LENGTH); |
| | 271 | |
| | 272 | err=NetSocketSend(sockFd, &packet, sizeof(struct RegReadKeyPacket), 0); |
| | 273 | |
| | 274 | if (err < 0) |
| | 275 | return err; |
| | 276 | |
| | 277 | NetSocketReceive(sockFd, ret, 4, 0); |
| | 278 | |
| | 279 | return 0; |
| | 280 | } |