@@ -2590,23 +2590,41 @@ channel_has_readahead(channel_T *channel, int part)
25902590
25912591/*
25922592 * Return a string indicating the status of the channel.
2593+ * If "req_part" is not negative check that part.
25932594 */
25942595 char *
2595- channel_status (channel_T * channel )
2596+ channel_status (channel_T * channel , int req_part )
25962597{
25972598 int part ;
25982599 int has_readahead = FALSE;
25992600
26002601 if (channel == NULL )
26012602 return "fail" ;
2602- if (channel_is_open ( channel ) )
2603- return "open" ;
2604- for ( part = PART_SOCK ; part <= PART_ERR ; ++ part )
2605- if ( channel_has_readahead ( channel , part ))
2606- {
2603+ if (req_part == PART_OUT )
2604+ {
2605+ if ( channel -> CH_OUT_FD != INVALID_FD )
2606+ return "open" ;
2607+ if ( channel_has_readahead ( channel , PART_OUT ))
26072608 has_readahead = TRUE;
2608- break ;
2609- }
2609+ }
2610+ else if (req_part == PART_ERR )
2611+ {
2612+ if (channel -> CH_ERR_FD != INVALID_FD )
2613+ return "open" ;
2614+ if (channel_has_readahead (channel , PART_ERR ))
2615+ has_readahead = TRUE;
2616+ }
2617+ else
2618+ {
2619+ if (channel_is_open (channel ))
2620+ return "open" ;
2621+ for (part = PART_SOCK ; part <= PART_ERR ; ++ part )
2622+ if (channel_has_readahead (channel , part ))
2623+ {
2624+ has_readahead = TRUE;
2625+ break ;
2626+ }
2627+ }
26102628
26112629 if (has_readahead )
26122630 return "buffered" ;
@@ -2619,15 +2637,21 @@ channel_part_info(channel_T *channel, dict_T *dict, char *name, int part)
26192637 chanpart_T * chanpart = & channel -> ch_part [part ];
26202638 char namebuf [20 ]; /* longest is "sock_timeout" */
26212639 size_t tail ;
2640+ char * status ;
26222641 char * s = "" ;
26232642
26242643 vim_strncpy ((char_u * )namebuf , (char_u * )name , 4 );
26252644 STRCAT (namebuf , "_" );
26262645 tail = STRLEN (namebuf );
26272646
26282647 STRCPY (namebuf + tail , "status" );
2629- dict_add_nr_str (dict , namebuf , 0 ,
2630- (char_u * )(chanpart -> ch_fd == INVALID_FD ? "closed" : "open" ));
2648+ if (chanpart -> ch_fd != INVALID_FD )
2649+ status = "open" ;
2650+ else if (channel_has_readahead (channel , part ))
2651+ status = "buffered" ;
2652+ else
2653+ status = "closed" ;
2654+ dict_add_nr_str (dict , namebuf , 0 , (char_u * )status );
26312655
26322656 STRCPY (namebuf + tail , "mode" );
26332657 switch (chanpart -> ch_mode )
@@ -2660,7 +2684,7 @@ channel_part_info(channel_T *channel, dict_T *dict, char *name, int part)
26602684channel_info (channel_T * channel , dict_T * dict )
26612685{
26622686 dict_add_nr_str (dict , "id" , channel -> ch_id , NULL );
2663- dict_add_nr_str (dict , "status" , 0 , (char_u * )channel_status (channel ));
2687+ dict_add_nr_str (dict , "status" , 0 , (char_u * )channel_status (channel , -1 ));
26642688
26652689 if (channel -> ch_hostname != NULL )
26662690 {
@@ -4244,6 +4268,8 @@ get_job_options(typval_T *tv, jobopt_T *opt, int supported)
42444268 val = get_tv_string (item );
42454269 if (STRCMP (val , "err" ) == 0 )
42464270 opt -> jo_part = PART_ERR ;
4271+ else if (STRCMP (val , "out" ) == 0 )
4272+ opt -> jo_part = PART_OUT ;
42474273 else
42484274 {
42494275 EMSG2 (_ (e_invarg2 ), val );
0 commit comments