Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
6a7c4947
Commit
6a7c4947
authored
Oct 05, 2021
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
server: Avoid using getopt_long().
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
5f921c7f
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
114 additions
and
26 deletions
+114
-26
main.c
server/main.c
+114
-26
No files found.
server/main.c
View file @
6a7c4947
...
...
@@ -28,9 +28,6 @@
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#ifdef HAVE_GETOPT_H
# include <getopt.h>
#endif
#include "object.h"
#include "file.h"
...
...
@@ -60,27 +57,11 @@ static void usage( FILE *fh )
fprintf
(
fh
,
"
\n
"
);
}
static
void
parse_args
(
int
argc
,
char
*
argv
[]
)
static
void
option_callback
(
int
optc
,
char
*
optarg
)
{
int
ret
,
optc
;
int
ret
;
static
struct
option
long_options
[]
=
{
{
"debug"
,
2
,
NULL
,
'd'
},
{
"foreground"
,
0
,
NULL
,
'f'
},
{
"help"
,
0
,
NULL
,
'h'
},
{
"kill"
,
2
,
NULL
,
'k'
},
{
"persistent"
,
2
,
NULL
,
'p'
},
{
"version"
,
0
,
NULL
,
'v'
},
{
"wait"
,
0
,
NULL
,
'w'
},
{
NULL
,
0
,
NULL
,
0
}
};
server_argv0
=
argv
[
0
];
while
((
optc
=
getopt_long
(
argc
,
argv
,
"d::fhk::p::vw"
,
long_options
,
NULL
))
!=
-
1
)
{
switch
(
optc
)
switch
(
optc
)
{
case
'd'
:
if
(
optarg
&&
isdigit
(
*
optarg
))
...
...
@@ -113,11 +94,117 @@ static void parse_args( int argc, char *argv[] )
case
'w'
:
wait_for_lock
();
exit
(
0
);
default:
usage
(
stderr
);
exit
(
1
);
}
}
/* command-line option parsing */
/* partly based on the GLibc getopt() implementation */
static
struct
long_option
{
const
char
*
name
;
int
has_arg
;
int
val
;
}
long_options
[]
=
{
{
"debug"
,
2
,
'd'
},
{
"foreground"
,
0
,
'f'
},
{
"help"
,
0
,
'h'
},
{
"kill"
,
2
,
'k'
},
{
"persistent"
,
2
,
'p'
},
{
"version"
,
0
,
'v'
},
{
"wait"
,
0
,
'w'
},
{
NULL
}
};
static
void
parse_options
(
int
argc
,
char
**
argv
,
const
char
*
short_opts
,
const
struct
long_option
*
long_opts
,
void
(
*
callback
)(
int
,
char
*
)
)
{
const
char
*
flag
;
char
*
start
,
*
end
;
int
i
;
for
(
i
=
1
;
i
<
argc
;
i
++
)
{
if
(
argv
[
i
][
0
]
!=
'-'
||
!
argv
[
i
][
1
])
/* not an option */
continue
;
if
(
!
strcmp
(
argv
[
i
],
"--"
))
break
;
start
=
argv
[
i
]
+
1
+
(
argv
[
i
][
1
]
==
'-'
);
if
(
argv
[
i
][
1
]
==
'-'
)
{
/* handle long option */
const
struct
long_option
*
opt
,
*
found
=
NULL
;
int
count
=
0
;
if
(
!
(
end
=
strchr
(
start
,
'='
)))
end
=
start
+
strlen
(
start
);
for
(
opt
=
long_opts
;
opt
&&
opt
->
name
;
opt
++
)
{
if
(
strncmp
(
opt
->
name
,
start
,
end
-
start
))
continue
;
if
(
!
opt
->
name
[
end
-
start
])
/* exact match */
{
found
=
opt
;
count
=
1
;
break
;
}
if
(
!
found
)
{
found
=
opt
;
count
++
;
}
else
if
(
found
->
has_arg
!=
opt
->
has_arg
||
found
->
val
!=
opt
->
val
)
{
count
++
;
}
}
if
(
count
>
1
)
goto
error
;
if
(
found
)
{
if
(
*
end
)
{
if
(
!
found
->
has_arg
)
goto
error
;
end
++
;
/* skip '=' */
}
else
if
(
found
->
has_arg
==
1
)
{
if
(
i
==
argc
-
1
)
goto
error
;
end
=
argv
[
++
i
];
}
else
end
=
NULL
;
callback
(
found
->
val
,
end
);
continue
;
}
goto
error
;
}
/* handle short option */
for
(
;
*
start
;
start
++
)
{
if
(
!
(
flag
=
strchr
(
short_opts
,
*
start
)))
goto
error
;
if
(
flag
[
1
]
==
':'
)
{
end
=
start
+
1
;
if
(
!*
end
)
end
=
NULL
;
if
(
flag
[
2
]
!=
':'
&&
!
end
)
{
if
(
i
==
argc
-
1
)
goto
error
;
end
=
argv
[
++
i
];
}
callback
(
*
start
,
end
);
break
;
}
callback
(
*
start
,
NULL
);
}
}
return
;
error:
usage
(
stderr
);
exit
(
1
);
}
static
void
sigterm_handler
(
int
signum
)
...
...
@@ -128,7 +215,8 @@ static void sigterm_handler( int signum )
int
main
(
int
argc
,
char
*
argv
[]
)
{
setvbuf
(
stderr
,
NULL
,
_IOLBF
,
0
);
parse_args
(
argc
,
argv
);
server_argv0
=
argv
[
0
];
parse_options
(
argc
,
argv
,
"d::fhk::p::vw"
,
long_options
,
option_callback
);
/* setup temporary handlers before the real signal initialization is done */
signal
(
SIGPIPE
,
SIG_IGN
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment