Home | History | Annotate | Download | only in dist

Lines Matching refs:cf

82 	struct client_file	*cf;
84 cf = xcalloc(1, sizeof *cf);
85 cf->c = NULL;
86 cf->references = 1;
87 cf->stream = stream;
89 cf->buffer = evbuffer_new();
90 if (cf->buffer == NULL)
93 cf->cb = cb;
94 cf->data = cbdata;
96 cf->peer = peer;
97 cf->tree = files;
98 RB_INSERT(client_files, files, cf);
100 return (cf);
108 struct client_file *cf;
113 cf = xcalloc(1, sizeof *cf);
114 cf->c = c;
115 cf->references = 1;
116 cf->stream = stream;
118 cf->buffer = evbuffer_new();
119 if (cf->buffer == NULL)
122 cf->cb = cb;
123 cf->data = cbdata;
125 if (cf->c != NULL) {
126 cf->peer = cf->c->peer;
127 cf->tree = &cf->c->files;
128 RB_INSERT(client_files, &cf->c->files, cf);
129 cf->c->references++;
132 return (cf);
137 file_free(struct client_file *cf)
139 if (--cf->references != 0)
142 evbuffer_free(cf->buffer);
143 free(cf->path);
145 if (cf->tree != NULL)
146 RB_REMOVE(client_files, cf->tree, cf);
147 if (cf->c != NULL)
148 server_client_unref(cf->c);
150 free(cf);
157 struct client_file *cf = arg;
158 struct client *c = cf->c;
160 if (cf->cb != NULL &&
161 (cf->closed || c == NULL || (~c->flags & CLIENT_DEAD)))
162 cf->cb(c, cf->path, cf->error, 1, cf->buffer, cf->data);
163 file_free(cf);
168 file_fire_done(struct client_file *cf)
170 event_once(-1, EV_TIMEOUT, file_fire_done_cb, cf, NULL);
175 file_fire_read(struct client_file *cf)
177 if (cf->cb != NULL)
178 cf->cb(cf->c, cf->path, cf->error, 0, cf->buffer, cf->data);
207 struct client_file find, *cf;
214 if ((cf = RB_FIND(client_files, &c->files, &find)) == NULL) {
215 cf = file_create_with_client(c, 1, NULL, NULL);
216 cf->path = xstrdup("-");
218 evbuffer_add_vprintf(cf->buffer, fmt, ap);
225 evbuffer_add_vprintf(cf->buffer, fmt, ap);
226 file_push(cf);
234 struct client_file find, *cf;
241 if ((cf = RB_FIND(client_files, &c->files, &find)) == NULL) {
242 cf = file_create_with_client(c, 1, NULL, NULL);
243 cf->path = xstrdup("-");
245 evbuffer_add(cf->buffer, data, size);
252 evbuffer_add(cf->buffer, data, size);
253 file_push(cf);
261 struct client_file find, *cf;
271 if ((cf = RB_FIND(client_files, &c->files, &find)) == NULL) {
272 cf = file_create_with_client(c, 2, NULL, NULL);
273 cf->path = xstrdup("-");
275 evbuffer_add_vprintf(cf->buffer, fmt, ap);
282 evbuffer_add_vprintf(cf->buffer, fmt, ap);
283 file_push(cf);
294 struct client_file *cf;
303 cf = file_create_with_client(c, stream, cb, cbdata);
304 cf->path = xstrdup("-");
310 cf->error = EBADF;
316 cf = file_create_with_client(c, stream, cb, cbdata);
317 cf->path = file_get_path(c, path);
324 f = fopen(cf->path, mode);
326 cf->error = errno;
331 cf->error = EIO;
339 evbuffer_add(cf->buffer, bdata, bsize);
341 msglen = strlen(cf->path) + 1 + sizeof *msg;
343 cf->error = E2BIG;
347 msg->stream = cf->stream;
350 memcpy(msg + 1, cf->path, msglen - sizeof *msg);
351 if (proc_send(cf->peer, MSG_WRITE_OPEN, -1, msg, msglen) != 0) {
353 cf->error = EINVAL;
360 file_fire_done(cf);
367 struct client_file *cf;
377 cf = file_create_with_client(c, stream, cb, cbdata);
378 cf->path = xstrdup("-");
384 cf->error = EBADF;
390 cf = file_create_with_client(c, stream, cb, cbdata);
391 cf->path = file_get_path(c, path);
394 f = fopen(cf->path, "rb");
396 cf->error = errno;
401 if (evbuffer_add(cf->buffer, buffer, size) != 0) {
402 cf->error = ENOMEM;
409 cf->error = EIO;
416 msglen = strlen(cf->path) + 1 + sizeof *msg;
418 cf->error = E2BIG;
422 msg->stream = cf->stream;
424 memcpy(msg + 1, cf->path, msglen - sizeof *msg);
425 if (proc_send(cf->peer, MSG_READ_OPEN, -1, msg, msglen) != 0) {
427 cf->error = EINVAL;
431 return cf;
436 file_fire_done(cf);
442 file_cancel(struct client_file *cf)
446 log_debug("read cancel file %d", cf->stream);
448 if (cf->closed)
450 cf->closed = 1;
452 msg.stream = cf->stream;
453 proc_send(cf->peer, MSG_READ_CANCEL, -1, &msg, sizeof msg);
460 struct client_file *cf = arg;
462 if (cf->c == NULL || ~cf->c->flags & CLIENT_DEAD)
463 file_push(cf);
464 file_free(cf);
469 file_push(struct client_file *cf)
476 left = EVBUFFER_LENGTH(cf->buffer);
484 msg->stream = cf->stream;
485 memcpy(msg + 1, EVBUFFER_DATA(cf->buffer), sent);
486 if (proc_send(cf->peer, MSG_WRITE, -1, msg, msglen) != 0)
488 evbuffer_drain(cf->buffer, sent);
490 left = EVBUFFER_LENGTH(cf->buffer);
491 log_debug("file %d sent %zu, left %zu", cf->stream, sent, left);
494 cf->references++;
495 event_once(-1, EV_TIMEOUT, file_push_cb, cf, NULL);
496 } else if (cf->stream > 2) {
497 close.stream = cf->stream;
498 proc_send(cf->peer, MSG_WRITE_CLOSE, -1, &close, sizeof close);
499 file_fire_done(cf);
508 struct client_file *cf;
512 RB_FOREACH(cf, client_files, files) {
513 if (cf->event == NULL)
515 left = EVBUFFER_LENGTH(cf->event->output);
518 log_debug("file %u %zu bytes left", cf->stream, left);
529 struct client_file *cf = arg;
531 log_debug("write error file %d", cf->stream);
533 bufferevent_free(cf->event);
534 cf->event = NULL;
536 close(cf->fd);
537 cf->fd = -1;
539 if (cf->cb != NULL)
540 cf->cb(NULL, NULL, 0, -1, NULL, cf->data);
547 struct client_file *cf = arg;
549 log_debug("write check file %d", cf->stream);
551 if (cf->cb != NULL)
552 cf->cb(NULL, NULL, 0, -1, NULL, cf->data);
554 if (cf->closed && EVBUFFER_LENGTH(cf->event->output) == 0) {
555 bufferevent_free(cf->event);
556 close(cf->fd);
557 RB_REMOVE(client_files, cf->tree, cf);
558 file_free(cf);
572 struct client_file find, *cf;
589 cf = file_create_with_peer(peer, files, msg->stream, cb, cbdata);
590 if (cf->closed) {
595 cf->fd = -1;
597 cf->fd = open(path, msg->flags|flags, 0644);
602 cf->fd = dup(msg->fd);
608 if (cf->fd == -1) {
613 cf->event = bufferevent_new(cf->fd, NULL, file_write_callback,
614 file_write_error_callback, cf);
615 if (cf->event == NULL)
617 bufferevent_enable(cf->event, EV_WRITE);
632 struct client_file find, *cf;
638 if ((cf = RB_FIND(client_files, files, &find)) == NULL)
640 log_debug("write %zu to file %d", size, cf->stream);
642 if (cf->event != NULL)
643 bufferevent_write(cf->event, msg + 1, size);
652 struct client_file find, *cf;
657 if ((cf = RB_FIND(client_files, files, &find)) == NULL)
659 log_debug("close file %d", cf->stream);
661 if (cf->event == NULL || EVBUFFER_LENGTH(cf->event->output) == 0) {
662 if (cf->event != NULL)
663 bufferevent_free(cf->event);
664 if (cf->fd != -1)
665 close(cf->fd);
666 RB_REMOVE(client_files, files, cf);
667 file_free(cf);
676 struct client_file *cf = arg;
679 log_debug("read error file %d", cf->stream);
681 msg.stream = cf->stream;
683 proc_send(cf->peer, MSG_READ_DONE, -1, &msg, sizeof msg);
685 bufferevent_free(cf->event);
686 close(cf->fd);
687 RB_REMOVE(client_files, cf->tree, cf);
688 file_free(cf);
695 struct client_file *cf = arg;
703 bdata = EVBUFFER_DATA(cf->event->input);
704 bsize = EVBUFFER_LENGTH(cf->event->input);
710 log_debug("read %zu from file %d", bsize, cf->stream);
714 msg->stream = cf->stream;
716 proc_send(cf->peer, MSG_READ, -1, msg, msglen);
718 evbuffer_drain(cf->event->input, bsize);
733 struct client_file find, *cf;
750 cf = file_create_with_peer(peer, files, msg->stream, cb, cbdata);
751 if (cf->closed) {
756 cf->fd = -1;
758 cf->fd = open(path, flags);
763 cf->fd = dup(msg->fd);
769 if (cf->fd == -1) {
774 cf->event = bufferevent_new(cf->fd, file_read_callback, NULL,
775 file_read_error_callback, cf);
776 if (cf->event == NULL)
778 bufferevent_enable(cf->event, EV_READ);
793 struct client_file find, *cf;
798 if ((cf = RB_FIND(client_files, files, &find)) == NULL)
800 log_debug("cancel file %d", cf->stream);
802 file_read_error_callback(NULL, 0, cf);
811 struct client_file find, *cf;
816 if ((cf = RB_FIND(client_files, files, &find)) == NULL)
819 cf->error = msg->error;
820 file_fire_done(cf);
822 file_push(cf);
831 struct client_file find, *cf;
838 if ((cf = RB_FIND(client_files, files, &find)) == NULL)
841 log_debug("file %d read %zu bytes", cf->stream, bsize);
842 if (cf->error == 0 && !cf->closed) {
843 if (evbuffer_add(cf->buffer, bdata, bsize) != 0) {
844 cf->error = ENOMEM;
845 file_fire_done(cf);
847 file_fire_read(cf);
857 struct client_file find, *cf;
862 if ((cf = RB_FIND(client_files, files, &find)) == NULL)
865 log_debug("file %d read done", cf->stream);
866 cf->error = msg->error;
867 file_fire_done(cf);