Home | History | Annotate | Line # | Download | only in dist
cmd-source-file.c revision 1.1.1.5
      1 /* $OpenBSD$ */
      2 
      3 /*
      4  * Copyright (c) 2008 Tiago Cunha <me (at) tiagocunha.org>
      5  *
      6  * Permission to use, copy, modify, and distribute this software for any
      7  * purpose with or without fee is hereby granted, provided that the above
      8  * copyright notice and this permission notice appear in all copies.
      9  *
     10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     14  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
     15  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
     16  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     17  */
     18 
     19 #include <sys/types.h>
     20 
     21 #include <stdlib.h>
     22 
     23 #include "tmux.h"
     24 
     25 /*
     26  * Sources a configuration file.
     27  */
     28 
     29 enum cmd_retval	cmd_source_file_exec(struct cmd *, struct cmd_q *);
     30 
     31 void		cmd_source_file_done(struct cmd_q *);
     32 
     33 const struct cmd_entry cmd_source_file_entry = {
     34 	"source-file", "source",
     35 	"", 1, 1,
     36 	"path",
     37 	0,
     38 	cmd_source_file_exec
     39 };
     40 
     41 enum cmd_retval
     42 cmd_source_file_exec(struct cmd *self, struct cmd_q *cmdq)
     43 {
     44 	struct args	*args = self->args;
     45 	struct cmd_q	*cmdq1;
     46 	char		*cause;
     47 
     48 	cmdq1 = cmdq_new(NULL);
     49 	cmdq1->client = cmdq->client;
     50 	cmdq1->emptyfn = cmd_source_file_done;
     51 	cmdq1->data = cmdq;
     52 
     53 	switch (load_cfg(args->argv[0], cmdq1, &cause)) {
     54 	case -1:
     55 		if (cfg_references == 0) {
     56 			cmdq_free(cmdq1);
     57 			cmdq_error(cmdq, "%s", cause);
     58 			free(cause);
     59 			return (CMD_RETURN_ERROR);
     60 		}
     61 		cfg_add_cause("%s", cause);
     62 		free(cause);
     63 		/* FALLTHROUGH */
     64 	case 0:
     65 		if (cfg_references == 0)
     66 			cfg_print_causes(cmdq);
     67 		cmdq_free(cmdq1);
     68 		return (CMD_RETURN_NORMAL);
     69 	}
     70 
     71 	cmdq->references++;
     72 	cfg_references++;
     73 
     74 	cmdq_continue(cmdq1);
     75 	return (CMD_RETURN_WAIT);
     76 }
     77 
     78 void
     79 cmd_source_file_done(struct cmd_q *cmdq1)
     80 {
     81 	struct cmd_q	*cmdq = cmdq1->data;
     82 
     83 	if (cmdq1->client_exit >= 0)
     84 		cmdq->client_exit = cmdq1->client_exit;
     85 
     86 	cmdq_free(cmdq1);
     87 
     88 	cfg_references--;
     89 
     90 	if (cmdq_free(cmdq))
     91 		return;
     92 
     93 	if (cfg_references == 0)
     94 		cfg_print_causes(cmdq);
     95 	cmdq_continue(cmdq);
     96 }
     97