On 07/12/2012 10:58, Corinna Vinschen wrote:
Again, Cygwin supports SYSV IPC.  Please inform the original author that
the functionality depends on a running cygserver process.  If this
process is not running, the SYSV IPC functions return ENOSYS.

IMHO there's no reason to exit if the msgget function returns ENOSYS.
The code could simply note the fact and proceed, and only return an
error if the user tried the -R option.


The function has not returned ENOSYS, instead the process has received a signal, according to gdb's output. This is arguably a bug in Cygwin.

If msgget fails, it should return an error rather than raising a signal. If it returns an error, pv will handle that.
$ gdb pv
GNU gdb (GDB) 7.5.50.20120815-cvs (cygwin-special)
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-cygwin".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /usr/bin/pv...Reading symbols from 
/usr/lib/debug/usr/bin/pv.exe.dbg...done.
done.
(gdb) break main.c:1
Breakpoint 1 at 0x4014b7: file /usr/src/debug/pv-1.4.0-1/src/main/main.c, line 
1.
(gdb) s
The program is not being run.
(gdb) run
Starting program: /usr/bin/pv
[New Thread 165608.0x25670]
[New Thread 165608.0x27604]

Breakpoint 1, main (argc=1, argv=0x28ac60) at 
/usr/src/debug/pv-1.4.0-1/src/main/main.c:50
50                      return 64;
(gdb) s
36      {
(gdb) s
43              setlocale(LC_ALL, "");
(gdb) s
44              bindtextdomain(PACKAGE, LOCALEDIR);
(gdb) s
45              textdomain(PACKAGE);
(gdb) s
48              opts = opts_parse(argc, argv);
(gdb) s
opts_parse (argc=1, argv=0x28ac60) at 
/usr/src/debug/pv-1.4.0-1/src/main/options.c:51
51              struct option long_options[] = {
(gdb) s
49      {
(gdb) s
51              struct option long_options[] = {
(gdb) s
49      {
(gdb) s
51              struct option long_options[] = {
(gdb) s
80              int option_index = 0;
(gdb) s
86              opts = calloc(1, sizeof(*opts));
(gdb) s
87              if (!opts) {
(gdb) s
86              opts = calloc(1, sizeof(*opts));
(gdb) s
87              if (!opts) {
(gdb) s
95              opts->program_name = argv[0];
(gdb) s
98              opts->argv = calloc(argc + 1, sizeof(char *));
(gdb) s
97              opts->argc = 0;
(gdb) s
98              opts->argv = calloc(argc + 1, sizeof(char *));
(gdb) s
99              if (!opts->argv) {
(gdb) s
98              opts->argv = calloc(argc + 1, sizeof(char *));
(gdb) s
99              if (!opts->argv) {
(gdb) s
111             opts->interval = 1;
(gdb) s
244                             opts->pidfile = optarg;
(gdb) s
109             numopts = 0;
(gdb) s
111             opts->interval = 1;
(gdb) s
244                             opts->pidfile = optarg;
(gdb) s
241                             opts->remote = pv_getnum_i(optarg);
(gdb) s
232                             opts->buffer_size = pv_getnum_ll(optarg);
(gdb) s
229                             opts->rate_limit = pv_getnum_ll(optarg);
(gdb) s
115                     c = getopt_long(argc, argv, /* RATS: ignore */
(gdb) s
121                     if (c < 0)
(gdb) s
115                     c = getopt_long(argc, argv, /* RATS: ignore */
(gdb) s
121                     if (c < 0)
(gdb) s
265             } while (c != -1);
(gdb) s
270             if (0 == numopts) {
(gdb) s
271                     opts->progress = 1;
(gdb) s
272                     opts->timer = 1;
(gdb) s
273                     opts->eta = 1;
(gdb) s
274                     opts->rate = 1;
(gdb) s
275                     opts->bytes = 1;
(gdb) s
281             while (optind < argc) {
(gdb) s
286     }
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:49
49              if (NULL == opts)
(gdb) s
48              opts = opts_parse(argc, argv);
(gdb) s
49              if (NULL == opts)
(gdb) s
52              if (opts->do_nothing) {
(gdb) s
60              if (opts->remote > 0) {
(gdb) s
69              state = pv_state_alloc(opts->program_name);
(gdb) s
pv_state_alloc (program_name=0x8003b070 "/usr/bin/pv") at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:20
20              state = calloc(1, sizeof(*state));
(gdb) s
21              if (0 == state)
(gdb) s
20              state = calloc(1, sizeof(*state));
(gdb) s
21              if (0 == state)
(gdb) s
24              state->program_name = program_name;
(gdb) s
26              state->pv_crs_shmid = -1;
(gdb) s
27              state->pv_crs_pvcount = 1;
(gdb) s
29              state->pv_crs_lock_fd = -1;
(gdb) s
24              state->program_name = program_name;
(gdb) s
31              state->reparse_display = 1;
(gdb) s
32              state->current_file = _("none");
(gdb) s
35      }
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:70
70              if (NULL == state) {
(gdb) s
69              state = pv_state_alloc(opts->program_name);
(gdb) s
70              if (NULL == state) {
(gdb) s
80              if (opts->pidfile != NULL) {
(gdb) s
97              if (0 == opts->argc)
(gdb) s
98                      opts->argv[opts->argc++] = "-";
(gdb) s
103             pv_state_inputfiles(state, opts->argc,
(gdb) s
pv_state_inputfiles (state=0x8003b6d0, input_file_count=1, 
input_files=0x80028bc8) at /usr/src/debug/pv-1.4.0-1/src/pv/state.c:160
160     {
(gdb) s
161             state->input_file_count = input_file_count;
(gdb) s
162             state->input_files = input_files;
(gdb) s
163     }
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:109
109             if (0 == opts->size)
(gdb) s
110                     opts->size = pv_calc_total_size(state);
(gdb) s
pv_calc_total_size (state=0x8003b6d0) at 
/usr/src/debug/pv-1.4.0-1/src/pv/file.c:45
45              if (state->input_file_count < 1) {
(gdb) s
52                      if (0 == strcmp(state->input_files[i], "-")) {
(gdb) s
45              if (state->input_file_count < 1) {
(gdb) s
52                      if (0 == strcmp(state->input_files[i], "-")) {
(gdb) s
53                              rc = fstat64(STDIN_FILENO, &sb);
(gdb) s
54                              if (rc != 0) {
(gdb) s
78                      if (S_ISBLK(sb.st_mode)) {
(gdb) s
99                      } else if (S_ISREG(sb.st_mode)) {
(gdb) s
102                             total = 0;
(gdb) s
51              for (i = 0; i < state->input_file_count; i++) {
(gdb) s
114             if (total <= 0) {
(gdb) s
115                     rc = fstat64(STDOUT_FILENO, &sb);
(gdb) s
116                     if ((0 == rc) && S_ISBLK(sb.st_mode)
(gdb) s
139             if (!state->linemode)
(gdb) s
202     }
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:115
115             if (opts->size < 1)
(gdb) s
110                     opts->size = pv_calc_total_size(state);
(gdb) s
115             if (opts->size < 1)
(gdb) s
116                     opts->eta = 0;
(gdb) s
122             if ((0 == isatty(STDERR_FILENO))
(gdb) s
130             if ((0 == opts->width) || (0 == opts->height)) {
(gdb) s
134                     pv_screensize(&width, &height);
(gdb) s
132                     width = 0;
(gdb) s
133                     height = 0;
(gdb) s
134                     pv_screensize(&width, &height);
(gdb) s
pv_screensize (width=0x28ac1c, height=0x28ac18) at 
/usr/src/debug/pv-1.4.0-1/src/pv/display.c:28
28              if (isatty(STDERR_FILENO)) {
(gdb) s
29                      if (0 == ioctl(STDERR_FILENO, TIOCGWINSZ, &wsz)) {
(gdb) s
30                              *width = wsz.ws_col;
(gdb) s
31                              *height = wsz.ws_row;
(gdb) s
35      }
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:135
135                     if (0 == opts->width)
(gdb) s
136                             opts->width = width;
(gdb) s
137                     if (0 == opts->height)
(gdb) s
138                             opts->height = height;
(gdb) s
144             if (opts->width < 1)
(gdb) s
146             if (opts->height < 1)
(gdb) s
148             if (opts->width > 999999)
(gdb) s
150             if (opts->height > 999999)
(gdb) s
156             if (opts->interval < 0.1)
(gdb) s
158             if (opts->interval > 600)
(gdb) s
164             pv_state_interval_set(state, opts->interval);
(gdb) s
pv_state_interval_set (state=0x8003b6d0, val=1) at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:135
135             state->interval = val;
(gdb) s
136     };
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:165
165             pv_state_width_set(state, opts->width);
(gdb) s
pv_state_width_set (state=0x8003b6d0, val=175) at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:139
139             state->width = val;
(gdb) s
140     };
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:166
166             pv_state_height_set(state, opts->height);
(gdb) s
pv_state_height_set (state=0x8003b6d0, val=55) at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:143
143             state->height = val;
(gdb) s
144     };
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:167
167             pv_state_no_op_set(state, opts->no_op);
(gdb) s
pv_state_no_op_set (state=0x8003b6d0, val=0 '\000') at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:110
110             state->no_op = val;
(gdb) s
111     };
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:168
168             pv_state_force_set(state, opts->force);
(gdb) s
pv_state_force_set (state=0x8003b6d0, val=0 '\000') at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:90
90              state->force = val;
(gdb) s
91      }
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:169
169             pv_state_cursor_set(state, opts->cursor);
(gdb) s
pv_state_cursor_set (state=0x8003b6d0, val=0 '\000') at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:94
94              state->cursor = val;
(gdb) s
95      };
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:170
170             pv_state_numeric_set(state, opts->numeric);
(gdb) s
pv_state_numeric_set (state=0x8003b6d0, val=0 '\000') at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:98
98              state->numeric = val;
(gdb) s
99      };
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:171
171             pv_state_wait_set(state, opts->wait);
(gdb) s
pv_state_wait_set (state=0x8003b6d0, val=0 '\000') at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:102
102             state->wait = val;
(gdb) s
103     };
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:172
172             pv_state_linemode_set(state, opts->linemode);
(gdb) s
pv_state_linemode_set (state=0x8003b6d0, val=0 '\000') at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:106
106             state->linemode = val;
(gdb) s
107     };
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:173
173             pv_state_skip_errors_set(state, opts->skip_errors);
(gdb) s
pv_state_skip_errors_set (state=0x8003b6d0, val=0 '\000') at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:114
114             state->skip_errors = val;
(gdb) s
115     };
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:174
174             pv_state_stop_at_size_set(state, opts->stop_at_size);
(gdb) s
pv_state_stop_at_size_set (state=0x8003b6d0, val=0 '\000') at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:118
118             state->stop_at_size = val;
(gdb) s
119     };
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:175
175             pv_state_rate_limit_set(state, opts->rate_limit);
(gdb) s
pv_state_rate_limit_set (state=0x8003b6d0, val=0) at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:122
122             state->rate_limit = val;
(gdb) s
123     };
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:176
176             pv_state_target_buffer_size_set(state, opts->buffer_size);
(gdb) s
pv_state_target_buffer_size_set (state=0x8003b6d0, val=0) at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:127
127             state->target_buffer_size = val;
(gdb) s
128     };
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:177
177             pv_state_size_set(state, opts->size);
(gdb) s
pv_state_size_set (state=0x8003b6d0, val=0) at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:131
131             state->size = val;
(gdb) s
132     };
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:178
178             pv_state_name_set(state, opts->name);
(gdb) s
pv_state_name_set (state=0x8003b6d0, val=0x0) at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:147
147             state->name = val;
(gdb) s
148     };
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:179
179             pv_state_format_string_set(state, opts->format);
(gdb) s
pv_state_format_string_set (state=0x8003b6d0, val=0x0) at 
/usr/src/debug/pv-1.4.0-1/src/pv/state.c:151
151             state->format_string = val;
(gdb) s
152     };
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:181
181             pv_state_set_format(state, opts->progress, opts->timer, 
opts->eta,
(gdb) s
pv_state_set_format (state=0x8003b6d0, progress=1 '\001', timer=1 '\001', eta=0 
'\000', rate=1 '\001', average_rate=0 '\000', bytes=1 '\001', name=0x0)
    at /usr/src/debug/pv-1.4.0-1/src/pv/state.c:67
67      {
(gdb) s
74              state->default_format[0] = 0;
(gdb) s
67      {
(gdb) s
75              PV_ADDFORMAT(name, "%N");
(gdb) s
76              PV_ADDFORMAT(bytes, "%b");
(gdb) s
77              PV_ADDFORMAT(timer, "%t");
(gdb) s
78              PV_ADDFORMAT(rate, "%r");
(gdb) s
79              PV_ADDFORMAT(average_rate, "%a");
(gdb) s
80              PV_ADDFORMAT(progress, "%p");
(gdb) s
81              PV_ADDFORMAT(eta, "%e");
(gdb) s
83              state->name = name;
(gdb) s
84              state->reparse_display = 1;
(gdb) s
83              state->name = name;
(gdb) s
85      }
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:202
202             memset(&t, 0, sizeof(t));
(gdb) s
203             tcgetattr(STDERR_FILENO, &t);
(gdb) s
204             t_save = t;
(gdb) s
206             tcsetattr(STDERR_FILENO, TCSANOW, &t);
(gdb) s
204             t_save = t;
(gdb) s
206             tcsetattr(STDERR_FILENO, TCSANOW, &t);
(gdb) s
204             t_save = t;
(gdb) s
205             t.c_lflag |= TOSTOP;
(gdb) s
204             t_save = t;
(gdb) s
206             tcsetattr(STDERR_FILENO, TCSANOW, &t);
(gdb) s
208             pv_sig_init(state);
(gdb) s
pv_sig_init (state=0x8003b6d0) at /usr/src/debug/pv-1.4.0-1/src/pv/signal.c:135
135     {
(gdb) s
151             sigemptyset(&(sa.sa_mask));
(gdb) s
150             sa.sa_handler = SIG_IGN;
(gdb) s
151             sigemptyset(&(sa.sa_mask));
(gdb) s
140             pv_sig_state->pv_sig_old_stderr = -1;
(gdb) s
141             pv_sig_state->pv_sig_tstp_time.tv_sec = 0;
(gdb) s
142             pv_sig_state->pv_sig_tstp_time.tv_usec = 0;
(gdb) s
143             pv_sig_state->pv_sig_toffset.tv_sec = 0;
(gdb) s
144             pv_sig_state->pv_sig_toffset.tv_usec = 0;
(gdb) s
138             pv_sig_state = state;
(gdb) s
151             sigemptyset(&(sa.sa_mask));
(gdb) s
153             sigaction(SIGPIPE, &sa, &(pv_sig_state->pv_sig_old_sigpipe));
(gdb) s
152             sa.sa_flags = 0;
(gdb) s
153             sigaction(SIGPIPE, &sa, &(pv_sig_state->pv_sig_old_sigpipe));
(gdb) s
160             sigemptyset(&(sa.sa_mask));
(gdb) s
159             sa.sa_handler = pv_sig_ttou;
(gdb) s
160             sigemptyset(&(sa.sa_mask));
(gdb) s
162             sigaction(SIGTTOU, &sa, &(pv_sig_state->pv_sig_old_sigttou));
(gdb) s
161             sa.sa_flags = 0;
(gdb) s
162             sigaction(SIGTTOU, &sa, &(pv_sig_state->pv_sig_old_sigttou));
(gdb) s
169             sigemptyset(&(sa.sa_mask));
(gdb) s
168             sa.sa_handler = pv_sig_tstp;
(gdb) s
169             sigemptyset(&(sa.sa_mask));
(gdb) s
171             sigaction(SIGTSTP, &sa, &(pv_sig_state->pv_sig_old_sigtstp));
(gdb) s
170             sa.sa_flags = 0;
(gdb) s
171             sigaction(SIGTSTP, &sa, &(pv_sig_state->pv_sig_old_sigtstp));
(gdb) s
179             sigemptyset(&(sa.sa_mask));
(gdb) s
178             sa.sa_handler = pv_sig_cont;
(gdb) s
179             sigemptyset(&(sa.sa_mask));
(gdb) s
181             sigaction(SIGCONT, &sa, &(pv_sig_state->pv_sig_old_sigcont));
(gdb) s
180             sa.sa_flags = 0;
(gdb) s
181             sigaction(SIGCONT, &sa, &(pv_sig_state->pv_sig_old_sigcont));
(gdb) s
188             sigemptyset(&(sa.sa_mask));
(gdb) s
187             sa.sa_handler = pv_sig_winch;
(gdb) s
188             sigemptyset(&(sa.sa_mask));
(gdb) s
190             sigaction(SIGWINCH, &sa, &(pv_sig_state->pv_sig_old_sigwinch));
(gdb) s
189             sa.sa_flags = 0;
(gdb) s
190             sigaction(SIGWINCH, &sa, &(pv_sig_state->pv_sig_old_sigwinch));
(gdb) s
197             sigemptyset(&(sa.sa_mask));
(gdb) s
196             sa.sa_handler = pv_sig_term;
(gdb) s
197             sigemptyset(&(sa.sa_mask));
(gdb) s
199             sigaction(SIGINT, &sa, &(pv_sig_state->pv_sig_old_sigint));
(gdb) s
198             sa.sa_flags = 0;
(gdb) s
199             sigaction(SIGINT, &sa, &(pv_sig_state->pv_sig_old_sigint));
(gdb) s
202             sigemptyset(&(sa.sa_mask));
(gdb) s
201             sa.sa_handler = pv_sig_term;
(gdb) s
202             sigemptyset(&(sa.sa_mask));
(gdb) s
204             sigaction(SIGHUP, &sa, &(pv_sig_state->pv_sig_old_sighup));
(gdb) s
203             sa.sa_flags = 0;
(gdb) s
204             sigaction(SIGHUP, &sa, &(pv_sig_state->pv_sig_old_sighup));
(gdb) s
207             sigemptyset(&(sa.sa_mask));
(gdb) s
206             sa.sa_handler = pv_sig_term;
(gdb) s
207             sigemptyset(&(sa.sa_mask));
(gdb) s
209             sigaction(SIGTERM, &sa, &(pv_sig_state->pv_sig_old_sigterm));
(gdb) s
208             sa.sa_flags = 0;
(gdb) s
209             sigaction(SIGTERM, &sa, &(pv_sig_state->pv_sig_old_sigterm));
(gdb) s
210     }
(gdb) s
main (argc=1, argv=0x28ac60) at /usr/src/debug/pv-1.4.0-1/src/main/main.c:210
210             pv_remote_init();
(gdb) s
pv_remote_init () at /usr/src/debug/pv-1.4.0-1/src/main/remote.c:280
280             remote__msgid = remote__msgget();
(gdb) s
remote__msgget () at /usr/src/debug/pv-1.4.0-1/src/main/remote.c:80
80              return msgget(remote__genkey(), IPC_CREAT | 0600);
(gdb) s
remote__genkey () at /usr/src/debug/pv-1.4.0-1/src/main/remote.c:64
64              uid = geteuid();
(gdb) s
68              key = ftok("/tmp", 'P') | uid;
(gdb) s
64              uid = geteuid();
(gdb) s
68              key = ftok("/tmp", 'P') | uid;
(gdb) s
remote__msgget () at /usr/src/debug/pv-1.4.0-1/src/main/remote.c:80
80              return msgget(remote__genkey(), IPC_CREAT | 0600);
(gdb) s
remote__genkey () at /usr/src/debug/pv-1.4.0-1/src/main/remote.c:68
68              key = ftok("/tmp", 'P') | uid;
(gdb) s
remote__msgget () at /usr/src/debug/pv-1.4.0-1/src/main/remote.c:80
80              return msgget(remote__genkey(), IPC_CREAT | 0600);
(gdb) s

Program received signal SIGSYS, Bad system call.
0x00000000 in ?? ()
(gdb) s
Cannot find bounds of current function
(gdb)

Reply via email to