afpfs-ng-mac/patches/06-boxee3.patch

142 lines
4.3 KiB
Diff

--- afpfs-ng-0.8.1/lib/dsi.c 2011-08-26 17:27:16.000000000 +0200
+++ afpfs-ng-0.8.1/lib/dsi.c 2011-08-26 21:33:33.000000000 +0200
@@ -64,7 +64,7 @@
rx.size=0;
dsi_setup_header(server,&header,DSI_DSIGetStatus);
/* We're intentionally ignoring the results */
- ret=dsi_send(server,(char *) &header,sizeof(struct dsi_header),20,
+ ret=dsi_send(server,(char *) &header,sizeof(struct dsi_header),60,
0,(void *) &rx);
free(rx.data);
@@ -197,6 +197,7 @@
new_request->other=other;
new_request->wait=wait;
new_request->next=NULL;
+ new_request->done_waiting=0;
pthread_mutex_lock(&server->request_queue_mutex);
if (server->command_requests==NULL) {
@@ -208,7 +209,8 @@
server->stats.requests_pending++;
pthread_mutex_unlock(&server->request_queue_mutex);
- pthread_cond_init(&new_request->condition_cond,NULL);
+ pthread_cond_init(&new_request->waiting_cond,NULL);
+ pthread_mutex_init(&new_request->waiting_mutex,NULL);
if (server->connect_state==SERVER_STATE_DISCONNECTED) {
char mesg[1024];
@@ -240,16 +242,12 @@
server->stats.tx_bytes+=size;
pthread_mutex_unlock(&server->send_mutex);
- int tmpwait=new_request->wait;
#ifdef DEBUG_DSI
printf("=== Waiting for response for %d %s\n",
new_request->requestid,
afp_get_command_name(new_request->subcommand));
#endif
- if (tmpwait<0) {
-
- pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
- pthread_mutex_lock(&mutex);
+ if (new_request->wait<0) {
/* Wait forever */
#ifdef DEBUG_DSI
@@ -258,14 +256,17 @@
afp_get_command_name(new_request->subcommand));
#endif
- rc=pthread_cond_wait(
- &new_request->condition_cond,
- &mutex );
- pthread_mutex_unlock(&mutex);
-
- } else if (tmpwait>0) {
- pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
- pthread_mutex_lock(&mutex);
+ pthread_mutex_lock(&new_request->waiting_mutex);
+
+ if (new_request->done_waiting==0)
+ rc=pthread_cond_wait(
+ &new_request->waiting_cond,
+ &new_request->waiting_mutex );
+
+ pthread_mutex_unlock(&new_request->waiting_mutex);
+
+ } else if (new_request->wait>0) {
+ /* wait for new_request->wait seconds */
#ifdef DEBUG_DSI
printf("=== Waiting for %d %s, for %ds\n",
@@ -283,13 +284,15 @@
printf("=== Changing my mind, no longer waiting for %d\n",
new_request->requestid);
#endif
- pthread_mutex_unlock(&mutex);
goto skip;
}
- rc=pthread_cond_timedwait(
- &new_request->condition_cond,
- &mutex,&ts);
- pthread_mutex_unlock(&mutex);
+ pthread_mutex_lock(&new_request->waiting_mutex);
+ if (new_request->done_waiting==0)
+ rc=pthread_cond_timedwait(
+ &new_request->waiting_cond,
+ &new_request->waiting_mutex,&ts);
+ pthread_mutex_unlock(&new_request->waiting_mutex);
+
if (rc==ETIMEDOUT) {
/* FIXME: should handle this case properly */
#ifdef DEBUG_DSI
@@ -299,6 +302,7 @@
goto out;
}
} else {
+ /* Don't wait */
#ifdef DEBUG_DSI
printf("=== Skipping wait altogether for %d\n",new_request->requestid);
#endif
@@ -474,7 +478,7 @@
}
server->flags=ntohs(reply1->flags);
- p=(void *)((unsigned long) server->incoming_buffer + sizeof(*reply1));
+ p=(void *)((unsigned int) server->incoming_buffer + sizeof(*reply1));
p+=copy_from_pascal(server->server_name,p,AFP_SERVER_NAME_LEN)+1;
/* Now work our way through the variable bits */
@@ -577,6 +581,7 @@
unsigned char mins=0;
unsigned char checkmessage=0;
+ memset(mesg,0,AFP_LOGINMESG_LEN);
/* The logic here's undocumented. If we get an attention packet and
there's no flag, then go check the message. Also, go check the
@@ -757,7 +762,7 @@
printf("<<< read() of rest of AFP, %d bytes\n",amount_to_read);
#endif
ret = read(server->fd, (void *)
- (((unsigned long) server->incoming_buffer)+server->data_read),
+ (((unsigned int) server->incoming_buffer)+server->data_read),
amount_to_read);
if (ret<0) return -1;
if (ret==0) {
@@ -862,8 +867,11 @@
#ifdef DEBUG_DSI
printf("<<< Signalling %d, returning %d or %d\n",request->requestid,request->return_code,rc);
#endif
+ pthread_mutex_lock(&request->waiting_mutex);
request->wait=0;
- pthread_cond_signal(&request->condition_cond);
+ request->done_waiting=1;
+ pthread_cond_signal(&request->waiting_cond);
+ pthread_mutex_unlock(&request->waiting_mutex);
} else {
dsi_remove_from_request_queue(server,request);
}