2020-01-18 11:38:21 +03:00
/*
* Copyright ( c ) 2018 - 2020 , Andreas Kling < kling @ serenityos . org >
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
*
* 1. Redistributions of source code must retain the above copyright notice , this
* list of conditions and the following disclaimer .
*
* 2. Redistributions in binary form must reproduce the above copyright notice ,
* this list of conditions and the following disclaimer in the documentation
* and / or other materials provided with the distribution .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS "
* AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
* DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY ,
* OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
2019-09-06 16:34:26 +03:00
# include <AK/String.h>
2019-05-16 19:47:47 +03:00
# include <AK/HashMap.h>
2019-06-07 12:49:31 +03:00
# include <AK/Vector.h>
# include <LibCore/CArgsParser.h>
# include <LibCore/CProcessStatisticsReader.h>
# include <signal.h>
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
2019-05-13 15:31:23 +03:00
static int pid_of ( const String & process_name , bool single_shot , bool omit_pid , pid_t pid )
{
bool displayed_at_least_one = false ;
2019-07-10 14:56:28 +03:00
auto processes = CProcessStatisticsReader ( ) . get_all ( ) ;
2019-06-07 12:49:31 +03:00
2019-05-16 19:47:47 +03:00
for ( auto & it : processes ) {
2019-06-07 12:49:31 +03:00
if ( it . value . name = = process_name ) {
2019-08-01 12:07:44 +03:00
if ( ! omit_pid | | it . value . pid ! = pid ) {
2019-05-16 19:47:47 +03:00
printf ( " %d " , it . value . pid ) ;
displayed_at_least_one = true ;
2019-05-13 15:31:23 +03:00
2019-05-16 19:47:47 +03:00
if ( single_shot )
break ;
}
}
2019-05-13 15:31:23 +03:00
}
if ( displayed_at_least_one )
2019-05-16 19:47:47 +03:00
printf ( " \n " ) ;
2019-05-13 15:31:23 +03:00
return 0 ;
}
int main ( int argc , char * * argv )
{
2019-05-17 16:35:30 +03:00
CArgsParser args_parser ( " pidof " ) ;
2019-05-17 13:51:44 +03:00
args_parser . add_arg ( " s " , " Single shot - this instructs the program to only return one pid " ) ;
args_parser . add_arg ( " o " , " pid " , " Tells pidof to omit processes with that pid. The special pid %PPID can be used to name the parent process of the pidof program. " ) ;
2019-06-22 16:47:08 +03:00
CArgsParserResult args = args_parser . parse ( argc , argv ) ;
2019-06-07 12:49:31 +03:00
2019-05-13 15:31:23 +03:00
bool s_arg = args . is_present ( " s " ) ;
bool o_arg = args . is_present ( " o " ) ;
pid_t pid = 0 ;
2019-06-07 12:49:31 +03:00
2019-05-13 15:31:23 +03:00
if ( o_arg ) {
bool ok = false ;
String pid_str = args . get ( " o " ) ;
2019-05-16 19:47:47 +03:00
if ( pid_str = = " %PPID " )
pid = getppid ( ) ;
else
pid = pid_str . to_uint ( ok ) ;
2019-05-13 15:31:23 +03:00
}
2019-06-07 12:49:31 +03:00
2019-05-13 15:31:23 +03:00
// We should have one single value : the process name
Vector < String > values = args . get_single_values ( ) ;
if ( values . size ( ) = = 0 ) {
2019-05-16 19:47:47 +03:00
args_parser . print_usage ( ) ;
2019-05-13 15:31:23 +03:00
return 0 ;
}
2019-06-07 12:49:31 +03:00
2019-05-13 15:31:23 +03:00
return pid_of ( values [ 0 ] , s_arg , o_arg , pid ) ;
}