-
Notifications
You must be signed in to change notification settings - Fork 1
/
internes.c
101 lines (90 loc) · 3.14 KB
/
internes.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*--------------------------------------------------------------------------
* headers à inclure afin de pouvoir utiliser divers appels systèmes
* -----------------------------------------------------------------------*/
#include <stdio.h> // pour printf and co
#include <stdlib.h> // pour getenv et exit
#include <string.h> // pour avoir strcmp and co
#include <signal.h> // pour SIG*
#include <errno.h> // pour errno and co
/*--------------------------------------------------------------------------
* headers à inclure pour les constantes et types spéciaux
* -----------------------------------------------------------------------*/
#include "mini_shell.h"
/*--------------------------------------------------------------------------
* headers à inclure pour la gestion des jobs
* -----------------------------------------------------------------------*/
#include "jobs.h"
#include "internes.h"
/*--------------------------------------------------------------------------
* change directory
* -----------------------------------------------------------------------*/
static int mon_cd(char *rep)
{
/*
char* dest = (strcmp(rep,"")<=0?getenv("HOME"):rep); // Si rep est null alors HOME sinon rep
chdir(dest);
*/
if (rep==NULL)
chdir(getenv("HOME"));
else
chdir(rep);
return 1;
}
/*--------------------------------------------------------------------------
* affiche la ligne de commande
* -----------------------------------------------------------------------*/
static int mon_echo(char **mots)
{
for (int m=1; m<NB_MAX_MOTS && mots[m]; m++)
printf("%s",mots[m]);
printf("\n");
return 1;
}
/*--------------------------------------------------------------------------
* kill un job : exemple d'utilisation de action_job().
* ne sera réellement utile que dans la version multi-jobs.
* -----------------------------------------------------------------------*/
static int mon_kill(char *numero, job_set_t *mes_jobs)
{
int j_k=-2;
// si commande sans argument : erreur
if (! numero)
{
printf("Usage kill <numero de job à terminer>\n");
return 1;
}
// interprétation de l'argument comme un numéro de job
j_k=atoi(numero);
if (j_k>=NB_MAX_JOBS || mes_jobs->jobs[j_k].pids[0]==-2 )
printf ("Le job %i n'existe pas\n",j_k);
else
action_job(j_k,mes_jobs->jobs[j_k],SIGKILL,NULL);
return 1;
}
/*--------------------------------------------------------------------------
* exécute la commande selon une commande interne si elle existe
* -----------------------------------------------------------------------*/
int commande_interne(ligne_analysee_t *ligne_analysee, job_set_t *mes_jobs)
{
if (! ligne_analysee->commandes[0][0]) // commande vide
{
return 1;
}
else
if (! strcmp(ligne_analysee->commandes[0][0],"cd") )
{
return mon_cd(ligne_analysee->commandes[0][1]);
}
else
if (! strcmp(ligne_analysee->commandes[0][0],"mon_echo") )
{
return mon_echo(ligne_analysee->commandes[0]);
}
else
if (! strcmp(ligne_analysee->commandes[0][0],"kill-job") )
{
return mon_kill(ligne_analysee->commandes[0][1], mes_jobs);
}
else
return 0;
}