Lines Matching refs:cf

77 	struct client_file	*cf;
79 cf = xcalloc(1, sizeof *cf);
80 cf->c = NULL;
81 cf->references = 1;
82 cf->stream = stream;
84 cf->buffer = evbuffer_new();
85 if (cf->buffer == NULL)
88 cf->cb = cb;
89 cf->data = cbdata;
91 cf->peer = peer;
92 cf->tree = files;
93 RB_INSERT(client_files, files, cf);
95 return (cf);
103 struct client_file *cf;
108 cf = xcalloc(1, sizeof *cf);
109 cf->c = c;
110 cf->references = 1;
111 cf->stream = stream;
113 cf->buffer = evbuffer_new();
114 if (cf->buffer == NULL)
117 cf->cb = cb;
118 cf->data = cbdata;
120 if (cf->c != NULL) {
121 cf->peer = cf->c->peer;
122 cf->tree = &cf->c->files;
123 RB_INSERT(client_files, &cf->c->files, cf);
124 cf->c->references++;
127 return (cf);
132 file_free(struct client_file *cf)
134 if (--cf->references != 0)
137 evbuffer_free(cf->buffer);
138 free(cf->path);
140 if (cf->tree != NULL)
141 RB_REMOVE(client_files, cf->tree, cf);
142 if (cf->c != NULL)
143 server_client_unref(cf->c);
145 free(cf);
152 struct client_file *cf = arg;
153 struct client *c = cf->c;
155 if (cf->cb != NULL &&
156 (cf->closed || c == NULL || (~c->flags & CLIENT_DEAD)))
157 cf->cb(c, cf->path, cf->error, 1, cf->buffer, cf->data);
158 file_free(cf);
163 file_fire_done(struct client_file *cf)
165 event_once(-1, EV_TIMEOUT, file_fire_done_cb, cf, NULL);
170 file_fire_read(struct client_file *cf)
172 if (cf->cb != NULL)
173 cf->cb(cf->c, cf->path, cf->error, 0, cf->buffer, cf->data);
202 struct client_file find, *cf;
209 if ((cf = RB_FIND(client_files, &c->files, &find)) == NULL) {
210 cf = file_create_with_client(c, 1, NULL, NULL);
211 cf->path = xstrdup("-");
213 evbuffer_add_vprintf(cf->buffer, fmt, ap);
220 evbuffer_add_vprintf(cf->buffer, fmt, ap);
221 file_push(cf);
229 struct client_file find, *cf;
236 if ((cf = RB_FIND(client_files, &c->files, &find)) == NULL) {
237 cf = file_create_with_client(c, 1, NULL, NULL);
238 cf->path = xstrdup("-");
240 evbuffer_add(cf->buffer, data, size);
247 evbuffer_add(cf->buffer, data, size);
248 file_push(cf);
256 struct client_file find, *cf;
266 if ((cf = RB_FIND(client_files, &c->files, &find)) == NULL) {
267 cf = file_create_with_client(c, 2, NULL, NULL);
268 cf->path = xstrdup("-");
270 evbuffer_add_vprintf(cf->buffer, fmt, ap);
277 evbuffer_add_vprintf(cf->buffer, fmt, ap);
278 file_push(cf);
289 struct client_file *cf;
298 cf = file_create_with_client(c, stream, cb, cbdata);
299 cf->path = xstrdup("-");
305 cf->error = EBADF;
311 cf = file_create_with_client(c, stream, cb, cbdata);
312 cf->path = file_get_path(c, path);
319 f = fopen(cf->path, mode);
321 cf->error = errno;
326 cf->error = EIO;
334 evbuffer_add(cf->buffer, bdata, bsize);
336 msglen = strlen(cf->path) + 1 + sizeof *msg;
338 cf->error = E2BIG;
342 msg->stream = cf->stream;
345 memcpy(msg + 1, cf->path, msglen - sizeof *msg);
346 if (proc_send(cf->peer, MSG_WRITE_OPEN, -1, msg, msglen) != 0) {
348 cf->error = EINVAL;
355 file_fire_done(cf);
362 struct client_file *cf;
372 cf = file_create_with_client(c, stream, cb, cbdata);
373 cf->path = xstrdup("-");
379 cf->error = EBADF;
385 cf = file_create_with_client(c, stream, cb, cbdata);
386 cf->path = file_get_path(c, path);
389 f = fopen(cf->path, "rb");
391 cf->error = errno;
396 if (evbuffer_add(cf->buffer, buffer, size) != 0) {
397 cf->error = ENOMEM;
404 cf->error = EIO;
412 msglen = strlen(cf->path) + 1 + sizeof *msg;
414 cf->error = E2BIG;
418 msg->stream = cf->stream;
420 memcpy(msg + 1, cf->path, msglen - sizeof *msg);
421 if (proc_send(cf->peer, MSG_READ_OPEN, -1, msg, msglen) != 0) {
423 cf->error = EINVAL;
427 return cf;
430 file_fire_done(cf);
436 file_cancel(struct client_file *cf)
440 log_debug("read cancel file %d", cf->stream);
442 if (cf->closed)
444 cf->closed = 1;
446 msg.stream = cf->stream;
447 proc_send(cf->peer, MSG_READ_CANCEL, -1, &msg, sizeof msg);
454 struct client_file *cf = arg;
456 if (cf->c == NULL || ~cf->c->flags & CLIENT_DEAD)
457 file_push(cf);
458 file_free(cf);
463 file_push(struct client_file *cf)
470 left = EVBUFFER_LENGTH(cf->buffer);
478 msg->stream = cf->stream;
479 memcpy(msg + 1, EVBUFFER_DATA(cf->buffer), sent);
480 if (proc_send(cf->peer, MSG_WRITE, -1, msg, msglen) != 0)
482 evbuffer_drain(cf->buffer, sent);
484 left = EVBUFFER_LENGTH(cf->buffer);
485 log_debug("file %d sent %zu, left %zu", cf->stream, sent, left);
488 cf->references++;
489 event_once(-1, EV_TIMEOUT, file_push_cb, cf, NULL);
490 } else if (cf->stream > 2) {
491 close.stream = cf->stream;
492 proc_send(cf->peer, MSG_WRITE_CLOSE, -1, &close, sizeof close);
493 file_fire_done(cf);
502 struct client_file *cf;
506 RB_FOREACH(cf, client_files, files) {
507 if (cf->event == NULL)
509 left = EVBUFFER_LENGTH(cf->event->output);
512 log_debug("file %u %zu bytes left", cf->stream, left);
523 struct client_file *cf = arg;
525 log_debug("write error file %d", cf->stream);
527 bufferevent_free(cf->event);
528 cf->event = NULL;
530 close(cf->fd);
531 cf->fd = -1;
533 if (cf->cb != NULL)
534 cf->cb(NULL, NULL, 0, -1, NULL, cf->data);
541 struct client_file *cf = arg;
543 log_debug("write check file %d", cf->stream);
545 if (cf->cb != NULL)
546 cf->cb(NULL, NULL, 0, -1, NULL, cf->data);
548 if (cf->closed && EVBUFFER_LENGTH(cf->event->output) == 0) {
549 bufferevent_free(cf->event);
550 close(cf->fd);
551 RB_REMOVE(client_files, cf->tree, cf);
552 file_free(cf);
566 struct client_file find, *cf;
583 cf = file_create_with_peer(peer, files, msg->stream, cb, cbdata);
584 if (cf->closed) {
589 cf->fd = -1;
591 cf->fd = open(path, msg->flags|flags, 0644);
596 cf->fd = dup(msg->fd);
602 if (cf->fd == -1) {
607 cf->event = bufferevent_new(cf->fd, NULL, file_write_callback,
608 file_write_error_callback, cf);
609 if (cf->event == NULL)
611 bufferevent_enable(cf->event, EV_WRITE);
626 struct client_file find, *cf;
632 if ((cf = RB_FIND(client_files, files, &find)) == NULL)
634 log_debug("write %zu to file %d", size, cf->stream);
636 if (cf->event != NULL)
637 bufferevent_write(cf->event, msg + 1, size);
646 struct client_file find, *cf;
651 if ((cf = RB_FIND(client_files, files, &find)) == NULL)
653 log_debug("close file %d", cf->stream);
655 if (cf->event == NULL || EVBUFFER_LENGTH(cf->event->output) == 0) {
656 if (cf->event != NULL)
657 bufferevent_free(cf->event);
658 if (cf->fd != -1)
659 close(cf->fd);
660 RB_REMOVE(client_files, files, cf);
661 file_free(cf);
670 struct client_file *cf = arg;
673 log_debug("read error file %d", cf->stream);
675 msg.stream = cf->stream;
677 proc_send(cf->peer, MSG_READ_DONE, -1, &msg, sizeof msg);
679 bufferevent_free(cf->event);
680 close(cf->fd);
681 RB_REMOVE(client_files, cf->tree, cf);
682 file_free(cf);
689 struct client_file *cf = arg;
697 bdata = EVBUFFER_DATA(cf->event->input);
698 bsize = EVBUFFER_LENGTH(cf->event->input);
704 log_debug("read %zu from file %d", bsize, cf->stream);
708 msg->stream = cf->stream;
710 proc_send(cf->peer, MSG_READ, -1, msg, msglen);
712 evbuffer_drain(cf->event->input, bsize);
727 struct client_file find, *cf;
744 cf = file_create_with_peer(peer, files, msg->stream, cb, cbdata);
745 if (cf->closed) {
750 cf->fd = -1;
752 cf->fd = open(path, flags);
757 cf->fd = dup(msg->fd);
763 if (cf->fd == -1) {
768 cf->event = bufferevent_new(cf->fd, file_read_callback, NULL,
769 file_read_error_callback, cf);
770 if (cf->event == NULL)
772 bufferevent_enable(cf->event, EV_READ);
787 struct client_file find, *cf;
792 if ((cf = RB_FIND(client_files, files, &find)) == NULL)
794 log_debug("cancel file %d", cf->stream);
796 file_read_error_callback(NULL, 0, cf);
805 struct client_file find, *cf;
810 if ((cf = RB_FIND(client_files, files, &find)) == NULL)
813 cf->error = msg->error;
814 file_fire_done(cf);
816 file_push(cf);
825 struct client_file find, *cf;
832 if ((cf = RB_FIND(client_files, files, &find)) == NULL)
835 log_debug("file %d read %zu bytes", cf->stream, bsize);
836 if (cf->error == 0 && !cf->closed) {
837 if (evbuffer_add(cf->buffer, bdata, bsize) != 0) {
838 cf->error = ENOMEM;
839 file_fire_done(cf);
841 file_fire_read(cf);
851 struct client_file find, *cf;
856 if ((cf = RB_FIND(client_files, files, &find)) == NULL)
859 log_debug("file %d read done", cf->stream);
860 cf->error = msg->error;
861 file_fire_done(cf);