@@ -2611,23 +2611,41 @@ channel_has_readahead(channel_T *channel, int part)
26112611
26122612/*
26132613 * Return a string indicating the status of the channel.
2614+ * If "req_part" is not negative check that part.
26142615 */
26152616 char *
2616- channel_status (channel_T * channel )
2617+ channel_status (channel_T * channel , int req_part )
26172618{
26182619 int part ;
26192620 int has_readahead = FALSE;
26202621
26212622 if (channel == NULL )
26222623 return "fail" ;
2623- if (channel_is_open ( channel ) )
2624- return "open" ;
2625- for ( part = PART_SOCK ; part <= PART_ERR ; ++ part )
2626- if ( channel_has_readahead ( channel , part ))
2627- {
2624+ if (req_part == PART_OUT )
2625+ {
2626+ if ( channel -> CH_OUT_FD != INVALID_FD )
2627+ return "open" ;
2628+ if ( channel_has_readahead ( channel , PART_OUT ))
26282629 has_readahead = TRUE;
2629- break ;
2630- }
2630+ }
2631+ else if (req_part == PART_ERR )
2632+ {
2633+ if (channel -> CH_ERR_FD != INVALID_FD )
2634+ return "open" ;
2635+ if (channel_has_readahead (channel , PART_ERR ))
2636+ has_readahead = TRUE;
2637+ }
2638+ else
2639+ {
2640+ if (channel_is_open (channel ))
2641+ return "open" ;
2642+ for (part = PART_SOCK ; part <= PART_ERR ; ++ part )
2643+ if (channel_has_readahead (channel , part ))
2644+ {
2645+ has_readahead = TRUE;
2646+ break ;
2647+ }
2648+ }
26312649
26322650 if (has_readahead )
26332651 return "buffered" ;
@@ -2640,15 +2658,21 @@ channel_part_info(channel_T *channel, dict_T *dict, char *name, int part)
26402658 chanpart_T * chanpart = & channel -> ch_part [part ];
26412659 char namebuf [20 ]; /* longest is "sock_timeout" */
26422660 size_t tail ;
2661+ char * status ;
26432662 char * s = "" ;
26442663
26452664 vim_strncpy ((char_u * )namebuf , (char_u * )name , 4 );
26462665 STRCAT (namebuf , "_" );
26472666 tail = STRLEN (namebuf );
26482667
26492668 STRCPY (namebuf + tail , "status" );
2650- dict_add_nr_str (dict , namebuf , 0 ,
2651- (char_u * )(chanpart -> ch_fd == INVALID_FD ? "closed" : "open" ));
2669+ if (chanpart -> ch_fd != INVALID_FD )
2670+ status = "open" ;
2671+ else if (channel_has_readahead (channel , part ))
2672+ status = "buffered" ;
2673+ else
2674+ status = "closed" ;
2675+ dict_add_nr_str (dict , namebuf , 0 , (char_u * )status );
26522676
26532677 STRCPY (namebuf + tail , "mode" );
26542678 switch (chanpart -> ch_mode )
@@ -2681,7 +2705,7 @@ channel_part_info(channel_T *channel, dict_T *dict, char *name, int part)
26812705channel_info (channel_T * channel , dict_T * dict )
26822706{
26832707 dict_add_nr_str (dict , "id" , channel -> ch_id , NULL );
2684- dict_add_nr_str (dict , "status" , 0 , (char_u * )channel_status (channel ));
2708+ dict_add_nr_str (dict , "status" , 0 , (char_u * )channel_status (channel , -1 ));
26852709
26862710 if (channel -> ch_hostname != NULL )
26872711 {
@@ -4269,6 +4293,8 @@ get_job_options(typval_T *tv, jobopt_T *opt, int supported)
42694293 val = get_tv_string (item );
42704294 if (STRCMP (val , "err" ) == 0 )
42714295 opt -> jo_part = PART_ERR ;
4296+ else if (STRCMP (val , "out" ) == 0 )
4297+ opt -> jo_part = PART_OUT ;
42724298 else
42734299 {
42744300 EMSG2 (_ (e_invarg2 ), val );
0 commit comments