Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(193)

Side by Side Diff: ports/nacl-spawn/nacl_spawn.cc

Issue 1742043002: Make M-x shell work in emacs. (Closed) Base URL: https://chromium.googlesource.com/webports.git@master
Patch Set: fix Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ports/nacl-spawn/nacl_apipe.c ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2014 The Native Client Authors. All rights reserved. 1 // Copyright (c) 2014 The Native Client Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Emulates spawning/waiting process by asking JavaScript to do so. 5 // Emulates spawning/waiting process by asking JavaScript to do so.
6 6
7 // Include quoted spawn.h first so we can build in the presence of an installed 7 // Include quoted spawn.h first so we can build in the presence of an installed
8 // copy of nacl-spawn. 8 // copy of nacl-spawn.
9 #define IN_NACL_SPAWN_CC 9 #define IN_NACL_SPAWN_CC
10 #include "spawn.h" 10 #include "spawn.h"
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 } else if (S_ISDIR(st.st_mode)) { 347 } else if (S_ISDIR(st.st_mode)) {
348 // TODO(bradnelson): Land nacl_io ioctl to support this. 348 // TODO(bradnelson): Land nacl_io ioctl to support this.
349 } else if (S_ISCHR(st.st_mode)) { 349 } else if (S_ISCHR(st.st_mode)) {
350 // Unsupported. 350 // Unsupported.
351 } else if (S_ISBLK(st.st_mode)) { 351 } else if (S_ISBLK(st.st_mode)) {
352 // Unsupported. 352 // Unsupported.
353 } else if (S_ISFIFO(st.st_mode)) { 353 } else if (S_ISFIFO(st.st_mode)) {
354 char entry[100]; 354 char entry[100];
355 snprintf(entry, sizeof entry, 355 snprintf(entry, sizeof entry,
356 "NACL_SPAWN_FD_SETUP_%d=pipe:%d:%d:%d", count++, fd, 356 "NACL_SPAWN_FD_SETUP_%d=pipe:%d:%d:%d", count++, fd,
357 static_cast<int>(st.st_ino), st.st_rdev == O_WRONLY); 357 static_cast<int>(st.st_ino),
358 (st.st_rdev & O_WRONLY) == O_WRONLY);
358 nspawn_array_appendstring(envs_var, entry); 359 nspawn_array_appendstring(envs_var, entry);
359 } else if (S_ISLNK(st.st_mode)) { 360 } else if (S_ISLNK(st.st_mode)) {
360 // Unsupported. 361 // Unsupported.
361 } else if (S_ISSOCK(st.st_mode)) { 362 } else if (S_ISSOCK(st.st_mode)) {
362 // Unsupported. 363 // Unsupported.
363 } 364 }
364 } 365 }
365 return 0; 366 return 0;
366 } 367 }
367 368
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 if (data) { 680 if (data) {
680 *data = static_cast<char*>(malloc(result_len + 1)); 681 *data = static_cast<char*>(malloc(result_len + 1));
681 assert(*data); 682 assert(*data);
682 memcpy(*data, result, result_len); 683 memcpy(*data, result, result_len);
683 (*data)[result_len] = '\0'; 684 (*data)[result_len] = '\0';
684 } 685 }
685 nspawn_var_release(result_var); 686 nspawn_var_release(result_var);
686 nspawn_var_release(result_dict_var); 687 nspawn_var_release(result_dict_var);
687 } 688 }
688 689
689 // Create a javascript pipe. pipefd[0] will be the read end of the pipe 690 // Same as above with flags.
690 // and pipefd[1] the write end of the pipe. 691 int nacl_spawn_pipe2(int pipefd[2], int flags) {
691 int nacl_spawn_pipe(int pipefd[2]) {
692 if (pipefd == NULL) { 692 if (pipefd == NULL) {
693 errno = EFAULT; 693 errno = EFAULT;
694 return -1; 694 return -1;
695 } 695 }
696 696
697 struct PP_Var req_var = nspawn_dict_create(); 697 struct PP_Var req_var = nspawn_dict_create();
698 nspawn_dict_setstring(req_var, "command", "nacl_apipe"); 698 nspawn_dict_setstring(req_var, "command", "nacl_apipe");
699 699
700 struct PP_Var result_var = nspawn_send_request(req_var); 700 struct PP_Var result_var = nspawn_send_request(req_var);
701 int id = nspawn_dict_getint(result_var, "pipe_id"); 701 int id = nspawn_dict_getint(result_var, "pipe_id");
702 nspawn_var_release(result_var); 702 nspawn_var_release(result_var);
703 703
704 int read_fd; 704 int read_fd;
705 int write_fd; 705 int write_fd;
706 char path[100]; 706 char path[100];
707 sprintf(path, "/apipe/%d", id); 707 sprintf(path, "/apipe/%d", id);
708 read_fd = open(path, O_RDONLY); 708 // The only flag supported is O_NONBLOCK.
709 write_fd = open(path, O_WRONLY); 709 // TODO(bradnelson): Drop this once nacl_io does the right thing:
710 // https://bugs.chromium.org/p/webports/issues/detail?id=247
711 // https://bugs.chromium.org/p/webports/issues/detail?id=248
712 assert(flags == 0 || flags == O_NONBLOCK);
713 read_fd = open(path, O_RDONLY | flags);
714 write_fd = open(path, O_WRONLY | flags);
710 if (read_fd < 0 || write_fd < 0) { 715 if (read_fd < 0 || write_fd < 0) {
711 if (read_fd >= 0) { 716 if (read_fd >= 0) {
712 close(read_fd); 717 close(read_fd);
713 } 718 }
714 if (write_fd >= 0) { 719 if (write_fd >= 0) {
715 close(write_fd); 720 close(write_fd);
716 } 721 }
717 return -1; 722 return -1;
718 } 723 }
719 pipefd[0] = read_fd; 724 pipefd[0] = read_fd;
720 pipefd[1] = write_fd; 725 pipefd[1] = write_fd;
721 726
722 return 0; 727 return 0;
723 } 728 }
724 729
730 // Create a javascript pipe. pipefd[0] will be the read end of the pipe
731 // and pipefd[1] the write end of the pipe.
732 int nacl_spawn_pipe(int pipefd[2]) {
733 return nacl_spawn_pipe2(pipefd, 0);
734 }
735
725 void nacl_spawn_vfork_before(void) { 736 void nacl_spawn_vfork_before(void) {
726 assert(!vforking); 737 assert(!vforking);
727 vforking = 1; 738 vforking = 1;
728 stash_file_descriptors(); 739 stash_file_descriptors();
729 } 740 }
730 741
731 pid_t nacl_spawn_vfork_after(int jmping) { 742 pid_t nacl_spawn_vfork_after(int jmping) {
732 if (jmping) { 743 if (jmping) {
733 unstash_file_descriptors(); 744 unstash_file_descriptors();
734 vforking = 0; 745 vforking = 0;
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 } 836 }
826 837
827 int execlpe(const char *path, const char *arg, ...) { /* char* const envp[] */ 838 int execlpe(const char *path, const char *arg, ...) { /* char* const envp[] */
828 NSPAWN_LOG("execlpe: %s", path); 839 NSPAWN_LOG("execlpe: %s", path);
829 VARG_TO_ARGV_ENVP; 840 VARG_TO_ARGV_ENVP;
830 // TODO(bradnelson): Limit path resolution to 'p' variants. 841 // TODO(bradnelson): Limit path resolution to 'p' variants.
831 return spawnve_impl(P_OVERLAY, path, argv, envp); 842 return spawnve_impl(P_OVERLAY, path, argv, envp);
832 } 843 }
833 844
834 }; // extern "C" 845 }; // extern "C"
OLDNEW
« no previous file with comments | « ports/nacl-spawn/nacl_apipe.c ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698