d547b47b70431ccc403d626c9abaa8f8a7fb0565
[openafs.git] / src / uss / uss_common.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  *
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /*
11  *      Storage for common variables employed by the AFS user
12  *      account facility.
13  */
14
15 /*
16  * --------------------- Required definitions ---------------------
17  */
18 #include <afsconfig.h>
19 #include <afs/param.h>
20
21 #include <roken.h>
22
23 #include <afs/kautils.h>        /*MAXKTCREALMLEN & MAXKTCNAMELEN */
24
25 #include "uss_common.h"         /*Interface definitions */
26
27 /*
28  * ---------------------- Exported variables ----------------------
29  */
30 #define uss_AutoLen     300
31 #define uss_NumVars      10
32
33 char uss_User[uss_UserLen + 1]; /*User's account name */
34 char uss_Uid[uss_UidLen + 1];   /*User's uid */
35 char uss_Server[uss_ServerLen + 1];     /*FileServer hosting user's volume */
36 char uss_Partition[uss_PartitionLen + 1];       /*FileServer partition for above */
37 char uss_MountPoint[uss_MountPointLen + 1];     /*Mountpoint for user's volume */
38 char uss_RealName[uss_RealNameLen + 1]; /*User's full name */
39 char uss_Pwd[uss_PwdLen + 1];   /*User password */
40 char uss_PwdPath[uss_PwdPathLen + 1];   /*Curr pathname to password file */
41 char uss_PwdFormat[uss_PwdFormatLen + 1];       /*Curr password entry format */
42 char uss_RestoreDir[uss_RestoreDirLen + 1];     /*Curr directory for restore info */
43 char uss_Auto[uss_AutoLen + 1]; /*Curr choice of AUTO value */
44 char uss_Var[uss_NumVars][uss_MAX_ARG_SIZE];    /*$1, $2, ... command variables */
45 int uss_VarMax = 0;             /*Largest index in above */
46 char uss_Volume[uss_VolumeLen + 1];     /*Name of user's volume */
47 afs_int32 uss_VolumeID;         /*Numerical volume ID */
48 afs_int32 uss_ServerID;         /*Numerical server ID */
49 afs_int32 uss_PartitionID;      /*Numerical partition ID */
50 char uss_DirPool[100][uss_DirPoolLen];  /*List of all acceptable subdirs */
51
52
53 /*
54  * Values saved across invocations.
55  */
56 char uss_PwdPath_Saved[uss_PwdPathLen]; /*Pathname to saved pwd file */
57 char uss_PwdFormat_Saved[uss_PwdFormatLen];     /*Saved pwd entry format */
58 char uss_RestoreDir_Saved[uss_RestoreDirLen];   /*Saved dir for restore info */
59
60 int uss_NumGroups = 0;          /*Number of $AUTO entries */
61 int uss_SaveVolume;             /*Save current user volume? */
62 int uss_SaveVolume_Saved;       /*Saved value of above */
63 int uss_DryRun = 0;             /*Is this a dry run? */
64 int uss_SkipKaserver = 0;       /*Don't talk to kaserver */
65 int uss_Overwrite = 0;          /*Overwrite user files? */
66 int uss_OverwriteThisOne;       /*Overwrite on this pass? */
67 char uss_Administrator[64];     /*Name of admin account */
68 char uss_AccountCreator[MAXKTCNAMELEN]; /*Principal running this program */
69 afs_int32 uss_DesiredUID;       /*Uid to assign the user */
70 afs_int32 uss_Expires;          /*How long between password expires */
71 char uss_Cell[MAXKTCREALMLEN];  /*Cell in which account lives */
72 char uss_ConfDir[uss_PATH_SIZE];        /*Config directory */
73 int uss_verbose = 0;            /*Are we being verbose? */
74 int uss_ignoreFlag = 0;         /*Ignore yyparse errors? */
75 int uss_perr = 0;
76 char uss_whoami[64];            /*Program name used */
77 int uss_syntax_err = 0;         /*YACC syntax error? */
78 struct uss_subdir *uss_currentDir = NULL;       /*Current directory */
79
80
81 /*
82  * ----------------------- Private variables ----------------------
83  */
84 static int initDone = 0;        /*Have we been initialized? */
85
86
87 /*------------------------------------------------------------------------
88  * EXPORTED uss_common_Init
89  *
90  * Description:
91  *      Set up various common uss variables, especially the saved ones.
92  *
93  * Arguments:
94  *      None.
95  *
96  * Returns:
97  *      Nothing.
98  *
99  * Environment:
100  *      We only allow an initialization once.
101  *
102  * Side Effects:
103  *      As advertised.
104  *------------------------------------------------------------------------*/
105
106 void
107 uss_common_Init(void)
108 {                               /*uss_common_Init */
109
110     extern int line;            /*Current template line */
111
112     if (initDone)
113         return;
114
115     strcpy(uss_ConfDir, AFSDIR_CLIENT_ETC_DIRPATH);
116     uss_PwdPath_Saved[0] = '\0';
117     uss_PwdFormat_Saved[0] = '\0';
118     uss_RestoreDir_Saved[0] = '\0';
119     uss_SaveVolume_Saved = 0;
120     uss_syntax_err = 0;
121     line = 1;
122
123 }                               /*uss_common_Init */
124
125
126 /*------------------------------------------------------------------------
127  * EXPORTED uss_common_Reset
128  *
129  * Description:
130  *      Resets some of the common variables to their idle or
131  *      saved states.
132  *
133  * Arguments:
134  *      None.
135  *
136  * Returns:
137  *      Nothing.
138  *
139  * Environment:
140  *      Nothing interesting.
141  *
142  * Side Effects:
143  *      As advertised.
144  *------------------------------------------------------------------------*/
145
146 void
147 uss_common_Reset(void)
148 {                               /*uss_common_Reset */
149
150     extern int line;            /*Current template line */
151     int i;                      /*Loop variable */
152
153     uss_ignoreFlag = 0;
154     uss_NumGroups = 0;
155     uss_perr = 0;
156     uss_currentDir = NULL;
157     uss_DesiredUID = 0;
158     uss_VarMax = 0;
159     uss_User[0] = '\0';
160     uss_Uid[0] = '\0';
161     uss_Server[0] = '\0';
162     uss_Partition[0] = '\0';
163     uss_MountPoint[0] = '\0';
164     uss_RealName[0] = '\0';
165     sprintf(uss_Pwd, "%s", uss_DEFAULT_PASSWORD);
166     strcpy(uss_PwdPath, uss_PwdPath_Saved);
167     strcpy(uss_PwdFormat, uss_PwdFormat_Saved);
168     strcpy(uss_RestoreDir, uss_RestoreDir_Saved);
169     uss_SaveVolume = uss_SaveVolume_Saved;
170     uss_Auto[0] = '\0';
171     for (i = 1; i < 10; i++)
172         uss_Var[i][0] = '\0';
173
174     /*
175      * Reset the template line you think you're reading from, and
176      * remember you haven't seen any template file parsing errors
177      * on this run yet.
178      */
179     line = 1;
180     uss_syntax_err = 0;
181
182 }                               /*uss_common_Reset */
183
184
185 /*------------------------------------------------------------------------
186  * EXPORTED uss_common_FieldCp
187  *
188  * Environment:
189  *      Nothing interesting.
190  *
191  * Side Effects:
192  *      As advertised.
193  *------------------------------------------------------------------------*/
194
195 char *
196 uss_common_FieldCp(char *a_to, char *a_from, char a_separator,
197                    int a_maxChars, int *a_overflowP)
198 {                               /*uss_common_FieldCp */
199
200     int chars_read;     /*Number of chars read so far */
201
202     chars_read = 0;
203     *a_overflowP = 0;
204     /*
205      * It's OK to read in the separator/null after reading a_maxChars,
206      * so we need to bump a_maxChars by one.
207      */
208     a_maxChars++;
209
210     while (*a_from != a_separator && *a_from != '\0' && *a_from != '\n') {
211         *a_to++ = *a_from++;
212         if (++chars_read >= a_maxChars) {
213             /*
214              * Bummer, we've overflowed.  Remember the sad fact, and
215              * move the destination pointer back over the extra
216              * character.  Also, skip over any garbage sitting after
217              * the characters that won't fit in to the given field.
218              */
219             *a_overflowP = 1;
220             a_to--;
221 #if 0
222             printf("*** Skipping overflow char '%c'\n", *(a_from - 1));
223 #endif /* 0 */
224             while (*a_from != a_separator && *a_from != '\0'
225                    && *a_from != '\n') {
226 #if 0
227                 printf("*** Skipping overflow char '%c'\n", *a_from);
228 #endif /* 0 */
229                 a_from++;
230             }                   /*Skip over excess chars */
231             break;
232         }                       /*Found overflow */
233     }                           /*Read til end of field */
234
235     /*
236      * Make sure we return a null-terminated string.
237      */
238     *a_to = '\0';
239
240     /*
241      * Collapse any number of blanks, should we have ended up pointing
242      * to one.
243      */
244     if (a_separator == ' ')
245         while ((*a_from == ' ') && (*(a_from + 1) == ' '))
246             a_from++;
247
248     /*
249      * Return the position of the next non-separator char or
250      * the position of the null, if that's what was left.
251      */
252     if (*a_from == '\0')
253         return (a_from);
254     else
255         return (++a_from);
256
257 }                               /*uss_common_FieldCp */