From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Dan Nicolaescu Newsgroups: gmane.emacs.bugs Subject: bug#1298: allow 'emacsclient -a "emacs --daemon && emacsclient -c"' Date: Tue, 9 Dec 2008 10:58:32 -0800 (PST) Message-ID: <200812091858.mB9IwW8K022220@mothra.ics.uci.edu> References: <200811021818.mA2IIFMq028772@mothra.ics.uci.edu> <200811180822.mAI8MX0n029841@mothra.ics.uci.edu> <200811181817.mAIIHhEf001001@mothra.ics.uci.edu> <200811182219.mAIMJv4G002062@mothra.ics.uci.edu> <200811182327.mAINR4ZT002539@mothra.ics.uci.edu> <200812080754.mB87sXSV016391@mothra.ics.uci.edu> <200812081709.mB8H9T2m017554@mothra.ics.uci.edu> <200812082020.mB8KKnf2018098@mothra.ics.uci.edu> Reply-To: Dan Nicolaescu , 1298@emacsbugs.donarmstrong.com NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1228850741 11183 80.91.229.12 (9 Dec 2008 19:25:41 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 9 Dec 2008 19:25:41 +0000 (UTC) Cc: 1298@emacsbugs.donarmstrong.com To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Tue Dec 09 20:26:46 2008 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1LA8EC-000736-8y for geb-bug-gnu-emacs@m.gmane.org; Tue, 09 Dec 2008 20:26:40 +0100 Original-Received: from localhost ([127.0.0.1]:46831 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LA8D1-00058Q-4O for geb-bug-gnu-emacs@m.gmane.org; Tue, 09 Dec 2008 14:25:27 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LA8By-0004io-AY for bug-gnu-emacs@gnu.org; Tue, 09 Dec 2008 14:24:22 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LA8Bw-0004iX-Ms for bug-gnu-emacs@gnu.org; Tue, 09 Dec 2008 14:24:21 -0500 Original-Received: from [199.232.76.173] (port=40056 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LA8Bw-0004iU-EH for bug-gnu-emacs@gnu.org; Tue, 09 Dec 2008 14:24:20 -0500 Original-Received: from rzlab.ucr.edu ([138.23.92.77]:51243) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LA8Bw-0001Qe-5c for bug-gnu-emacs@gnu.org; Tue, 09 Dec 2008 14:24:20 -0500 Original-Received: from rzlab.ucr.edu (rzlab.ucr.edu [127.0.0.1]) by rzlab.ucr.edu (8.13.8/8.13.8/Debian-3) with ESMTP id mB9JOHib013035; Tue, 9 Dec 2008 11:24:17 -0800 Original-Received: (from debbugs@localhost) by rzlab.ucr.edu (8.13.8/8.13.8/Submit) id mB9J54bS007538; Tue, 9 Dec 2008 11:05:04 -0800 X-Loop: don@donarmstrong.com Resent-From: Dan Nicolaescu Resent-To: bug-submit-list@donarmstrong.com Resent-CC: Emacs Bugs Resent-Date: Tue, 09 Dec 2008 19:05:04 +0000 Resent-Message-ID: Resent-Sender: don@donarmstrong.com X-Emacs-PR-Message: report 1298 X-Emacs-PR-Package: emacs X-Emacs-PR-Keywords: Original-Received: via spool by 1298-submit@emacsbugs.donarmstrong.com id=B1298.12288491345290 (code B ref 1298); Tue, 09 Dec 2008 19:05:04 +0000 X-Spam-Bayes: score:0.0000 Tokens: new, 26; hammy, 151; neutral, 159; spammy, 0. spammytokens: hammytokens:0.000-+--emacs, 0.000-+--Emacs, 0.000-+--H*i:message, 0.000-+--H*i:2008, 0.000-+--UD:el Original-Received: (at 1298) by emacsbugs.donarmstrong.com; 9 Dec 2008 18:58:54 +0000 Original-Received: from sallyv2.ics.uci.edu (sallyv2.ics.uci.edu [128.195.1.120]) by rzlab.ucr.edu (8.13.8/8.13.8/Debian-3) with ESMTP id mB9IwoHE005281 for <1298@emacsbugs.donarmstrong.com>; Tue, 9 Dec 2008 10:58:51 -0800 Original-Received: from mothra.ics.uci.edu (mothra.ics.uci.edu [128.195.6.93]) by sallyv2.ics.uci.edu (8.13.7+Sun/8.13.7) with ESMTP id mB9IwXm7015071; Tue, 9 Dec 2008 10:58:33 -0800 (PST) Original-Received: (from dann@localhost) by mothra.ics.uci.edu (8.13.8+Sun/8.13.6/Submit) id mB9IwW8K022220; Tue, 9 Dec 2008 10:58:32 -0800 (PST) In-Reply-To: (Stefan Monnier's message of "Mon, 08 Dec 2008 16:48:25 -0500") Original-Lines: 139 X-ICS-MailScanner-Information: Please contact the ISP for more information X-ICS-MailScanner-ID: mB9IwXm7015071 X-ICS-MailScanner: Found to be clean X-ICS-MailScanner-SpamCheck: not spam, SpamAssassin (score=-1.209, required 5, autolearn=disabled, ALL_TRUSTED -1.44, TW_CP 0.08, TW_DL 0.08, TW_RG 0.08) X-ICS-MailScanner-From: dann@mothra.ics.uci.edu X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 3) Resent-Date: Tue, 09 Dec 2008 14:24:20 -0500 X-BeenThere: bug-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:23083 Archived-At: Stefan Monnier writes: > >> No need to worry about that: I've already explicitly rejected a tcp-port > >> option for server.el in the past, so I'll be happy to give other such > >> rejections in the future. > > > Hmm, you said the reverse here: > > http://article.gmane.org/gmane.emacs.devel/103350 > > Indeed. Consistency is the hgolm, isn't it? hgolm? Updated patch that uses -a "" or --alternate-editor= or ALTERNATE_EDITOR="": Index: emacsclient.c =================================================================== RCS file: /cvsroot/emacs/emacs/lib-src/emacsclient.c,v retrieving revision 1.142 diff -u -3 -p -u -p -r1.142 emacsclient.c --- emacsclient.c 3 Dec 2008 04:33:44 -0000 1.142 +++ emacsclient.c 9 Dec 2008 18:53:51 -0000 @@ -1294,7 +1294,7 @@ To start the server in Emacs, type \"M-x #endif /* ! NO_SOCKETS_IN_FILE_SYSTEM */ HSOCKET -set_socket () +set_socket (int no_exit_if_error) { HSOCKET s; @@ -1305,7 +1305,7 @@ set_socket () if (socket_name) { s = set_local_socket (); - if ((s != INVALID_SOCKET) || alternate_editor) + if ((s != INVALID_SOCKET) || no_exit_if_error) return s; message (TRUE, "%s: error accessing socket \"%s\"\n", progname, socket_name); @@ -1320,7 +1320,7 @@ set_socket () if (server_file) { s = set_tcp_socket (); - if ((s != INVALID_SOCKET) || alternate_editor) + if ((s != INVALID_SOCKET) || no_exit_if_error) return s; message (TRUE, "%s: error accessing server file \"%s\"\n", @@ -1338,7 +1338,7 @@ set_socket () /* Implicit server file. */ server_file = "server"; s = set_tcp_socket (); - if ((s != INVALID_SOCKET) || alternate_editor) + if ((s != INVALID_SOCKET) || no_exit_if_error) return s; /* No implicit or explicit socket, and no alternate editor. */ @@ -1416,6 +1416,7 @@ main (argc, argv) int i, rl, needlf = 0; char *cwd, *str; char string[BUFSIZ+1]; + int null_socket_name, null_server_file, start_daemon_if_needed; main_argv = argv; progname = argv[0]; @@ -1431,9 +1432,68 @@ main (argc, argv) exit (EXIT_FAILURE); } - if ((emacs_socket = set_socket ()) == INVALID_SOCKET) - fail (); - + start_daemon_if_needed = (alternate_editor + && (alternate_editor[0] == '\0')); + if (start_daemon_if_needed) + { + /* set_socket changes the values for socket_name and + server_file, we need to reset them, if they were NULL before + for the second call to set_socket. */ + null_socket_name = (socket_name == NULL); + null_server_file = (server_file == NULL); + } + + if ((emacs_socket = set_socket (alternate_editor + || start_daemon_if_needed)) == INVALID_SOCKET) + if (start_daemon_if_needed) + { + pid_t dpid; + int status; + pid_t p; + + /* Reset socket_name and server_file if they were NULL + before the set_socket call. */ + if (null_socket_name) + socket_name = NULL; + if (null_server_file) + server_file = NULL; + + dpid = fork (); + + if (dpid > 0) + { + p = waitpid (dpid, &status, WUNTRACED | WCONTINUED); + + /* Try connecting again, the daemon should have started by + now. */ + message (TRUE, "daemon should have started, trying to connect again\n", dpid); + if ((emacs_socket = set_socket (1)) == INVALID_SOCKET) + message (TRUE, "Cannot connect even after starting the daemon\n"); + } + else if (dpid < 0) + { + fprintf (stderr, "Cannot fork!\n"); + exit (1); + } + else + { + char *d_argv[] = {"emacs", "--daemon", 0 }; + if (!null_socket_name) + { + /* Pass --daemon=socket_name as argument. */ + char *deq = "--daemon="; + char *daemon_arg = alloca (strlen (deq) + + strlen (socket_name) + 1); + strcpy (daemon_arg, deq); + strcat (daemon_arg, socket_name); + d_argv[1] = daemon_arg; + } + execvp ("emacs", d_argv); + message (TRUE, "%s: error starting emacs daemon\n", progname); + } + } + else + fail (); cwd = get_current_dir_name (); if (cwd == 0)