/* Read data */
do {
- n = read(state->sock, state->read_buf_len + (char *)&state->request,
- sizeof(state->request) - state->read_buf_len);
+
+ n = read(state->sock, state->read_buf_len +
+ (char *)&state->request,
+ sizeof(state->request) - state->read_buf_len);
+
} while (n == -1 && errno == EINTR);
- DEBUG(10,("client_read: read %d bytes. Need %d more for a full request.\n", n,
- sizeof(state->request) - n - state->read_buf_len ));
+ DEBUG(10,("client_read: read %d bytes. Need %d more for a full request.\n", n, sizeof(state->request) - n - state->read_buf_len ));
/* Read failed, kill client */
client_read(state);
-#if 0
- /* JRA - currently there's no length field in the request... */
/*
* If we have the start of a
* packet, then check the
* Mock Swedish.
*/
- if (state->read_buf_len >= sizeof(int)
- && *(int *) state->buf != sizeof(state->request)) {
-
- struct winbindd_cli_state *rem_state = state;
-
+ if (state->read_buf_len >= sizeof(uint32)
+ && *(uint32 *) &state->request != sizeof(state->request)) {
DEBUG(0,("process_loop: Invalid request size (%d) send, should be (%d)\n",
- *(int *) rem_state->buf, sizeof(rem_state->request) ));
+ *(uint32 *) &state->request, sizeof(state->request)));
- state = state_next;
- remove_client(rem_state);
- continue;
+ remove_client(state);
+ break;
}
-#endif
/* A request packet might be
complete */
#define WINBINDD_DOMAIN_ENV "WINBINDD_DOMAIN" /* Environment variables */
#define WINBINDD_DONT_ENV "_NO_WINBINDD"
-/* Socket commands */
-
/* Update this when you change the interface. */
-#define WINBIND_INTERFACE_VERSION 1
+
+#define WINBIND_INTERFACE_VERSION 2
+
+/* Socket commands */
enum winbindd_cmd {
+ WINBINDD_INTERFACE_VERSION, /* Always a well known value */
+
/* Get users and groups */
WINBINDD_GETPWNAM,
WINBINDD_CHECK_MACHACC, /* Check machine account pw works */
WINBINDD_PING, /* Just tell me winbind is running */
WINBINDD_INFO, /* Various bit of info. Currently just tidbits */
- WINBINDD_INTERFACE_VERSION, /* *TRY* to keep this in the same place... */
/* Placeholder for end of cmd list */
/* Winbind request structure */
struct winbindd_request {
+ uint32 length;
enum winbindd_cmd cmd; /* Winbindd command to execute */
pid_t pid; /* pid of calling process */
/* Header information */
- int length; /* Length of response */
+ uint32 length; /* Length of response */
enum winbindd_result result; /* Result code */
/* Fixed length return data */