Home | History | Annotate | Line # | Download | only in dist
cmd-source-file.c revision 1.1.1.2.8.1
      1 /* Id */
      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_show(struct cmd_q *);
     32 void		cmd_source_file_done(struct cmd_q *);
     33 
     34 const struct cmd_entry cmd_source_file_entry = {
     35 	"source-file", "source",
     36 	"", 1, 1,
     37 	"path",
     38 	0,
     39 	NULL,
     40 	cmd_source_file_exec
     41 };
     42 
     43 enum cmd_retval
     44 cmd_source_file_exec(struct cmd *self, struct cmd_q *cmdq)
     45 {
     46 	struct args	*args = self->args;
     47 	struct cmd_q	*cmdq1;
     48 	char		*cause;
     49 
     50 	cmdq1 = cmdq_new(NULL);
     51 	cmdq1->client = cmdq->client;
     52 	cmdq1->emptyfn = cmd_source_file_done;
     53 	cmdq1->data = cmdq;
     54 
     55 	switch (load_cfg(args->argv[0], cmdq1, &cause)) {
     56 	case -1:
     57 		if (cfg_references == 0) {
     58 			cmdq_free(cmdq1);
     59 			cmdq_error(cmdq, "%s", cause);
     60 			free(cause);
     61 			return (CMD_RETURN_ERROR);
     62 		}
     63 		ARRAY_ADD(&cfg_causes, cause);
     64 		/* FALLTHROUGH */
     65 	case 0:
     66 		if (cfg_references == 0)
     67 			cmd_source_file_show(cmdq);
     68 		cmdq_free(cmdq1);
     69 		return (CMD_RETURN_NORMAL);
     70 	}
     71 
     72 	cmdq->references++;
     73 	cfg_references++;
     74 
     75 	cmdq_continue(cmdq1);
     76 	return (CMD_RETURN_WAIT);
     77 }
     78 
     79 void
     80 cmd_source_file_show(struct cmd_q *cmdq)
     81 {
     82 	u_int	 i;
     83 	char	*cause;
     84 
     85 	for (i = 0; i < ARRAY_LENGTH(&cfg_causes); i++) {
     86 		cause = ARRAY_ITEM(&cfg_causes, i);
     87 		cmdq_print(cmdq, "%s", cause);
     88 		free(cause);
     89 	}
     90 	ARRAY_FREE(&cfg_causes);
     91 }
     92 
     93 void
     94 cmd_source_file_done(struct cmd_q *cmdq1)
     95 {
     96 	struct cmd_q	*cmdq = cmdq1->data;
     97 
     98 	if (cmdq1->client_exit >= 0)
     99 		cmdq->client_exit = cmdq1->client_exit;
    100 
    101 	cmdq_free(cmdq1);
    102 
    103 	cfg_references--;
    104 
    105 	if (cmdq_free(cmdq))
    106 		return;
    107 
    108 	if (cfg_references == 0)
    109 		cmd_source_file_show(cmdq);
    110 	cmdq_continue(cmdq);
    111 }
    112